Ich frage mich, wie hoch die Präzision des SELECT DISTINCT
Operators in einer PostGIS-Geometrie ist. Auf meinem System gibt die folgende Abfrage eine Anzahl von 5 an, was bedeutet, dass die eingefügten Punkte als gleich angesehen werden, wenn sie sich um weniger als 1e-5 unterscheiden, und ich bin nicht sicher, ob dies eine Funktion von PostGIS ist, ein Problem meiner Installation oder ein Bug.
Weiß jemand, ob das das erwartete Verhalten ist?
CREATE TEMP TABLE test (geom geometry);
INSERT INTO test
VALUES
(St_GeomFromText('POINT (0.1 0.1)')),
(St_GeomFromText('POINT (0.001 0.001)')),
(St_GeomFromText('POINT (0.0001 0.0001)')),
(St_GeomFromText('POINT (0.00001 0.00001)')),
(St_GeomFromText('POINT (0.000001 0.000001)')),
(St_GeomFromText('POINT (0.0000001 0.0000001)')),
(St_GeomFromText('POINT (0.00000001 0.00000001)')),
(St_GeomFromText('POINT (0.000000001 0.000000001)'));
SELECT COUNT(*) FROM (SELECT DISTINCT geom FROM test) AS test;
count
-------
5
(1 row)
Ich benutze:
$ psql --version
psql (PostgreSQL) 9.3.1
und
SELECT PostGIS_full_version();
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
POSTGIS="2.1.1 r12113" GEOS="3.4.2-CAPI-1.8.2 r3921" PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.10.1, released 2013/08/26" LIBXML="2.7.3" LIBJSON="UNKNOWN" RASTER
unter OSX 10.9
__equals
Filter, der meiner Meinung nach in die Funktion ST_Equals übersetzt wird.SELECT DISTINCT ST_AsBinary(geom)
? Das ergibt eine binäre Darstellung vongeom
als Ergebnis. Das könnten Sie tunSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
(ich denke, eine Aggregatfunktion wieMAX()
in der ist erforderlich,SELECT
weil dieGROUP BY
Klausel dieST_AsBinary()
Funktion return verwendet, nicht das Feld selbst.) Sieht das gut aus?Angesichts der hervorragenden Erklärung von Paul Ramsey, warum die nächste Frage lautet, was dagegen getan werden kann. Wie gehen Sie
SELECT DISTINCT
mit Geometriefeldern um und lassen Sie diese wie erwartet ausführen?In der Antwort von Paul schlug ich vor, zu verwenden
SELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
,MAX()
ist aber langsam und erfordert anscheinend einen Tabellenscan.Stattdessen fand ich das schneller:
quelle
Nur ein Update für PostGIS 2.4
SELECT DISTINCT
funktioniert korrekt für die Punktedaten im OP:Und
quelle