Упрощение смежных полигонов с помощью PostGIS?

24

Я столкнулся с проблемой упрощения набора смежных полигонов. Если я упросту каждый полигон по отдельности с помощью алгоритма Дугласа – Пекера (который используется многими инструментами с открытым исходным кодом), получающиеся полигоны обычно больше не являются смежными. Эта проблема существует, например, при упрощении границ стран / провинций.

У кого-нибудь есть решение для этого с помощью PostGIS?

stachu
источник

Ответы:

19

Топологическая векторная модель предоставит то, что вам нужно. В нетопологическом хранилище (таком как шейп-файл) одно ребро между геометриями сохраняется дважды. В топологическом векторе области хранятся отдельно от линий, поэтому корректировки можно выполнять без влияния на топологию. Я не смог найти хорошую диаграмму, поэтому я создал этот простой пример, где области A, B и C вычисляются из пересечений линий (соединяющих 1-4), которые их разделяют. пример топологического вектора

Эта модель используется ArcInfo в качестве покрытий, в GRASS - в качестве векторной модели по умолчанию и может использоваться в PostGIS с экспериментальным инструментом PostGIS Topology . Возможно, более простое решение - преобразование ваших данных в линейную работу, удаление избыточных сегментов, а затем воссоздание ваших полигонов после упрощения.

SCW
источник
15

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

CREATE TABLE rings AS SELECT (ST_DumpRings(polys)).geom AS rings FROM polytable;
CREATE TABLE simplerings AS SELECT ST_Union(rings) AS simplerings FROM rings;
CREATE TABLE newpolycollection AS SELECT ST_Polygonize(ST_Simplify(simplerings, 10.0)) AS geom FROM simplerings;
CREATE TABLE newpolysnoattributes AS SELECT (ST_Dump(geom)).geom FROM newpolycollection;
CREATE TABLE newpolytable AS SELECT new.geom, old.attr FROM newpolysnoattributes new, polytable old WHERE ST_Contains(new.geom, ST_PointOnSurface(old.polys));

В вышеприведенном есть ошибки, но основная идея есть. Вы можете сделать все это одним запросом, если хотите.

Пол Рэмси
источник
2

Чтобы избежать этой проблемы, вы должны смоделировать ваши данные, используя топологические ограничения. http://mapshaper.org/ делает это.

жюльен
источник
-1

Вы должны тесселяции. В старой теории создания геометрии ARC / INFO две соседние геометрии создавались одной ломаной и разделяли эту ломаную линию. Поэтому, когда вы обобщали, он обобщал обе границы, потому что ссылался на одну и ту же ломаную.

CrazyEnigma
источник