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

Ответить
oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

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

Сообщение oleg » 25 фев 2012, 02:50

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

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

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

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: PostGIS Query

Сообщение rhot » 25 фев 2012, 09:52

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

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

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().
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

oleg
Завсегдатай
Сообщения: 460
Зарегистрирован: 03 фев 2005, 11:46
Репутация: 15
Контактная информация:

Re: PostGIS Query

Сообщение oleg » 25 фев 2012, 12:21

rhot, спасибо! Атрибутика не всегда одинаковая - могут быть разные значения полей. Пробую...

Аватара пользователя
Aleksandr Dezhin
Активный участник
Сообщения: 244
Зарегистрирован: 03 фев 2010, 10:47
Репутация: 14
Откуда: Москва

Re: PostGIS Query

Сообщение Aleksandr Dezhin » 28 фев 2012, 04:07

Мне кажется, что запрос, который привел 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))


По идее этот запрос еще и побыстрее выполняться должен.
Последний раз редактировалось Aleksandr Dezhin 29 фев 2012, 03:09, всего редактировалось 1 раз.

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость