Gostaria de saber qual é a precisão do SELECT DISTINCT
operador em uma geometria PostGIS. No meu sistema, a consulta a seguir fornece uma contagem de 5, o que significa que os pontos inseridos são considerados iguais se diferirem em menos de 1e-5 e não tenho certeza se isso é um recurso do PostGIS, um problema da minha instalação ou um bug.
Alguém sabe se esse é o comportamento 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)
Estou usando:
$ psql --version
psql (PostgreSQL) 9.3.1
e
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
no OSX 10.9
__equals
filtro, que se traduz na função ST_Equals que eu acho.SELECT DISTINCT ST_AsBinary(geom)
? Isso fornece uma representação binária degeom
como resultado. Você poderia fazerSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
(acho que uma função agregada comoMAX()
é necessária noSELECT
porque aGROUP BY
cláusula está usando oST_AsBinary()
retorno da função, não o próprio campo.) Isso parece bom?Dada a excelente explicação de Paul Ramsey sobre por que a próxima pergunta é o que pode ser feito sobre isso. Como você trabalha
SELECT DISTINCT
nos campos geométricos e faz com que ele funcione conforme o esperado?Na resposta de Paul, propus usar
SELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
masMAX()
é lento, aparentemente exigindo uma varredura de tabela.Em vez disso, achei mais rápido:
fonte
Apenas uma atualização, para o PostGIS 2.4,
SELECT DISTINCT
funciona corretamente para os dados de pontos no OP:E
fonte