Отримайте значення растрових даних з багатокутного накладання в GIS-рішеннях із відкритим джерелом


16

У мене два шари. Полігоноподібний шар з багатьма плитками і растровий шар, що містить наземний покрив CORINE 2006 з багатьма категоріями в кольоровій карті. Я хочу отримати для кожного багатокутника у шарі форми суму кожної категорії покривів растрового шару.

Наприклад, є багатокутник з id '2', і я хочу надати такі атрибути для цього багатокутника (у відсотках або квадратних метрах):

  • Рілля: 15%
  • Ліс: 11%
  • Вулиці: 2% (... і так одна)

Я намагався зробити це в траві, qgis (без функції), сазі (просто підсумовує кожне до загального значення) r (загальна сума), але я все ще не знайшов рішення. Більшість плагінів (зональна статистика в qgis) підтримує лише растрові шари 0-1. v.rast.stats також не допомогло. Я відкритий для будь-якого хорошого та розумного рішення !. Можливо, я навіть використав неправильний підхід або допустив помилки.

У Arcgis це завдання є досить простим, якщо я добре пам’ятаю, але я все одно пропускаю хороше рішення для вашого щоденного користувача Linux.

Я запускаю Linux-систему Debian, і саме тому я можу використовувати програми лише для цієї ОС.


EDIT: Оскільки це питання все ще має дуже багато переглядів і відвідувачів: я написав QGIS-плагін, який також здатний обчислити обкладинку растрового шару. Я ще не кодував багатокутну накладку, але її точно планували. Знайдіть плагін тут і спочатку встановіть бібліотеку Scipy.


Це однозначно можна зробити в R, це лише питання про розробку функцій. Потрібно накладати на растр кожен полігон, а потім скористатися таблицею (), щоб отримати підсумки пікселів "вирізаного файлом cookie". Пакети растрових, rgdal та rgeos можуть бути корисними. Прочитайте "Перегляд просторових завдань R" (Google знайде його)
— Spacedman

звичайно, але як я можу отримати таке резюме. Ви можете легко накладати шар багатокутника на шар растру з! Is.na (overlay (Poly, Raster)), але за допомогою таких команд, як Extra, я можу вирахувати лише загальну площу в пікселі, вирізаному файлом cookie, а не різними категоріями кольорової карти . Я не знав rgeos, але я переглянув api і не знайшов жодної функції для цього.
— Curlew

Перевірте r.univar в GRASS, дивіться travewiki.osgeo.org/wiki/Zonal_statistics
— markusN

Привіт! Дякуємо, що зробили плагін QGIS! Я просто хотів зазначити, що плагін виходить з ладу (> 13000 полігонів). Було б чудово, якби вона розділила завдання, щоб не розбитися. І було б чудово мати можливість додавати всі класи одразу (наприклад, так таблиця атрибутів отримує 2 нові поля LandcoverID та Landcover%, де обидва містять список CSV зі значеннями) :)
— Mfbaer

@Joran: Якщо ви думаєте, що це помилка, підніміть звіт про помилку, а не пишіть це у коментарі ( github.com/Martin-Jung/LecoS/isissue ). Крім того, 1) це не плагіни, щоб серіалізувати або пакетно обробляти ваші завдання. Потім запустіть його на менших підмножинах. 2) Звичайно. Можна було б додати багато чудових речей. Код з відкритим кодом,
— Curlew

Відповіді:


13

Використовуйте "витяг" для накладання функцій багатокутника з SpatialPolygonsDataFrame (який можна прочитати з файлу форми за допомогою maptools: readShapeSpatial) на растрі, а потім скористайтеся "таблицею" для підведення підсумків. Приклад:

> c=raster("cumbria.tif") # this is my CORINE land use raster
> summary(spd)
Object of class SpatialPolygonsDataFrame
[...]
> nrow(spd)  # how many polygons:
[1] 2
> ovR = extract(c,spd)
> str(ovR)
List of 2
 $ : num [1:542] 26 26 26 26 26 26 26 26 26 26 ...
 $ : num [1:958] 18 18 18 18 18 18 18 18 18 18 ...

Отже, мій перший багатокутник охоплює 542 пікселя, а другий - 958. Я можу підсумувати кожен з них:

> lapply(ovR,table)
[[1]]

 26  27 
287 255 

[[2]]

  2  11  18 
 67  99 792 

Отже, мій перший багатокутник - 287 пікселів 26 класу та 255 пікселів класу 27. Досить просто підсумовувати та ділити та помножувати на 100, щоб отримати відсотки.


Чудово, дякую багато за зусилля. Я спробую це і звіту :-)
— Керл

6

Я хотів звітувати назад і ось я. Рішення Spacedman чудово працювало, і я зміг експортувати всю інформацію для кожного багатокутника в моїй формі. На всякий випадок, якщо хтось має таку ж проблему, ось як я передував:

...
tab <- apply(ovR,table)
# Calculate percentage of landcover types for each polygon-field.
# landcover is a datastream with the names of every polygon
for(i in 1:length(tab)){
 s <- sum(tab[[i]])
 mat <- as.matrix(tab[[i]])
 landcover[i,paste("X",row.names(mat),sep="")] <- as.numeric(tab[[i]]/s)
}

3

якщо я правильно розумію, що ви хочете, і якщо припустити, що векторний шар "mypolygonlayer" та растровий шар "corina" вже є у вашій базі даних GRASS GIS:

Спочатку я перетворив би векторний в растровий. Кішка забезпечить вам один унікальний ідентифікатор на багатокутник. Якщо у вас стовпчик з унікальним числовим ідентифікатором, ви можете використовувати його. Стовпчик етикетки необов’язковий:

v.to.rast input = шар міполігонаграя = 1 вихід = використання міполігонів = cat labelcolumn = NameMappingUnit

Потім запустіть r.stats, щоб отримати статистику:

r.stats -a -l вхід = міполігони, сепаратор коріни =; вихід = / home / paulo / corinastats.csv

Останнім кроком є ​​відкриття corinastats.csv, наприклад, LibreOffice та створення зведеної таблиці або використання R для створення вашої перехресної таблиці


3

Я знаю, що ця публікація досить стара, але останнім часом я не хочу проводити аналогічний аналіз, але завантаження програм, таких як R, є клопотом на моєму робочому комп'ютері і потребує схвалення. Після багатьох годин дослідження методу, який я міг використовувати лише з QGis та Excel, я знайшов цей метод для мене найкращим і хотів запропонувати його людям у тій же ситуації.

  1. Відріжте полігон до шару растру (Растр → видобуток → Машинка: вхідний файл = растровий шар, виберіть ім'я та місцезнаходження вибору, натисніть на шар маски, виберіть полігон → ОК)

  2. Полігонізуйте шар кліпера (Растр → Перетворення → Полігонізм: вхідний файл = Ваш шар кліпу, збережіть результат → ОК)

  3. Розрахунок кількості пікселів (Клацніть на створеному вами файлі форми → калькулятор відкритого поля: позначте «Створити нове поле» та додайте ім'я поля, Функція = Геометрія → область → ОК). Тепер у вашій таблиці атрибутів має бути новий стовпець із зазначенням кількості кількості пікселів.

  4. Зберегти полігонічний шар (Клацніть полігонічний шар правою кнопкою миші, збережіть як: формат = файл DBF, збережіть як → ОК)

  5. Підсумовуючи кількість пікселів для кожного середовища існування (початок excel, відкритий файл, якщо у вас немає назв, додайте його зараз у кожний стовпець, натисніть на порожню клітинку, потрапили на вкладку DATA, консолідуйте, переконайтеся, що вона підсумована, натисніть на червона стрілка поруч із пунктом "перегляд ..." і виберіть два стовпці (включені заголовки), натисніть "додати" та поставте галочки "Верхній рядок" та "Лівий стовпець" → добре)

  6. Якщо, як і я, у вас є багато полігонів для аналізу та їх порівняння в одній таблиці, цей крок стане корисним. У новій робочій книжці excel перерахуйте номери своїх місць існування у стовпці A (для мене 1 - 48) та розмістіть два стовпці, які ви тільки що консолідували, у стовпцях B і C (місце проживання в B та кількість пікселів у C). У комірку D1 запишіть таку формулу: = IFNA (INDEX (C: C; MATCH (A2; B: B; 0)); "") та перетягніть (або двічі клацніть нижній правий кут) до останнього значення (так що якщо у вас 48 місць існування до клітини D48). Кількість пікселів тепер знаходиться у відповідних клітинках, де ви живете, і ви можете повторити цей процес для всіх своїх багатокутників.


2

Як щодо перетворення даних CORINE в набір даних векторного полігону за допомогою QGIS ( Растр> Перетворення> Полігонізація ), а потім за допомогою функції Union ( Вектор> Інструменти геопроцедури> Союз ) для об'єднання з полігонами. Отриманий векторний набір даних міститиме площі кожного класу CORINE у кожному багатокутнику.


дякую за цю пропозицію. Ще не думав про векторний союз. Можливо, я спробую це, якщо R-обробка якось не вдасться.
— Curlew

0

QGIS.

У магістралі QGIS є ще одна версія ZonalStats, вона називається Zonal Statistics.

Це виконує потрібну вам функцію.

Щодо робочого процесу, мені не зрозуміло, скільки у вас є растрових чи це просто смуги в растрі?


дякую за коментар, але зональна статистика їсть лише растр без категорій. Я використовую QGIS Trunk 1.9
— Curlew

0

На противагу більшості відповідей, поданих вище, я стверджую, що кращим варіантом є растеризація ваших багатокутників, а не робота з двома растровими наборами даних замість двох наборів даних багатокутника. Це набагато менш інтенсивно обробляє і, отже, єдине просте в реалізації рішення для обробки великих растрових та великих файлів полігонів у Р.

Після растрування полігонів в точно такій же мірі та роздільної здатності растрових даних ви можете скласти табличну підсумкову статистику, як пояснено тут , що підходить, якщо ваш растр вписується в пам'ять (малі / середні шари растру) або ви можете бінарнізувати кожну категорію за допомогою reclassфункції і ніж обчислювати zonalстатистику для кожного класу. Ось рішення, яке включає в себе функцію растерізації та зональної статистики в одну функцію і добре працює з дуже великими наборами даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.