Генерализация векторных данных в GRASS

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Эта страница является черновиком статьи.


Введение

В статье рассматривается генерализация средствами ГИС GRASS.

Предварительная обработка данных

  • Если данные уже в базе данных GRASS, то ...
  • Если данные нужно импортировать, то можно использовать генерализацию импортируемых полигонов по площади. Для этого у модуля v.in.ogr есть опция min_area, отвечающая за минимальную площадь импортируемых полигонов. Внимание: площадной порог задаётся в квадратных единицах (текущих единицах области GRASS), с одним исключение: в области с географической системой координат ("широта/долгота") порог выставляется в квадратных метрах (А можно на это ссылку? А то не понятно, как считаются квадратные метры в широте/долготе).


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

Поскольку исходный файл содержит данные в системе координат широта/долгота, то предварительно спроецируем его в другую систему координат (например, Меркатора). Эту операцию можно проделать любыми доступными инструментами, в т.ч. и GRASS GIS, но мы воспользуемся [http://gis-lab.info/qa/ogr2ogr-examples.html ogr2ogr


ogr2ogr -f "ESRI ShapeFile" regions2010 regions2010_wgs.shp -t_srs "+proj=merc +lon_0=0 +lat_ts=0 +x_0=0 +y_0=0 +no_defs +a=6378137 +rf=298.257223563 +towgs84=0.000,0.000,0.000 +to_meter=1"

Далее создаем область GRASS на основе полученного файла по одному из способов указанных здесь.

Заходим в созданную область и импортируем данные:

v.in.ogr -e dsn=/home/dima/Desktop/General/reg/regions2010/regions2010_wgs.shp out=regions min_area=1 snap=100

В результате в текущую область будет импортирована векторная карта, которая получит название regions. На рисунке показан фрагмент получившейся карты:

Результат импорта

Генерализация

ГИС GRASS предоставляет неплохие возможности для генерализации векторных данных разных типов (как линий, так и полигонов). В данной статье рассматриваются оба модуля с функциями генерализации - v.clean и v.generalize.

Модуль <v.clean> предназначен для автоматического поиска и обработки топологических ошибок. Мы рассмотрим только две опции этого модуля, созданные для генерализации:

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

<v.generalize> -- специализированный модуль для генерализации данных, включает инструменты для упрощения, сглаживания, ??смещения?? (displacement) данных, а также для генерализации векторных сетей. Каждый инструмент -- реализация того или иного математического алгоритма. В данной статье рассматриваются инструменты генерализации ?Понятно что написано, или подробнее расписать?:

  • Инструмент douglas реализует классический алгоритм Дугласа-Пекера. Инструмент принимает один параметр -- максимальное допустимое отклонение генерализованной линии от изначальной.
  • Инструмент douglas_reduction представляет собой модификацию алгоритма Дугласа-Пекера, в которой задается дополнительный параметр -- желаемое количество точек генерализованной линии, которое требуется достичь (измеряется в процентах по сравнению с количеством точек исходной линии).
  • Инструмент lang также похож на алгоритм Дугласа-Пекера. Основное отличие состоит в том, что lang представляет собой не рекурсивный алгоритм. Поэтому, во избежание рекурсии алгоритм использует дополнительный параметр (look_ahead), задающий число точек, которые требуется просмотреть, начиная от стартовой точки. Далее как и в алгоритме Дугласа-Пекера, строятся секущие линии и измеряется максимальное отклонение между исходной и секущей линиями. Если отклонение не превышает порогового значения, то производится генерализация. Таким образом, алгоритм использует два параметра: число просматриваемых точек и максимально допустимое отклонение.
  • Инструмент reduction самый простой алгоритм, удаляет точки линии, которые лежат около друг-друга ближе, чем заданный порог. Параметр алгоритма -- максимально допустимое расстояние, при котором точки считаются идентичными.
  • Инструмент reumann использует коридор из двух параллельных линий заданной ширины. Коридор строится в направлении, заданном первыми двумя точками линии, те точки и сегменты исходной линии, которые попали внутрь коридора, замещаются одним сегментом и процесс повторяется со следующей порцией точек. Параметр алгоритма -- ширина коридора.


Генерализация полигонов

Выполним следующую команду:

v.clean in=regions out=regions_bona type=boundary tool=prune,rmarea thresh=50000,100000000

В этой команде вызывается модуль v.clean с описанными выше инструментами. В данном случае параметр thresh задает настройки точности для инструмента prune в 50 000 (в единицах проекта), т.е. узлы, находящиеся ближе друг к другу, чем задано, будут удалены. Аналогично, будут удалены все области, чья площадь окажется меньше, чем 100 000 000 единиц. В результате выполнения будет создана карта regions_bona, фрагмент которой показан на рисунке:

Результат генерализации

Обратите внимание на то, что в восточной части показанного фрагмента осталась область, граница которой не была генерализована. Если увеличить масштаб, то получим следующий фрагмент:

Фрагмент с анклавом

Дело в том, что на данном участке находился анклав, который не был удален инструментом rmarea, т.к. его размеры (свыше 40 000 000 000) превышают заданный порог, но при этом, если произвести генерализацию данного участка, то в результате генерализованная граница должна пересечь этот анклав. Понятно, что вновь появившееся пересечение меняет исходную топологию и поэтому недопустимо. Таким образом этот и подобные участки должны быть обработаны отдельно (вручную или автоматически с использованнием других порогов) в зависимости от того, что именно требуется получить на выходе.


Генерализация линий

Модуль v.clean c опцией "prune" можно использовать также и для генерализации линейных объектов.




===Экспорт результатов===

После требуемой обработки экспортируем данные обратно в shp:

v.out.ogr in=regions_bona dsn=/home/dima/Desktop/General/reg/regions2010/result.shp

И произведем обратное перепроецирование:

ogr2ogr -f "ESRI ShapeFile" result_wgs.shp result.shp -t_srs epsg:4326