Как разумно ухудшить или сгладить данные ГИС (упростив полигоны)?

StackOverflow https://stackoverflow.com/questions/1849928

Вопрос

У меня есть подробные карты графств США, начиная с ТИГР ЛИНИЯ наборы данных.Как я могу выполнить выборку, сгладить или ухудшить данные, чтобы получить более прямые, квадратные и менее «шумные» формы для представления географических объектов — в данном случае только границ округов и границ штатов, но, возможно, и в общем случае?

Выборка может происходить во время рендеринга, если это можно сделать эффективно, или можно сгенерировать и сохранить параллельный набор данных.Я использую ПостГИС, а линии представляют собой несколько полилиний, созданных shp2pgsql - но любое решение, в котором вы берете волнистую линию и превращаете ее в более плавную линию, имеющую примерно такое же значение для человека-переводчика, будет очень полезным.

Это было полезно?

Решение

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

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

Другие советы

Дуглас-Пейкер определенно является правильным подходом.Есть несколько простых способов получить доступ к его реализации в PostGIS и QGIS, которые я решил добавить сюда для тех, кто встретит этот пост с аналогичным вопросом.Цель состоит в том, чтобы начать с чего-то вроде этого:

alt text

и в итоге получим что-то вроде этого:

alt text

В PostGIS Дуглас-Пойкер реализован как simplify, синтаксис, подробный здесь на сайте bostongis.org, это некоторый вариант:

SELECT transform(simplify(transform(the_geom, 2249), 500),4326) from the_geo_table

Это сработало очень хорошо даже для полного национального набора данных, с некоторыми ошибками, которые, по-видимому, связаны с плохими исходными данными.Также оказывается, что в QGIS пункт меню Tools > Geometry Tools > Simplify Geometries экспортирует упрощенный шейп-файл любой геометрии и добавит его как слой в текущий проект.

Это довольно фундаментальный набор инструментов, и я задал вопрос на слишком низком уровне, хотя было приятно изучить основную математику, этому есть хорошее объяснение. здесь:http://www.mappinghacks.com/code/PolyLineReduction/, а также пример кода, который, как оказалось, не так уж и нужен!

Вместо QGIS я предлагаю использовать ogr2ogr, поскольку он не удаляет полигоны!

ogr2ogr output.shp input.shp -simplify 0.0001

Вот простой итеративный алгоритм сглаживания:

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

Повторяйте до тех пор, пока не будете удовлетворены.

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

Вы также можете использовать Упростить.js который использует комбинацию Дуглас-Пейкер и алгоритмы радиального расстояния.Также есть ссылки на многие порты на другие языки, перечисленные на сайте. проект GitHub

Ответ @unmounted правильный, но я хотел бы добавить еще одно предложение.

Всегда используйте функцию ST_SimplifyPreserveTopology вместо ST_Simplify в PostGIS.Оба используют один и тот же базовый алгоритм (Дугласа-Пейкера), но первый избегает любых упрощений, которые могли бы привести к недопустимой геометрии.Например, ST_Simplify может привести к тому, что геометрия будет пересекать сама себя.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top