Je me demande quelle est la précision de l' SELECT DISTINCT
opérateur sur une géométrie PostGIS. Sur mon système, la requête suivante me donne un nombre de 5, ce qui signifie que les points insérés sont considérés comme égaux s'ils diffèrent de moins de 1e-5 et je ne suis pas sûr que ce soit une fonctionnalité de PostGIS, un problème de mon installation ou un bug.
Est-ce que quelqu'un sait si c'est le comportement attendu?
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)
J'utilise:
$ psql --version
psql (PostgreSQL) 9.3.1
et
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
sur OSX 10.9
__equals
filtre là-bas, ce qui se traduit par la fonction ST_Equals je pense.SELECT DISTINCT ST_AsBinary(geom)
? Cela donne une représentation binaire degeom
comme résultat. Vous pouvez le faireSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
(je pense qu'une fonction d'agrégation comme celle-ciMAX()
est requise dans leSELECT
car laGROUP BY
clause utilise laST_AsBinary()
fonction return, pas le champ lui-même.)Étant donné l'excellente explication de Paul Ramsey sur la raison pour laquelle la question suivante est de savoir ce qui peut être fait à ce sujet. Comment faites-vous
SELECT DISTINCT
sur les champs de géométrie et faites-vous fonctionner comme prévu?Dans la réponse de Paul, j'ai proposé d'utiliser
SELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
maisMAX()
est lent, nécessitant apparemment un scan de table.Au lieu de cela, j'ai trouvé que c'était plus rapide:
la source
Juste une mise à jour, pour PostGIS 2.4,
SELECT DISTINCT
fonctionne correctement pour les données de points dans l'OP:Et
la source