您如何将st_interpolate_aw与合法包含点和线相交的多边形图层一起使用?

时间:2019-09-03 07:37:27

标签: r gis sf

我正在尝试使用st_interpolate_aw()将值从一个多边形层分配给另一多边形层(将投票区的投票总数分配给普查区域)。该操作失败,因为st_interpolate_aw()调用st_intersection()会找到点和线的交点,然后将这些点和线的交点视为点,线或几何体集合,并将随后的代码转换几何体转换为多面体(我收到错误信息“ st_cast.POINT(x中的错误[1,至...):无法从POINT创建MULTIPOLYGON”)

在st_interpolate_aw中,相关代码如下所示,其中“ x”是我的第一个多边形层,“ to”是我的第二个多边形层:

i = st_intersection(st_geometry(x), st_geometry(to))
idx = attr(i, "idx")
i = st_cast(i, "MULTIPOLYGON")

如果我在运行st_intersection之后查看summary(i),则可以看到除所需的POLYGONS和MULTIPOLYGONS之外还创建了多个POINT,GEOMETRYCOLLECTIONS和LINESTRINGS。这本身不是一个凌乱的层的问题-比较这些类型的管理边界时,我们应该期望点和线的交点,但是它们与插值目的无关,可以合理地删除。问题是st_cast似乎没有设置配额。

我希望这个问题的答案是弄清楚可以通过st_interpolate_aw中的...设置哪些参数来更改st_intersection()或st_cast()的行为以使其工作。或者,可能会有一条路径通过st_set_precision()或st_snap()之类的技巧来预处理我的多边形,因此不会发生(请参阅来回here有点相关)。我已经在多边形上运行了st_is_valid(),它们很好。另外,我从根本上认为st_intersection在数据方面表现适当,并且st_cast不愿意放弃没有导致问题的区域的几何图形。

下面的示例并不能完全解决问题,但是它很小,它从vignette绘制多边形,并且在运行st_interpolate_aw()时产生与我的代码相同的错误。如果可以运行下面的示例,以便st_cast不返回错误,我想我可以让st_interpolate_aw工作

a <- st_polygon(list(cbind(c(0,0,7.5,7.5,0),c(0,-1,-1,0,0))))
b <- st_polygon(list(cbind(c(0,1,2,3,4,5,6,7,7,0),c(1,0,.5,0,0,0.5,
        -0.5,-0.5,1,1))))
c<-st_sfc(a,b)
plot(c)
i <- st_intersection(c[[1]],c[[2]])
i=st_cast(i,"MULTIPOLYGON")

1 个答案:

答案 0 :(得分:0)

感谢明确的示例。一个小的代表是

library(sf)
a <- st_polygon(list(cbind(c(0,0,7.5,7.5,0),c(0,-1,-1,0,0))))
b <- st_polygon(list(cbind(c(0,1,2,3,4,5,6,7,7,0),c(1,0,.5,0,0,0.5,
        -0.5,-0.5,1,1))))
c<-st_sfc(a,b)

aa = st_sf(value = 1, geom = c[1])
bb = st_sf(value = 2, geom = c[2])
cc = st_sf(value = 3, geom = c[1] + c(.5,.5))
st_interpolate_aw(aa, cc, extensive = TRUE)

cc = st_sf(value = 3, geom = c[1] + c(1,1))
st_interpolate_aw(aa, cc, extensive = TRUE)

st_interpolate_aw(aa, bb, extensive = TRUE)

现在,当您从github(https://github.com/r-spatial/sf/commit/6659234f0ac95bc0c1ebd64a2f26640137f9dbe8)安装sf时,这应该可以工作