Генерализация векторных данных в GRASS: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
(Новая страница: «{{Статья|Черновик}} "Рыба" статьи [http://gis-lab.info/share/DR/grassgen/grass-generalization.html отсюда] =Генерализа…»)
 
Строка 12: Строка 12:
== Генерализация полигонов средствами GRASS GIS ==
== Генерализация полигонов средствами GRASS GIS ==


Предположим, что имеется файл в формате shp, в котором хранятся полигоны. Требуется произвести генерализацию этого файла. Для определенности будем работать с !!!данным!!! файлом.
Предположим, что имеется файл в формате shp, в котором хранятся полигоны. Требуется произвести генерализацию этого файла. Для определенности будем работать с [http://gis-lab.info/data/rusbounds-rosreestr/regions2010_wgs_shp.7z данным] файлом.


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


[[Файл:Grass-generalization-02.png|Результат генерализации]] Обратите внимание на то, что в восточной части показанного фрагмента осталась область, граница которой не была генерализована. Если увеличить масштаб, то получим следующий фрагмент: [[Файл:Grass-generalization-03.png|Фрагмент с анклавом]]
[[Файл:Grass-generalization-02.png|Результат генерализации]]  


Дело в том, что на данном участке находился анклав довольно больших размеров (свыще 40 000 000 000), при этом, если произвести генерализацию данного участка, то в результате генерализованная граница должна пересечь этот анклав. Понятно, что вновь появившееся пересечение меняет исходную топологию и поэтому недопустимо. Таким образом этот и подобные участки должны быть обработаны отдельно (вручную или автоматически с использованнием других порогов) в зависимости от того, что именно требуется получить на выходе.
Обратите внимание на то, что в восточной части показанного фрагмента осталась область, граница которой не была генерализована. Если увеличить масштаб, то получим следующий фрагмент:
 
[[Файл:Grass-generalization-03.png|Фрагмент с анклавом]]
 
Дело в том, что на данном участке находился анклав, который не был удален, т.к. его размеры (свыше 40 000 000 000) превышают заданный порог, но при этом, если произвести генерализацию данного участка, то в результате генерализованная граница должна пересечь этот анклав. Понятно, что вновь появившееся пересечение меняет исходную топологию и поэтому недопустимо. Таким образом этот и подобные участки должны быть обработаны отдельно (вручную или автоматически с использованнием других порогов) в зависимости от того, что именно требуется получить на выходе.


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

Версия от 06:49, 3 июля 2012

Эта страница является черновиком статьи.


"Рыба" статьи отсюда

Генерализация shp-файлов средствами GRASS GIS

В статье рассматривается пример генерализации shp-файлов средствами GRASS GIS. Статья написана по мотивам следущего обсуждения на форуме.

Одним из самых распространенных форматов векторных файлов является формат shp. К сожалению, данный формат не является топологическим, и, как следствие, при генерализации данных полигонального типа, хранящихся в этом формате почти неизбежны осложнения. Самой частой проблемой будет возникновение "дырок" между двумя граничащими полигонами или наложение этих полигонов друг на друга. Выходом из ситуации может служить использование топологического формата хранения данных и соответствующих инструментов редактирования, например, GRASS GIS. GRASS GIS - геоинформационная система с открытым исходным кодом, одной из особенностей которой является хранение и обработка векторных данных с учетом топологии.


Генерализация полигонов средствами GRASS GIS

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

Схема работы будет следующая:

  • Импортируем данные в GRASS GIS
  • Произведем генерализацию
  • Экспортируем результат

Импорт данных в GRASS GIS

Поскольку исходный файл содержит данные в системе координат широта/долгота, то предварительно спроецируем его в другую систему координат (например, Меркатора). Эту операцию можно проделать любыми доступными инструментами, в т.ч. и 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 GIS в своем составе имеет несколько модулей, которые могут быть использованы для генерализации данных. В этой статье рассматривается один из модулей - v.clean, предназначенный автоматического поиска и обработки топологических ошибок. Данный модуль имеет параметр tool, определяющий инструменты обработки. Мы будем использовать две опции этого параметра:

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

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

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, фрагмент которой показан на рисунке:

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

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

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

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

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

После требуемой обработки экспортируем данные обратно в 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