Буфер внутрь полигонов

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Ответить
kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Буфер внутрь полигонов

Сообщение kryl » 28 дек 2010, 17:33

Есть очень сложный мультиполигон с большим количеством дырок (граница леса) надо его разбить на 5-10 зон по расстоянию от опушки (построить буфер внутрь полигона). Арка выдает ошибку, Грасс тоже, к тому же не считает дырки дырками, КуГис вываливатся. В общем не знаю что делать.

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

Re: Буфер внутрь полигонов

Сообщение gamm » 28 дек 2010, 18:07

kryl писал(а):Есть очень сложный мультиполигон с большим количеством дырок (граница леса) надо его разбить на 5-10 зон по расстоянию от опушки (построить буфер внутрь полигона). Арка выдает ошибку, Грасс тоже, к тому же не считает дырки дырками, КуГис вываливатся. В общем не знаю что делать.
аппроксимировать :-)

1) растеризуем полигон на мелкую сетку. На всякий случай глядим глазками, чего вышло - раз Арка выдает ошибку, полигон может быть "кривой"
2) растеризуем границу полигона на ту же сетку (в другой файл, ессна).
3) строим дистанционное преобразование от границы. Но лучше использовать не D8 алгоритм, в Арке вроде нормальный, в GRASS - не совсем честный. Есть бесплатный код dt, работает как часы и строит точное расстояние.
4) делаем бинаризацию (3) по заданному радиусу буфера, и умножаем на (1).
5) если уж очень оно надо, результат векторизуем.

делается подручными средствами без всяких ГИС, и ничего не падает :-)

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Буфер внутрь полигонов

Сообщение kryl » 28 дек 2010, 22:02

gamm писал(а): 4) делаем бинаризацию (3) по заданному радиусу буфера, и умножаем на (1).
делается подручными средствами без всяких ГИС, и ничего не падает :-)
А если я пройду растр фильтром: матрицей из 1 нужного размера (допустим 199 на 199 если мне нужно буфер 100 м и разрешение растра 1м) результат будет сильно хуже dt?

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

Re: Буфер внутрь полигонов

Сообщение gamm » 29 дек 2010, 08:03

kryl писал(а):
gamm писал(а): 4) делаем бинаризацию (3) по заданному радиусу буфера, и умножаем на (1).
делается подручными средствами без всяких ГИС, и ничего не падает :-)
А если я пройду растр фильтром: матрицей из 1 нужного размера (допустим 199 на 199 если мне нужно буфер 100 м и разрешение растра 1м) результат будет сильно хуже dt?
dt вычисляет только дистанционное преобразование (сетку с расстояниями до источников, в нашем случае - до границы). Алгоритм в GRASS - модификация D8 (они "ход конем" добавили), на больших расстояниях ошибка все равно немного набегает, но поскольку она набегает монотонно, то топология сохраняется, и беды большой (особенно на небольших расстояниях) не будет.

Чем здесь может помочь фильтр, непонятно, если только не сделать специальный "фильтр" - матрицу с точными расстояниями достаточного размера, которая используется для "растеризации" - идем вдоль границы по ячейкам (пересекаемым границей), совмещаем центр матрицы с центром ячейки (если уж совсем точности хотим - то корректируем матрицу на сдвиг линии до центра), и берем "в пределах досягаемости" минимум из того, что в сетке расстояний и в матрице (предварительно в сетку расстояний записываем бесконечность). Но это нужно программировать, готовых средств скорее всего нет - нужен итератор (алгоритм обхода линии, например, Бразенхейм) и матричные операции. Можно сделать хоть в R (если использовать векторизованные операции, а не циклы), будет в несколько раз медленнее, чем на С++, но дождаться можно, особенно если один раз нужно было. Я это уже делал несколько лет назад :-)

Boris
Гуру
Сообщения: 4231
Зарегистрирован: 10 апр 2006, 22:34
Репутация: -344969098
Откуда: Париж

Re: Буфер внутрь полигонов

Сообщение Boris » 29 дек 2010, 22:17

kryl писал(а):Есть очень сложный мультиполигон с большим количеством дырок (граница леса) надо его разбить на 5-10 зон по расстоянию от опушки (построить буфер внутрь полигона). Арка выдает ошибку, Грасс тоже, к тому же не считает дырки дырками, КуГис вываливатся. В общем не знаю что делать.
если это еще нужно, то я не понял такую вещь как поляны - они должны учитываться или нет? Расстояние только от опушки, а как задается разница между опушкой и поляной?
У меня MapInfo спокойно строит отрицательные буферы с отрицательным приращением (внутрь), только от дырок - тоже строит.

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Буфер внутрь полигонов

Сообщение kryl » 11 янв 2011, 22:08

В результате посчитал растр расстояния от опушки в ArcGis. Прописал расстояния слою пробных площадей, получил нужную корреляцию, сижу обдумываю.

kryl
Завсегдатай
Сообщения: 324
Зарегистрирован: 14 фев 2010, 20:42
Репутация: 0

Re: Буфер внутрь полигонов

Сообщение kryl » 18 июл 2011, 16:24

Вернулся недавно к той же задаче. В результате спокойно сделал расчет в QGIS с помощью gdal tools>карта близости

Ответить

Вернуться в «Общий - ПО»

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

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