使用 R 中的简单特征库识别多边形的公共边界

Identifying common borders of polygons using the Simple Features library from R

我正在尝试使用 sf 包中的 sf_intersection() 函数来识别两个不同多边形的公共边界。

我在我的数据中尝试了这个 ,它来自一个 shapefile,但它并没有像我预期的那样工作。

我的数据是来自 this repository 的 shapefile 名称 "zones",这是我尝试过的:

library(sf)
library(ggplot2)

zones <- st_read('./Data/zones.shp')
zones$id <- seq(nrow(zones))
borders <- st_intersection(zones, zones)
borders <- borders[borders$id != borders$id.1, ]

ggplot() +
  geom_sf(data = zones, color='red', fill=NA) +
  geom_sf(data = borders, color = 'navy')

最终的情节产生了这样的结果:

如果仔细观察,您会注意到多边形内线的某些部分不属于 borders 中的线(它们是红色而不是蓝色)。 我不知道为什么会这样。任何提示或建议将不胜感激。谢谢!

边界局部不精确。对于大多数矢量数据格式,共享的 POLYGON 边界在每个邻居中都是重复的。坐标上的微小差异不会使两条边界的交点不完整。

恐怕这不是解决方案。

这部分显示了问题的种类。视图 window 是:

> par('usr')
[1]  764968.2  765650.8 2945266.2 2945890.9

那条条子只有3米左右宽

编辑:只是为了添加我对使用 st_snap 的解决方案的尝试。这似乎在某些地方起到了作用,但并不始终如一。感觉它没有按预期工作。另外,请注意投影使用美国英尺作为单位,这让我很困惑。

z1 <- st_geometry(zones[1,])
z2 <- st_geometry(zones[2,])

z1 <- st_cast(z1, 'LINESTRING')
z2 <- st_cast(z2, 'LINESTRING')

z1s <- st_snap(z1, z2, 1000)

border <- st_intersection(z1s, z2)

捕捉公差超出了顶部 - 区域之间的间隙似乎小于 10 英尺 - 但即使有这么大的公差,实际边界也有缺失的部分。更奇怪的是,结果有一个完全出乎意料的延伸,从实际交叉路口开始超过 6500 英尺。

@David_O 确定了问题 - POLYGON 边界实际上并没有接触到整个共享边界,因此 st_intersection 不会这样识别它们。

一个解决方法可能是 st_buffer 你的区域对象在相交之前,虽然这是一个粗略的解决方法:

borders <- st_intersection(st_buffer(zones, 5), st_buffer(zones, 5))

borders <- borders[borders$id != borders$id.1, ]

ggplot() +
  geom_sf(data = zones, color='red', fill="transparent") +
  geom_sf(data = borders, color = 'navy')