Как разумно ухудшить или сгладить данные ГИС (упрощая полигоны)? - PullRequest
49 голосов
/ 05 декабря 2009

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

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

Ответы [ 7 ]

61 голосов
/ 05 декабря 2009

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

30 голосов
/ 05 декабря 2009

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

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

19 голосов
/ 08 мая 2013

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

ogr2ogr output.shp input.shp -simplify 0.0001
8 голосов
/ 05 декабря 2009

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

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

Повторите, пока не выполнено.

7 голосов
/ 28 марта 2013

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

4 голосов
/ 17 октября 2013

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

0 голосов
/ 08 декабря 2018

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

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

...