Saya ingin tahu apa ketepatan SELECT DISTINCT
operator pada geometri PostGIS. Pada sistem saya, permintaan berikut memberi saya hitungan 5, yang berarti bahwa poin yang dimasukkan dianggap sama jika mereka berbeda kurang dari 1e-5 dan saya tidak yakin apakah itu fitur PostGIS, masalah instalasi saya atau bug.
Adakah yang tahu kalau itu perilaku yang diharapkan?
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)
Saya menggunakan:
$ psql --version
psql (PostgreSQL) 9.3.1
dan
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
pada OSX 10.9
__equals
filter di sana, yang diterjemahkan ke dalam fungsi ST_Equals yang saya pikir.SELECT DISTINCT ST_AsBinary(geom)
? Itu memberikan representasi binergeom
sebagai hasilnya. Anda bisa melakukannyaSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
(saya pikir fungsi agregat sepertiMAX()
diperlukan di dalamSELECT
karenaGROUP BY
klausa menggunakanST_AsBinary()
fungsi return, bukan bidang itu sendiri.) Apakah itu terlihat bagus?Mengingat penjelasan Paul Ramsey yang luar biasa tentang mengapa pertanyaan selanjutnya adalah apa yang dapat dilakukan tentang itu. Bagaimana Anda
SELECT DISTINCT
di bidang geometri dan menjalankannya seperti yang diharapkan?Dalam jawaban Paul, saya mengusulkan menggunakan
SELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
tetapiMAX()
lambat, tampaknya membutuhkan pemindaian tabel.Sebaliknya, saya menemukan ini lebih cepat:
sumber
Hanya pembaruan, untuk PostGIS 2.4,
SELECT DISTINCT
bekerja dengan benar untuk data poin di OP:Dan
sumber