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

时间:2019-12-18 22:06:24

标签: r gis sf

我正在尝试使用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')

最终情节得出以下结果:

enter image description here

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

2 个答案:

答案 0 :(得分:1)

这是边界上的局部不精确。对于大多数矢量数据格式,共享的POLYGON边框在每个邻居中都是重复的。坐标中的细微差异并不需要太多,就可以使两个边界的交点不完整。

恐怕这不是解决方案。

本节显示了这类问题。查看窗口是:

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

example gap

那条银条只有大约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英尺。

enter image description here

答案 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')
相关问题