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

У меня есть подробные карты графства США, из набора данных TIGER LINE. Как я могу пробовать, сглаживать или деградировать данные, чтобы я получал более четкие, более квадратные, менее "шумные" формы для представления географических объектов - в данном случае только границы графства и государственные линии, но, возможно, и в общем случае?

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

Ответ 1

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

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

Ответ 2

Дуглас-Пекер, безусловно, правильный подход. Есть несколько простых способов получить доступ к его реализации в 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/ вместе с примером кода, который оказывается не слишком необходимым!

Ответ 3

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

ogr2ogr output.shp input.shp -simplify 0.0001

Ответ 4

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

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

Повторяйте до завершения.

Ответ 5

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

Ответ 6

Вы также можете использовать Simplify.js, который использует комбинацию Douglas-Peucker и Radial Distance. Существуют также ссылки на многие порты на другие языки, перечисленные в проекте github

Ответ 7

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

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