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

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 27 окт 2010, 06:53

Существует ли в GRASS инструмент упрощения полигонов без нарушения топологии?
Пробовал воспользоваться соответствующим инструментом из ftools в QGIS, но он упрощает так, что потом между полигонами остаются щели, а хотелось бы чтобы их не было.
Spatial is now, more than ever, just another column- The Geometry Column.

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

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

Сообщение KolesovDmitry » 27 окт 2010, 08:32

_DR_ писал(а):Существует ли в GRASS инструмент упрощения полигонов без нарушения топологии?
Да, конечно. Дело в том, что GRASS - топологическая GIS, поэтому вопрос о нарушении топологии не актуален :) операции по редактированию будут сохранять топологию. Правда при этом данные должны быть записаны в собственном формате GRASS (т.е. перед началом работы их нужно импортировать).
А для генерализации есть специальный модуль: v.generalize.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 28 окт 2010, 09:02

Попробовал упростить полигон, находящийся в географической СК (через модуль GRASS в QGIS), пробавл различные алгоритмы, в том числе Douglas-Peucker with reduction, выбирал Feature type - area, но по завершении всегда получаю собщение вида:

Код: Выделить всё

Number of vertices was reduced from 2779 to 2779 [100%]
Spatial is now, more than ever, just another column- The Geometry Column.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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

Сообщение Александр Мурый » 28 окт 2010, 16:23

А если попробовать тип "boundary"? Area -- это граница+центроид, т.е. их топологический сочетание.

Вот более подробный туториал по модулю v.generalize
http://users.ox.ac.uk/~orie1848/tutorial.html
Редактор материалов, модератор форума

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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

Сообщение Александр Мурый » 28 окт 2010, 18:30

Нашел в одной из презентаций по GRASS:
01_OGC_generalize.png
генерализации в НЕтопологической ГИС
01_OGC_generalize.png (101.42 КБ) 11867 просмотров
а теперь так:
02_GRASS_generalize.png
пример генерализации в топологической ГИС
02_GRASS_generalize.png (97.51 КБ) 11867 просмотров
Т.о., можно еще попробовать модуль v.clean с опцией tool=prune и указать порог, с учетом которого будут удалены вершины границ.

Там же можно "подчистить" векторную карту после импорта через v.in.ogr -c ... (см. мануал)
Редактор материалов, модератор форума

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 28 окт 2010, 19:31

Попробовал через 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 %
Spatial is now, more than ever, just another column- The Geometry Column.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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
Редактор материалов, модератор форума

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 28 окт 2010, 20:20

Да, данные те, но даже после чистки ничего не упрощается.
Пока остановился на этом инструменте.
Spatial is now, more than ever, just another column- The Geometry Column.

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

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

Сообщение KolesovDmitry » 29 окт 2010, 18:56

_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 не упрощает геометрию в систем широта-долгота (но тогда я нигде не нашел об этом упоминания).

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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

Сообщение Александр Мурый » 29 окт 2010, 19:15

Интересно.. Заметьте, господа, даже в примере из презентации (выше) генерализация в GRASS делается в проекции UTM, что намекает. Надо поискать доказательства данной теории.
Редактор материалов, модератор форума

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 02 ноя 2010, 12:13

А можно попросить написать небольшое руководство по шагам на тему как упростить в GRASS shape файлы: импорт, очистка, перепроецирование, упрощение, обратное перепроецирование? Заранее спасибо!
Spatial is now, more than ever, just another column- The Geometry Column.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

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

Сообщение Александр Мурый » 02 ноя 2010, 14:13

_DR_ , можно :) Но лично от себя ничего не обещаю.
Может, найду в сети на буржуйском (хотя про упрощение подробного описания так и не нашел). Но: по любому нужен конкретный учебный шейп-файл (желательно, НЕ этот viewtopic.php?f=35&p=33957#p33951). Какой-нибудь попроще. И задачи, если можно, поконкретнее: изначальная проекция такая-то, упростить надо так-то, конечная проекция такая-то.
Редактор материалов, модератор форума

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 02 ноя 2010, 14:46

1. Простенький шейп во вложении;
2. Начальная и конечная проекция - EPSG:4326;
3. Упрощение провести с помощью v.clean tool=prune
Вложения
testcase.zip
(13.66 КБ) 442 скачивания
Spatial is now, more than ever, just another column- The Geometry Column.

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

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

Сообщение KolesovDmitry » 02 ноя 2010, 16:48

Предположим, что у нас есть каталог с данными grassdata и в нем содержится два набора карт:
* tmp система координат широта/долгота
* tmp1 система координат epsg:900913
(оба этих набора прикладываю во вложении)

Далее последовательность действий:
  • 1) Заходим в GRASS в набор tmp1
    2) Импортируем туда шейпы:

    Код: Выделить всё

    v.in.ogr dsn=путь/к/шейпу/название out=adm
    в результате в наборе tmp появляется карта adm
    3) Выходим из GRASS
    4) Заходим в набор tmp1
    5) Импортируем в этот набор нужные карты:

    Код: Выделить всё

    v.proj in=adm out=adm loc=tmp
    В результате в наборе 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) импортируем туда генерализованную карту:

    Код: Выделить всё

    v.proj in=adm_bona out=adm_bona loc=tmp1
    d) при необходимости экспортируем в шейп при помощи

    Код: Выделить всё

    v.out.ogr
(И все-таки, мне кажется, что упрощение можно произвести и в системе координат широта-долгота....)
Вложения
grassdata.zip
Описываемые наборы
(97.68 КБ) 426 скачиваний

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 03 ноя 2010, 08:06

KolesovDmitry писал(а):И все-таки, мне кажется, что упрощение можно произвести и в системе координат широта-долгота....
если GRASS будет в этом случае считать расстояние хотя-бы по большой дуге (чего вроде не делается), то можно. В противном случае метрика становится анизотропной (по вертикали то же расстояние в градусах не равно расстоянию по горизонтали), и результат будет неверный, поскольку толерансы должны быть изотропны (упрощение зависит от формы, но не от ориентации).

Ответить

Вернуться в «GRASS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей