Интересно, какова точность SELECT DISTINCT
оператора в геометрии PostGIS. В моей системе следующий запрос дает мне счет 5, что означает, что вставленные точки считаются равными, если они отличаются менее чем на 1e-5, и я не уверен, является ли это функцией PostGIS, проблема моей установки или ошибка.
Кто-нибудь знает, является ли это ожидаемым поведением?
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)
Я использую:
$ psql --version
psql (PostgreSQL) 9.3.1
и
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
на OSX 10.9
__equals
фильтр, который, как мне кажется, переводится в функцию ST_Equals.SELECT DISTINCT ST_AsBinary(geom)
? Это дает двоичное представлениеgeom
как результат. Вы могли бы сделатьSELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
(я думаю, что агрегатная функция, какMAX()
требуется, в выраженииSELECT
потому, что вGROUP BY
предложении используетсяST_AsBinary()
функция return, а не само поле.) Это выглядит хорошо?Учитывая превосходное объяснение Пола Рэмси, почему следующий вопрос - что с этим можно сделать. Как вы работаете
SELECT DISTINCT
с геометрическими полями и работаете ли вы так, как ожидаете?В ответе Пола я предложил использовать,
SELECT MAX(geom) FROM the_table GROUP BY ST_AsBinary(geom);
ноMAX()
медленно, по-видимому, требуя сканирования таблицы.Вместо этого я обнаружил, что это быстрее:
источник
Просто обновление для PostGIS 2.4
SELECT DISTINCT
работает правильно для данных точек в OP:И
источник