Присвоить атрибут по наибольшей площади пересечения

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Присвоить атрибут по наибольшей площади пересечения

Сообщение rhot » 21 фев 2014, 21:03

Есть 2 вектора: почвы и вырубки. Типов почв только три, остальные исключены из рассчёта.

Необходимо присовить полигонам вырубок, преобладающий тип почвы. См. картинку.

Я склоняюсь к PG/PostGIS поскольку данные там и считать в терминале проще и быстрей.
1) Обрезать почвы вырубками;
2) Посчитать площади для обрезанных полигонов;
3) Присвоить пересекающимся почвам тот же ID, что и у вырубок;
4) Для каждого полигона почвы с одинаковым ID вырубок определить наибольший по площади объект и тип почвы этого объекта (почвы) присвоить вырубке с соотвествующим ID.

Муторно получилось. Может кто проще делал или знает как сделать?
Вложения
Вырубка.jpeg
Полупрозрачные почвы наложены на красный полигон вырубок
Вырубка.jpeg (45.38 КБ) 5830 просмотров
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

А.Серов
Активный участник
Сообщения: 209
Зарегистрирован: 14 янв 2010, 15:40
Репутация: 68
Откуда: Сыктывкар
Контактная информация:

Re: Присвоить атрибут по наибольшей площади пересечения

Сообщение А.Серов » 21 фев 2014, 23:02

Может не оптимальный вариант, но я бы так сделал

1. Сделал Intersect, получил ID_FELL, SOIL_TYPE, AREA
2. Подцепил бы слой в MS Access
3. Построил перекрестный запрос где в строках были бы ID_FELL, в столбцах - типы почв (SOIL_TYPE1, SOIL_TYPE2...), а значения - сумма площадей (Sum(AREA))
4. Написал бы небольшой скрипт на VBA для выборки максимальной площади и запихивании его в специально подготовленное поле таблицы с вырубками. Строк 10 очевидного кода.

Наверняка, то же самое реализуется и в PostrgesSQL, скажем на PL. Не знаю только как быть с перекрестными запросами - не сталкивался.

Чем хорошо делать так - будем иметь в одной таблице сразу площади по всем типам почв для каждого ID_FELL. Хоть 3, хоть 100. Может быть полезно для последующего анализа.

Аватара пользователя
ginpetr
Завсегдатай
Сообщения: 385
Зарегистрирован: 21 июн 2011, 12:07
Репутация: 140
Откуда: Орск
Контактная информация:

Re: Присвоить атрибут по наибольшей площади пересечения

Сообщение ginpetr » 22 фев 2014, 12:09

в мапинфо есть команда обновить колонку одной таблицы значениями другой таблицы, объединение данных по пересечению объектов, там что-то бало пропорционально площади пересечения. к сожалению сейчас доступа к программе не имею, чтоб точно посмотреть, но не исключено, что там можно в одно-два действия всё решить.

thegeo
Активный участник
Сообщения: 161
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Присвоить атрибут по наибольшей площади пересечения

Сообщение thegeo » 22 фев 2014, 14:38

Реализация в MI. Программа и пример в архиве. Все для трех типов почв, но несложно расширить программу и для более общего случая. Результат работы на рисунке.
Вложения
rna_00130.png
rna_00130.png (25.36 КБ) 5751 просмотр
tstGrnd.rar
(5.88 КБ) 404 скачивания

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Присвоить атрибут по наибольшей площади пересечения

Сообщение rhot » 22 фев 2014, 15:03

Круто! Спасибо за информацию.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Присвоить атрибут по наибольшей площади пересечения

Сообщение rhot » 22 фев 2014, 18:00

Пока пересечь получилось так:

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

CREATE TABLE clearcuts_soils AS
SELECT b.id as clearcut_id, bedrock, cf_year, area_ha as full_area, round(CAST(ST_Area(ST_Intersection(a.geom, b.geom))/10000 as numeric),1) as area, ST_Intersection(a.geom, b.geom) as intersect_ab
FROM soils a INNER JOIN clearcuts b ON ST_Intersects(a.geom,b.geom);
Над пунктом 4 думаю.
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

Ответить

Вернуться в «Общие вопросы»

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

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