我有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
对象中导入原始土地覆盖地图。请注意原始地图覆盖整个欧洲,所以我
必须裁剪我感兴趣的区域。为此,我使用raster
和data(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中实现这一点?那可行吗?完成这项任务的有效解决方法是什么?任何的想法?
答案 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)