使用 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')
我正在尝试使用 sf
包中的 sf_intersection()
函数来识别两个不同多边形的公共边界。
我在我的数据中尝试了这个
我的数据是来自 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')