Отримайте значення растрових даних з багатокутного накладання в 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.