Более

PostGIS: Как растворить векторные данные

PostGIS: Как растворить векторные данные


У меня есть несколько сценариев, в которых мне нужно растворить векторные данные, и мне интересно, как это сделать с помощью PostGIS. Как будут выглядеть запросы для выполнения этих операций?

Ниже я опишу различные случаи на нескольких простых примерах.

Фактические данные, с которыми я работаю, значительно более массивны и сложны, чем эти примеры, на самом деле я работаю с данными из OpenStreetMap (дорожные сети, полигоны землепользования и т. Д.). PostGIS кажется лучшей альтернативой для работы с тяжелыми данными.

Сегментированные линии

Линии разбиты на сегменты, как показано на двух изображениях. Первая линия («A – D») состоит из трех сегментов и была разделена на точки B и C. Я хочу растворить эти три отдельные линии, чтобы получить линию, состоящую из вершин A, D. (вершины B, C полностью избыточны)

Вторая строка не сильно отличается. Он был разделен в точках E и F на три более мелкие строки.

Слить многоугольники

Вторая проблема касается растворения полигональных данных. Геометрии могут либо перекрываться, либо находиться внутри друг друга, касаться (общие вершины) или Около коснитесь на небольшом расстоянии, разделяющем многоугольники.

Во всех этих случаях я хочу растворить полигоны в более крупные геометрические формы. Я предполагаю, что последний случай, когда полигоны почти соприкасаются, немного особенный, так как небольшое пространство между ними должно быть «заполнено».

Заключительное примечание

В вышеупомянутых случаях растворение основано исключительно на пространственных отношениях. Негеометрические атрибуты не актуальны.

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

Если кто-то хочет получить данные, показанные в примерах, их можно скачать здесь как GeoJSON.


Если бы все ваши перекрытия / касания были попарными, это было бы простое самосоединение, что было бы идеально для эффективности.

Ответ грубой силы выглядит примерно так:

СОЗДАТЬ ТАБЛИЦУ, объединенную КАК ВЫБРАТЬ (ST_Dump (ST_Union (geom)). Geom КАК geom FROM mytable;

Это займет все геометрии в памяти, поместит их в топологию и извлечет самые большие объединенные объекты как единую коллекцию геометрии, а затем выгрузит каждый элемент коллекции в отдельную строку.

Для достаточно больших входных данных это может быть ужасно медленным.

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


Смотреть видео: Postgresql: Create Postgis database and import shapefiles.