Страница 1 из 1

PostGIS удаление дубликатов геометрий

Добавлено: 25 фев 2012, 02:50
oleg
Помогите, пожалуйста, с формированием запроса к таблице и с правильным порядком действий в целом при обработке геометрии средствами PostGIS.

Например, есть задача избавиться от дубликатов геометрии в слое. Выяснил, что для этой цели необходимо использовать функцию ST_HausdorffDistance() со значением "0". Таблица называется, например, "poly_test" с геометрией в “the_geom“. Какой запрос нужно выполнить для получения таблицы без дубликатов? Нужно ли предварительно создать пустую таблицу для результата или можно работать в одной - исходной?

Использую pgAdmin и QGIS - PgQyery, DB Manager, PostGIS Manager. Спасибо.

Re: PostGIS Query

Добавлено: 25 фев 2012, 09:52
rhot
Всё зависит в каком виде у вас эти дублирующиеся объекты. Например, если есть два полигона, они геометрически совпадают, и у каждого из них есть одинаковая атрибутивная информация. В этом случае я сделал бы так.

Код: Выделить всё

DELETE FROM poly_test
        WHERE id_serial IN (
            SELECT MAX(pt1.id_serial)
               FROM poly_test AS pt1
               WHERE pt1.the_geom && poly_test.the_geom AND ST_Equals(poly_test.the_geom,pt1.the_geom))
Для более строгой проверки используйте функцию ST_OrderingEquals().

Re: PostGIS Query

Добавлено: 25 фев 2012, 12:21
oleg
rhot, спасибо! Атрибутика не всегда одинаковая - могут быть разные значения полей. Пробую...

Re: PostGIS Query

Добавлено: 28 фев 2012, 04:07
Aleksandr Dezhin
Мне кажется, что запрос, который привел rhot, в случае трех клонов с одинаковой геометрией будет удалять только один, с максимальным id_serial. Я быд записал так:

Код: Выделить всё

DELETE FROM poly_test
WHERE EXISTS(SELECT id_poly FROM poly_test c WHERE c.id_serial < poly_test.id_serial AND c.the_geom && poly_test.the_geom AND ST_Equals(poly_test.the_geom, c.the_geom))


По идее этот запрос еще и побыстрее выполняться должен.