我正在尝试使用sf_intersection()
包中的sf
函数来识别两个不同多边形的公共边界。
我在数据中尝试过此simple approach,该数据来自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
中的线的一部分(它们是红色而不是蓝色)。
我不知道为什么会这样。任何提示或建议将不胜感激。谢谢!
答案 0 :(得分:1)
这是边界上的局部不精确。对于大多数矢量数据格式,共享的POLYGON边框在每个邻居中都是重复的。坐标中的细微差异并不需要太多,就可以使两个边界的交点不完整。
恐怕这不是解决方案。
本节显示了这类问题。查看窗口是:
> 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英尺。
答案 1 :(得分:1)
@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')