Страница 1 из 2
Генерализация полигонов
Добавлено: 27 окт 2010, 06:53
Denis Rykov
Существует ли в GRASS инструмент упрощения полигонов без нарушения топологии?
Пробовал воспользоваться соответствующим инструментом из ftools в QGIS, но он упрощает так, что потом между полигонами остаются щели, а хотелось бы чтобы их не было.
Re: Генерализация полигонов
Добавлено: 27 окт 2010, 08:32
KolesovDmitry
_DR_ писал(а):Существует ли в GRASS инструмент упрощения полигонов без нарушения топологии?
Да, конечно. Дело в том, что GRASS - топологическая GIS, поэтому вопрос о нарушении топологии не актуален

операции по редактированию будут сохранять топологию. Правда при этом данные должны быть записаны в собственном формате GRASS (т.е. перед началом работы их нужно импортировать).
А для генерализации есть специальный
модуль: v.generalize.
Re: Генерализация полигонов
Добавлено: 28 окт 2010, 09:02
Denis Rykov
Попробовал упростить полигон, находящийся в географической СК (через модуль GRASS в QGIS), пробавл различные алгоритмы, в том числе Douglas-Peucker with reduction, выбирал Feature type - area, но по завершении всегда получаю собщение вида:
Код: Выделить всё
Number of vertices was reduced from 2779 to 2779 [100%]
Re: Генерализация полигонов
Добавлено: 28 окт 2010, 16:23
Александр Мурый
А если попробовать тип "boundary"? Area -- это граница+центроид, т.е. их топологический сочетание.
Вот более подробный туториал по модулю
v.generalize
http://users.ox.ac.uk/~orie1848/tutorial.html
Re: Генерализация полигонов
Добавлено: 28 окт 2010, 18:30
Александр Мурый
Нашел в одной из презентаций по GRASS:

- генерализации в НЕтопологической ГИС
- 01_OGC_generalize.png (101.42 КБ) 12998 просмотров
а теперь так:

- пример генерализации в топологической ГИС
- 02_GRASS_generalize.png (97.51 КБ) 12998 просмотров
Т.о., можно еще попробовать модуль
v.clean с опцией
tool=prune и указать порог, с учетом которого будут удалены вершины границ.
Там же можно "подчистить" векторную карту после импорта через
v.in.ogr -c ... (см. мануал)
Re: Генерализация полигонов
Добавлено: 28 окт 2010, 19:31
Denis Rykov
Попробовал через v.clean, ничего не упростилось, получаю следующее:
Код: Выделить всё
--------------------------------------------------
Инструмент: Порог
Обрезка: 1.000000e+000
--------------------------------------------------
Копирование линий вектора...
Построение частей топологии заново...
Построение топологии для векторного слоя <prune7>...
Регистрируются примитивы...
1000 2000
2823 примитивов зарегистрировано
264422 узлов зарегистрировано
Построение полигонов...
1% 3% 5% 7% 9% 11% 13% 15% 17% 19% 21% 23% 25% 27% 29% 31% 33% 35% 37% 39% 41% 43% 45% 47% 49% 51% 53% 55% 57% 59% 61% 63% 65% 67% 69% 71% 73% 75% 77% 79% 81% 83% 85% 87% 89% 91% 93% 95% 97% 99% 100%
1400 полигонов построено
1399 островов создано
Назначаются острова...
1% 3% 5% 7% 9% 11% 13% 15% 17% 19% 21% 23% 25% 27% 29% 31% 33% 35% 37% 39% 41% 43% 45% 47% 49% 51% 53% 55% 57% 59% 61% 63% 65% 67% 69% 71% 73% 75% 77% 79% 81% 83% 85% 87% 89% 91% 93% 95% 97% 99% 100%
Назначаются центроиды...
1% 3% 5% 7% 9% 11% 13% 15% 17% 19% 21% 23% 25% 27% 29% 31% 33% 35% 37% 39% 41% 43% 45% 47% 49% 51% 53% 55% 57% 59% 61% 63% 65% 67% 69% 71% 73% 75% 77% 79% 81% 83% 85% 87% 89% 91% 93% 95% 97% 99% 100%
Количество узлов: 2814
Количество примитивов: 2823
Количество точек: 0
Количество линий: 0
Количество границ: 1417
Количество центроидов: 1406
Количество полигонов: 1400
Количество островов: 1399
Количество неправильных границ: 18
Количество центроидов вне полигонов: 1
Количество центроидов-дупликатов: 8
Количество полигонов без центроидов: 3
--------------------------------------------------
Инструмент: Обрезка линий/границ
Удалено 0 узлов из входных данных 0 (узлы заданного типа), т.е. nan %
Re: Генерализация полигонов
Добавлено: 28 окт 2010, 19:40
Александр Мурый
Какие данные? Те самые, что в теме
viewtopic.php?f=35&p=33957#p33951 ?
Количество неправильных границ: 18
Количество центроидов вне полигонов: 1
Количество центроидов-дупликатов: 8
Количество полигонов без центроидов: 3
Топология не подчищена, наверно, поэтому не работает генерализация
[Из мануала] Стандартная обработка после импорта шейп-файла:
Код: Выделить всё
v.clean input=areas output=areas_clean tool=bpol,rmdupl type=boundary
Re: Генерализация полигонов
Добавлено: 28 окт 2010, 20:20
Denis Rykov
Да, данные те, но даже после чистки ничего не упрощается.
Пока остановился на
этом инструменте.
Re: Генерализация полигонов
Добавлено: 29 окт 2010, 18:56
KolesovDmitry
_DR_ писал(а):Попробовал через v.clean, ничего не упростилось
Интересно тут вот что. Я взял заведомо топологчески корректную карту (классический набор данных для GRASSspearfish60, система координат UTM зона 15), запустил упрощение (на почвенной карте):
Код: Выделить всё
v.clean in=soils out=tmp type=boundary thresh=50 tool=prune
Все упрощается, никаких проблем.
Создаю на основе почвенной карты новую область, система координат широта-долгота, WGS-84. Запускаю упрощение в новой области (меняю порог в соответствии с новой системой координат):
Код: Выделить всё
v.clean in=soils out=tmp type=boundary thresh=0.01 tool=prune
И ничего... Как было, так и осталось. Такое впечатление, что команду попросту проигнорировали...
Не могу понять, то ли это глюк, то ли действительно GRASS не упрощает геометрию в систем широта-долгота (но тогда я нигде не нашел об этом упоминания).
Re: Генерализация полигонов
Добавлено: 29 окт 2010, 19:15
Александр Мурый
Интересно.. Заметьте, господа, даже в примере из презентации (выше) генерализация в GRASS делается в проекции UTM, что намекает. Надо поискать доказательства данной теории.
Re: Генерализация полигонов
Добавлено: 02 ноя 2010, 12:13
Denis Rykov
А можно попросить написать небольшое руководство по шагам на тему как упростить в GRASS shape файлы: импорт, очистка, перепроецирование, упрощение, обратное перепроецирование? Заранее спасибо!
Re: Генерализация полигонов
Добавлено: 02 ноя 2010, 14:13
Александр Мурый
_DR_ , можно

Но лично от себя ничего не обещаю.
Может, найду в сети на буржуйском (хотя про упрощение подробного описания так и не нашел). Но: по любому нужен конкретный учебный шейп-файл (желательно, НЕ этот
viewtopic.php?f=35&p=33957#p33951). Какой-нибудь попроще. И задачи, если можно, поконкретнее: изначальная проекция такая-то, упростить надо так-то, конечная проекция такая-то.
Re: Генерализация полигонов
Добавлено: 02 ноя 2010, 14:46
Denis Rykov
1. Простенький шейп во вложении;
2. Начальная и конечная проекция - EPSG:4326;
3. Упрощение провести с помощью v.clean tool=prune
Re: Генерализация полигонов
Добавлено: 02 ноя 2010, 16:48
KolesovDmitry
Предположим, что у нас есть каталог с данными grassdata и в нем содержится два набора карт:
* tmp система координат широта/долгота
* tmp1 система координат epsg:900913
(оба этих набора прикладываю во вложении)
Далее последовательность действий:
- 1) Заходим в GRASS в набор tmp1
2) Импортируем туда шейпы:
в результате в наборе tmp появляется карта adm
3) Выходим из GRASS
4) Заходим в набор tmp1
5) Импортируем в этот набор нужные карты:
В результате в наборе tmp1 появится карта adm (уже перепроецированная под нужную систему координат)
6) Производим упрощение:
Код: Выделить всё
v.clean in=adm out=adm_bona type=boundary tool=prune thresh=1000
(В системе координат epsg:900913 измерения производятся в метрах, поэтому порог большой)
В итоге получаем генерализованную карту adm_bona
7) Если хотим получить карту в начальной системе epsg:4326, то проделываем уже знакомые шаги
а) выходим из GRASS
b) заходим в набор tmp
c) импортируем туда генерализованную карту:
d) при необходимости экспортируем в шейп при помощи
(И все-таки, мне кажется, что упрощение можно произвести и в системе координат широта-долгота....)
Re: Генерализация полигонов
Добавлено: 03 ноя 2010, 08:06
gamm
KolesovDmitry писал(а):И все-таки, мне кажется, что упрощение можно произвести и в системе координат широта-долгота....
если GRASS будет в этом случае считать расстояние хотя-бы по большой дуге (чего вроде не делается), то можно. В противном случае метрика становится анизотропной (по вертикали то же расстояние в градусах не равно расстоянию по горизонтали), и результат будет неверный, поскольку толерансы должны быть изотропны (упрощение зависит от формы, но не от ориентации).