Помогите, пожалуйста, с формированием запроса к таблице и с правильным порядком действий в целом при обработке геометрии средствами PostGIS.
Например, есть задача избавиться от дубликатов геометрии в слое. Выяснил, что для этой цели необходимо использовать функцию ST_HausdorffDistance() со значением "0". Таблица называется, например, "poly_test" с геометрией в “the_geom“. Какой запрос нужно выполнить для получения таблицы без дубликатов? Нужно ли предварительно создать пустую таблицу для результата или можно работать в одной - исходной?
Использую pgAdmin и QGIS - PgQyery, DB Manager, PostGIS Manager. Спасибо.
PostGIS удаление дубликатов геометрий
-
- Завсегдатай
- Сообщения: 460
- Зарегистрирован: 03 фев 2005, 11:46
- Репутация: 15
- Контактная информация:
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: PostGIS Query
Всё зависит в каком виде у вас эти дублирующиеся объекты. Например, если есть два полигона, они геометрически совпадают, и у каждого из них есть одинаковая атрибутивная информация. В этом случае я сделал бы так.
Для более строгой проверки используйте функцию ST_OrderingEquals().
Код: Выделить всё
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))
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
-
- Завсегдатай
- Сообщения: 460
- Зарегистрирован: 03 фев 2005, 11:46
- Репутация: 15
- Контактная информация:
Re: PostGIS Query
rhot, спасибо! Атрибутика не всегда одинаковая - могут быть разные значения полей. Пробую...
- Aleksandr Dezhin
- Активный участник
- Сообщения: 244
- Зарегистрирован: 03 фев 2010, 10:47
- Репутация: 14
- Откуда: Москва
Re: PostGIS Query
Мне кажется, что запрос, который привел 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 раз.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей