Me pregunto cuál es la precisión del SELECT DISTINCToperador 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

__equalsfiltro allí, que se traduce en la función ST_Equals, creo.SELECT DISTINCT ST_AsBinary(geom)? Eso da una representación binaria degeomcomo resultado. Podría hacerloSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);(creo queMAX()se requiere una función agregada comoSELECTporque laGROUP BYclá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 DISTINCTen 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 DISTINCTfunciona correctamente para los datos de puntos en el OP:Y
fuente