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

使用R中的简单特征库识别多边形的公共边界,r,gis,sf,R,Gis,Sf,我试图使用sf包中的sf\u intersection()函数来识别两个不同多边形的公共边界 我在我的数据中尝试了这个方法,它来自一个shapefile,但它并没有像我预期的那样工作 我的数据是来自的shapefile名称“zones”,这是我尝试过的: library(sf) library(ggplot2) zones <- st_read('./Data/zones.shp') zones$id <- seq(nrow(zones)) borders <- st_int

我试图使用
sf
包中的
sf\u intersection()
函数来识别两个不同多边形的公共边界

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

我的数据是来自的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')
库(sf)
图书馆(GG2)

分区边界局部不精确。对于大多数矢量数据格式,共享多边形边界在每个相邻区域中都是重复的。不需要太多的坐标差,两条边界的交点就不完整了

恐怕这不是解决办法

本节显示了问题的类型。视图窗口为:

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

那条子只有3米宽

编辑:只需使用
st_snap
添加我的解决方案尝试。这似乎在某些地方起到了作用,但并非始终如一。感觉它不像预期的那样工作。另外,请注意,投影使用我们的脚作为单位,这让我很困惑


z1边界局部不精确。对于大多数矢量数据格式,共享多边形边界在每个相邻区域中都是重复的。不需要太多的坐标差,两条边界的交点就不完整了

恐怕这不是解决办法

本节显示了问题的类型。视图窗口为:

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

那条子只有3米宽

编辑:只需使用
st_snap
添加我的解决方案尝试。这似乎在某些地方起到了作用,但并非始终如一。感觉它不像预期的那样工作。另外,请注意,投影使用我们的脚作为单位,这让我很困惑


z1@David_O发现了这个问题-多边形边界实际上不会在整个共享边界上接触,因此
st_交叉点
不会将其识别为该问题

一种解决方法可能是在相交之前对分区对象进行
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')

borders@David_O发现了这个问题-多边形边界实际上不会在整个共享边界上接触,因此
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')


borders谢谢,这是我看到结果时第一个想到的想法。我会尝试寻找这个问题的可能解决方案,如果我能找到的话,我会发布它。我曾经尝试过
st_snap
,我的直觉认为它应该以给定的公差将一个多边形的顶点捕捉到另一个多边形,但它似乎不像我预期的那样工作,这是我看到结果时第一个想到的想法。我会尝试寻找这个问题的一个可能的解决方案,如果我能找到的话,我会发布它。我一直在玩
st_snap
,我的直觉认为它应该以给定的公差将一个多边形的顶点捕捉到另一个多边形,但它似乎并不像我所期望的那样工作,正如@David_O提到的,边界实际上不是共享的,因此不相交。例如,试试看:
ggplot(data=zones)+geom_sf()+xlim(c(768824.770092.5))+ylim(c(2944198.62940.3))
您将看到两条线串分开的部分。在相交之前,您可以尝试
st_buffer
您的分区对象。我用过的修复多边形晶格以修复非重叠边界或重叠碎片的最好方法是:-需要一些装配。正如@David_O提到的,边界实际上不是共享的,因此不相交。例如,试试看:
ggplot(data=zones)+geom_sf()+xlim(c(768824.770092.5))+ylim(c(2944198.62940.3))
您将看到两条线串分开的部分。在相交之前,您可以尝试
st\u buffer
您的分区对象。我用过的修复多边形晶格以修复非重叠边界或重叠碎片的最好方法是:-需要一些装配。这是一个很好的修复方法。问题是,它将返回一个围绕边界的10米宽多边形,而不是一条线串。诚然,我怀疑你已经得到了一个多边形或几何集合。如果这只是为了显示,这可能对你很有用,但是如果你为了分析的目的在边界之后作为一个几何体,这可能是一个问题。太好了!事实上,使用
st_buffer()
是我的问题的一个解决办法,嗯,是的-我认为它可以用于简单的绘图,但不是很准确。我认为有一个
st_snap
解决方案。让我调查一下..我尝试使用
st_snap
返回的GEOMETRYCOLLECTION一端有一个奇数多边形。不幸的是,我对
sf
对象和空间谓词的处理不够好,无法理解为什么会发生这种情况或如何解决它。这是一个很好的解决方法。问题是,它将返回一个围绕边界的10米宽多边形,而不是一条线串。诚然,我怀疑你已经得到了一个多边形或几何集合。如果这只是为了显示,这可能对你很有用,但是如果你为了分析的目的在边界之后作为一个几何体,这可能是一个问题。太好了!事实上,使用
st_buffer()
是我的问题的一个解决办法,嗯,是的-我认为它可以用于简单的绘图,但不是很准确。我认为有一个
st_snap
解决方案。让我调查一下..我尝试使用
st_snap
返回的GEOMETRYCOLLECTION一端有一个奇数多边形。不幸的是,我对
sf
对象和空间p不够好