Me pregunto cuál es la precisión del SELECT DISTINCT
operador en una geometría PostGIS. En mi sistema, la siguiente consulta me da un recuento de 5, lo que significa que los puntos insertados se consideran iguales si difieren en menos de 1e-5 y no estoy seguro de si esa es una característica de PostGIS, un problema de mi instalación o un error
¿Alguien sabe si ese es el comportamiento esperado?
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)
Estoy usando:
$ psql --version
psql (PostgreSQL) 9.3.1
y
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
en OSX 10.9
__equals
filtro allí, que se traduce en la función ST_Equals, creo.SELECT DISTINCT ST_AsBinary(geom)
? Eso da una representación binaria degeom
como resultado. Podría hacerloSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
(creo queMAX()
se requiere una función agregada comoSELECT
porque laGROUP BY
cláusula está utilizando laST_AsBinary()
función return, no el campo en sí). ¿Se ve bien?Dada la excelente explicación de Paul Ramsey de por qué la siguiente pregunta es qué se puede hacer al respecto. ¿Cómo funciona
SELECT DISTINCT
en los campos de geometría y hace que funcione como se espera?En la respuesta de Paul, propuse usar
SELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
peroMAX()
es lento, aparentemente requiere un escaneo de tabla.En cambio, encontré que esto es más rápido:
fuente
Solo una actualización, para PostGIS 2.4,
SELECT DISTINCT
funciona correctamente para los datos de puntos en el OP:Y
fuente