通过 r 中的“...”将多个坐标集动态传递给 spPolygons或重叠多边形的总和和绘图值

问题描述

我希望对 r 中重叠多边形的属性值求和。

@Robert Hijmans 解决方here 使用 raster::sppolygonsunion 完成了我想要做的事情:

图 1

library(raster)
#install.packages("rgeos")
#install.packages("sf")
library(sp)

p1 <- cbind(c(1,4,1),c(1,1,4))
p2 <- cbind(c(3,5,3),c(3,3,5))
p <- sppolygons(p1,p2,crs = "+proj=longlat +datum=wgs84",attr = data.frame(ID = 1:2,Rate = c(50,100)))

x <- union(p)
ud <- data.frame(x)
ud$count <- NULL

udrate <- t( t(ud) * p$Rate )
x$Rate <- rowSums(udrate)

data.frame(x)

# ID.1 ID.2 count Rate
#1    1    0     1   50
#2    0    1     1  100
#3    1    1     2  150

如图所示,多边形 1 和 2 的速率值分别为 50 和 100,重叠区域的速率值为 150 (50 + 100)。

我的挑战与 sppolygons(x,...,crs,attr) 相关,其中“x”是一个矩阵或矩阵列表,其中包含定义多边形的 xy 坐标,而“...”是额外的列表/矩阵集。

在上面的示例手动定义坐标集 p1 和 p2 的地方,我希望从数据框动态创建“x”和“...”。长格式数据帧结构包括x、y和ID。我在下面的示例中使用相同的坐标进行比较,但实际上,可能有任意数量的多边形,而且它们可能比正方形(可能是圆形)更复杂。

图 2

# sample coordinate sets as long-format data frame
d <- data.frame(x = c(1,y = c(1,5),ID = c("a","a","b","b")) 

我试过传递 x 的坐标集列表,但没有任何运气。

图 3

l <- split(d[,c("x","y")],d$ID)

p <- sppolygons(l,100)))

#Error in (function (classes,fdef,mtable)  : 
#  unable to find an inherited method for function ‘coordinates’ for signature ‘"numeric"’

将列表中的坐标集转换为矩阵后,我再次尝试。

图 4

l <- split(d[,d$ID)
l <- lapply(l,FUN = as.matrix)

p <- sppolygons(l,100)))

#Error in sppolygons(l,: 
#  number of rows in attr (2) does not match the number of polygons (1)

sppolygons() 不能将矩阵列表识别为多个集合(它看到一个对象,而不是两个)。

我没有嫁给 sppolygons/union 方法。这是我发现的第一个/最干净的解决方案,可以满足我的需求。如果它有助于确定替代解决方案,我将最终绘制结果。 sppolygons 具有计算每个多边形内定位标签 (labpt) 中心点的额外好处。

图 5

library(ggplot2)
library(raster)
#install.packages("rgeos")
#install.packages("sf")
library(sp)

# Need to automate this step
p1 <- cbind(c(1,100)))

x <- union(p)
ud <- data.frame(x)
ud$count <- NULL

udrate <- t( t(ud) * p$Rate )
x$Rate <- rowSums(udrate)

data.frame(x)

x$labpt.x <- sp::coordinates(x)[,1]
x$labpt.y <- sp::coordinates(x)[,2]

ggplot(data = sf::st_as_sf(x))+
  geom_sf(aes(fill = Rate),alpha = 0.5,colour = "lightgray")+
  geom_label(aes(x = labpt.x,y = labpt.y,label = Rate))+
  scale_fill_gradient(low = "#ffffff",high = "#00ff00")

产生一些功能如下:

overlapping polygons

问题的简短版本:

从图 2 中的数据格式“d”开始,如何获得图 5 的结果?

有没有办法在 sppolygon 方法中通过“...”动态创建和传递多个坐标集?如果是这样,如何?如果没有,我应该探索另一种方法吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)