我正在尝试在R中进行一些多边形/栅格工作。提取函数不能像我期望的那样工作。这是一个可重复的例子。
library(sf)
library(raster)
library(maptools)
raster <- download.file('https://raw.githubusercontent.com/JimShady/london_osm_canyons/master/test.tif', 'downloaded_raster')
raster <- raster('test.tif')
polygons <- read_sf('https://raw.githubusercontent.com/JimShady/london_osm_canyons/master/test2.geojson')
polygons <- st_transform(polygons, crs(raster)@projargs)
polygons$id <- 1
polygons <- as(polygons, 'Spatial')
new_polygon <- elide(polygons, rotate=-50)
proj4string(new_polygon) <- crs(raster)@projargs
polygons <- rbind(polygons, new_polygon)
plot(raster)
plot(polygons, add=T)
我想得到每个多边形与之相交的单元格数,即使它们是NA,并将它们作为列存储在多边形中
polygons$cell_count <- extract(raster, polygons, fun = function(x,...)length(x), na.rm=F)
但是当多边形与光栅的5个以上的单元格相交时,这会返回多边形1的数字5。 这是怎么回事?
然后我想得到加权平均值。如果有任何NA细胞相交,则应该“失败”并返回NA。 我认为这样做有效,但由于上述情况不对,我现在对我的方法不太自信。polygons$mean <- round(extract(raster, polygons, fun = mean, weights=T, na.rm=F),2)
我也想知道相交的单元格数小于一。我不知道该怎么做。有人有个好主意吗?
polygons$almost_zero <-
感谢您的帮助。
答案 0 :(得分:2)
来自extract
帮助:
如果单元格的中心位于多边形内部,则会覆盖单元格(但请参阅 用于考虑部分覆盖细胞的权重选项;和论点 无论如何都要获得小多边形的值。)
因此,您可以使用它来获得单元格数:
data <- extract(raster, polygons, weights = T, na.rm = F)[[1]]
nrow(data)
#[1] 18
data
的位置:
value weight
[1,] 8 0.003610108
[2,] 6 0.025270758
[3,] 0 0.010830325
[4,] 7 0.104693141
[5,] 0 0.066787004
[6,] 0 0.088447653
[7,] 0 0.001805054
[8,] 0 0.104693141
[9,] 0 0.010830325
[10,] 0 0.093862816
[11,] 0 0.030685921
[12,] 0 0.063176895
[13,] 0 0.057761733
[14,] 0 0.063176895
[15,] 7 0.003610108
[16,] 7 0.102888087
[17,] 0 0.093862816
[18,] 0 0.074007220
要使相交的单元格数小于1:
sum(data[, 1] < 1)
#[1] 13
修改强>
如果是多个多边形,则应首先使用rgeos::gUnaryUnion
解析多边形:
library(rgeos)
polygons$id <- 1
polygons <- gUnaryUnion(polygons, id = polygons$id)
# As suggested by @RobertHijmans, you can also use `raster::aggregate`
# polygons <- raster::aggregate(polygons, by = "id")
plot(raster)
plot(polygons, add = T)
答案 1 :(得分:1)
通过查找质心位于多边形内的单元格,提取行为符合要求。处理部分覆盖的一种方法是使用rasterize
将多边形转换为栅格掩码。请注意,在下面我分别重命名了您的栅格和多边形r1和p1。因为对象使用函数名称不是很好的做法:
r_mask = rasterize(p1, r1, getCover=TRUE)
r_mask[r_mask==0] = NA
现在我们可以使用这个掩码来获取你想要的值:
r2 = mask(r1, r_mask)
cellStats(!is.na(r2), sum)
# [1] 18
cellStats(r2, mean)
# [1] 1.944444
要查找少于一个的单元格,我们可以
cellStats(r2<1, sum)
# [1] 13