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

How do you use st_interpolate_aw with polygon layers that legitimately include point and line intersections?

我正在尝试使用 st_interpolate_aw() 将一个多边形图层的值分配给另一个多边形图层(分配给人口普查区的投票区选票总数)。该操作失败,因为 st_interpolate_aw() 调用 st_intersection() 找到点和线的交点,然后将其视为点、线或几何集合,并将后续代码将几何转换为多面体(我得到错误"Error in st_cast.POINT(x[1], to, ...) : cannot create MULTIPOLYGON from POINT")

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

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

如果我在 运行ning st_intersection 之后查看摘要 (i),我可以看到除了所需的 POLYGONS 和 MULTIPOLYGONS 之外还创建了多个 POINTS、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 就不会 return 一个错误我想我可以让 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")

感谢您提供清晰的示例。一个小的代表是

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 时,这应该可以正常工作