如何利用和操纵“RasterBrick”中的土地覆盖图进行R区域加权统计?

时间:2018-05-09 09:13:55

标签: r geospatial raster data-manipulation

我有raster格式的土地覆盖图,可能用于计算德国的面积加权年平均温度。我从这里下载了这片土地覆盖地图数据(direct download link of land coverage map for Europe)。特别是,我打算提取城市,农业区的土地/土壤覆盖率数据,反之亦然。在我的第一步中,我使用library(raster) library(R.utils) library(maptools) url = "https://cidportal.jrc.ec.europa.eu/ftp/jrc-opendata/LUISA/PrimaryOutput/Europe/REF-2014/JRC_LUISA_Input_Corine_land_cover_2006_r_ref_2014.zip" download.file(url, basename(url)) gunzip(basename(url)) rname <- list.files(getwd(), "tif$") land_cover = raster::brick("~/LUISA_CLC_land_coverage/clc06_r.tif") 包导入了此土地覆盖数据。以下是我的R脚本:

RasterBrick

到目前为止,我可以在R中的maptools对象中导入原始土地覆盖地图。请注意原始地图覆盖整个欧洲,所以我 必须裁剪我感兴趣的区域。为此,我使用rasterdata(wrld_simpl) germany <- wrld_simpl[wrld_simpl@data$NAME == "Germany",] germany <- spTransform(germany, CRSobj = land_cover@crs) germany_land <- crop(land_cover, germany) 包来剪裁地图。这是下面的R脚本:

RasterBrick

但是,我假设shapefile对象中的这个裁剪的土地覆盖图更好地处于网格library(maptools) library(rgdal) library(R.utils) url = "http://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/nuts/download/ref-nuts-2013-03m.shp.zip" download.file(url, basename(url)) gunzip(basename(url)) getwd() setwd("~/ref-nuts-2013-03m.shp/") list.files(pattern = 'NUTS_RG_03M_2013.*.shp$') eu <- readOGR(dsn = getwd(), layer ="NUTS_RG_03M_2013_4326_LEVL_2") Germany_NUTS3 <- eu[eu@data$CNTR_CODE == "DE",] 中,具有非常高的分辨率,但它是如何可行的?任何的想法?

提出这个问题的要点是我需要检索城市,农业区域的所有土地/土壤覆盖数据,并将此信息与各自的德国NUTS级别的shapefile(download link of Germany level 3 shapefile)相匹配。

我真的不知道如何利用这块土地覆盖图中的数据来计算面积加权的年平均温度。也许,一种可能的方法是检索城市的土地/土壤覆盖率,农业区数据,然后从德国NUTS-3级别shapefile中找到匹配。

以下是如何获得德国&#39; NUTS-3 shapefile(R脚本如何获得德国&#39; NUTS-3区域&#39;在R中的shapefile):

Germany_NUTS3

所以使用这个Gernamny&#39; NUTS-3 shapefile,RasterBrick,我想提取城市,农业区的土地/土壤覆盖率的所有数据,反之亦然。

如果从phones中的土地覆盖图中提取数据,我怎样才能在R中实现这一点?那可行吗?完成这项任务的有效解决方法是什么?任何的想法?

1 个答案:

答案 0 :(得分:3)

正如我们在评论和聊天中所讨论的那样,这将是一种快速而肮脏的方法(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)

现在,您可以使用栅格包中的extract提取NUTS区域的landcover像素。

请注意:这可能需要一些时间,特别是如果区域或栅格很大或者您有许多多边形。如果您需要重复执行此操作,则可能需要使用其他方法。

例如,我将为其中一个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平方米。

要确定所需类别的土地覆盖值,我们可以查看栅格附带的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之间。获得一个区域&#34;估计&#34;我们可以计算单个像素区域的像素数。

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是包含每个多边形元素的列表(即如果您使用了完整的shapefile),则可以使用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)