Как мы обсуждали в комментариях и в чате, это был бы быстрый и грязный метод (подход JRC, среди прочего, был бы, безусловно, лучшим способом сделать это, но также и гораздо больше усилий)
Итак, у вас есть земельный покров land_cover
и ваши регионы NUTS над Германией Germany_NUTS3
:
# you can take the raster function since it's only one layer
land_cover <- raster::raster("~/LUISA_CLC_land_coverage/clc06_r.tif")
eu <- readOGR(dsn = getwd(), layer ="NUTS_RG_03M_2013_4326_LEVL_2")
Germany_NUTS3 <- eu[eu@data$CNTR_CODE == "DE",]
# you can use Germany_NUTS straight for cropping the landcover, so we'll project it to the raster's coordinate system
Germany_NUTS3_projected <- spTransform(Germany_NUTS3, CRSobj = land_cover@crs)
land_cover_germany <- crop(land_cover, Germany_NUTS3_projected)
Теперь вы можете извлекать пиксели покрытия для региона NUTS, используя extract
из растрового пакета.
ВНИМАНИЕ: это может занять некоторое время, особенно если область или растр велики или у вас много полигонов. Если вам нужно делать это повторно, вы можете использовать другой подход.
В качестве примера я сделаю это для одного из регионов NUTS:
pixel_extract <- raster::extract(land_cover_germany,Germany_NUTS3_projected[2,])
Если вы используете больше полигонов одновременно, pixel_extract
будет списком векторов со значениями пикселей, причем каждый элемент представляет отдельный полигон.
В этом примерном случае есть только один элемент, показывающий значения класса Landcover для пикселей в этом многоугольнике:
> head(pixel_extract)
[[1]]
[1] 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
[24] 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
[47] 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
[70] 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
[93] 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24
[116] 24 24 24 24 24 24 24 24 24 24 24 24 24 24 23 23 24 24 24 24 24 24 24
[139] 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 4 ...
Теперь, чтобы получить область, охватываемую вашими интересующими вас классами, вам нужно посчитать пиксели, а затем умножить их на площадь одного пикселя.
Поскольку разрешение одного пикселя составляет 100 на 100 метров, площадь составляет 10000 м2.
Чтобы определить значения земного покрова для желаемых классов, мы можем взглянуть на файл LUISA_legend.xls
, который поставляется с растром:
GRID_CODE CLC_CODE LABEL
1 111 Artificial surfaces
2 112 Artificial surfaces
3 121 Artificial surfaces
4 122 Artificial surfaces
5 123 Artificial surfaces
6 124 Artificial surfaces
7 131 Artificial surfaces
8 132 Artificial surfaces
9 133 Artificial surfaces
10 141 Artificial surfaces
11 142 Artificial surfaces
12 211 Agricultural areas
13 212 Agricultural areas
14 213 Agricultural areas
15 221 Agricultural areas
16 222 Agricultural areas
17 223 Agricultural areas
18 231 Agricultural areas
19 241 Agricultural areas
20 242 Agricultural areas
21 243 Agricultural areas
22 244 Agricultural areas
Таким образом, для подсчета пикселей мы просто видим, какие значения находятся в диапазоне от 1 до 11 для искусственных поверхностей и от 12 до 22 для сельского хозяйства. Чтобы получить «оценку» площади, мы можем рассчитать количество пикселей с площадью одного пикселя.
areas <-data.frame(ARTIFICIAL_AREA=sum(pixel_extract[[1]]>=1 & pixel_extract[[1]]<=11) * (100*100),
AGRICULTURE_AREA=sum(pixel_extract[[1]]>=12 & pixel_extract[[1]]<=22) * (100*100))
Это дает оценку площади в квадратных метрах:
> areas
ARTIFICIAL_AREA AGRICULTURE_AREA
1 954030000 9282970000
Если pixel_extract
является списком с элементом на полигон (то есть, если вы использовали полный шейп-файл), вы можете вычислить области с помощью lappy
и использовать do.call(rbind,
для создания одного фрейма данных:
areas <- lapply(pixel_extract, function(x) data.frame(ARTIFICIAL_AREA=sum(x >=1 & x <=11) * (100*100),
AGRICULTURE_AREA=sum(x>=12 & x<=22) * (100*100))
areas_df <- do.call(rbind,areas)