Zastanawiam się, jaka jest precyzja SELECT DISTINCT
operatora w geometrii PostGIS. W moim systemie następujące zapytanie daje mi liczbę 5, co oznacza, że wstawione punkty są uważane za równe, jeśli różnią się o mniej niż 1e-5 i nie jestem pewien, czy jest to cecha PostGIS, problem z moją instalacją lub błąd.
Czy ktoś wie, czy takie jest oczekiwane zachowanie?
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)
Ja używam:
$ psql --version
psql (PostgreSQL) 9.3.1
i
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
w OSX 10.9
__equals
użyję tam filtru, który , jak sądzę , przekłada się na funkcję ST_Equals.SELECT DISTINCT ST_AsBinary(geom)
? To daje binarną reprezentacjęgeom
jako wynik. Mógłbyś zrobićSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
(myślę, że funkcja agregująca takaMAX()
jest wymagana w,SELECT
ponieważGROUP BY
klauzula używaST_AsBinary()
funkcji return, a nie samego pola.) Czy to wygląda dobrze?Biorąc pod uwagę doskonałe wyjaśnienie Paula Ramseya, dlaczego kolejnym pytaniem jest, co można z tym zrobić. Jak radzisz sobie
SELECT DISTINCT
na polach geometrii i czy działa ona zgodnie z oczekiwaniami?W odpowiedzi Paula zaproponowałem użycie,
SELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
aleMAX()
jest powolne, najwyraźniej wymaga skanowania tabeli.Zamiast tego stwierdziłem, że jest to szybsze:
źródło
Tylko aktualizacja dla PostGIS 2.4
SELECT DISTINCT
działa poprawnie dla danych punktów w PO:I
źródło