寻找所有点与多边形边界之间的最小距离

3

我希望能够找到点与多边形边界之间的最小距离(所有点都在多边形内部)。如果可以的话,请问如何提取这些值?这样我就可以找到个体数量和距离边界的相关性。

多边形以.SHP格式给出,点以X/Y坐标表示。

如果有任何缺失信息,请告诉我!非常感谢您的帮助!

3个回答

7

单位正方形多边形:

library(sp)
x = cbind(c(0,1,1,0,0),c(0,0,1,1,0))
pol = SpatialPolygons(list(Polygons(list(Polygon(x)), "ID")))

单位正方形中的随机点:

set.seed(131)
pts = SpatialPoints(cbind(runif(10), runif(10)))
plot(pol)
points(pts, col = 'red')

计算距离:

library(rgeos)
gDistance(pts, pol, byid = TRUE) # will be 0, all inside
gDistance(pts, as(pol, "SpatialLines"), byid = TRUE) # dist to line

添加至图表:

text(coordinates(pts),
  as.character(
    round(as.vector(gDistance(pts, as(pol, "SpatialLines"), byid = TRUE)), 3)),
pos = 4)

使用rgdal包中的readOGR函数,将你的多边形数据从shapefile文件中读入R中。


4

spatstat包含一个nncross函数,用于找到两组点或一组点和一组线段之间的最近邻。

加载一组x/y值创建一个spatstat点模式对象相对容易:如果X和Y是包含您坐标的两个向量,则可以使用以下命令创建一个点模式对象:

library(spatstat)
p = ppp(x,y)

您需要将shp数据转换为spatstat段落模式对象。为此,您可以使用maptools命令加载shp文件,然后将其转换为spatstat对象:

library(maptools)
shp = readShapeSpatial("yourdata.shp") #read shp file
shp = as.psp(shp) # convert to psp object

要计算最近邻距离,您需要使用nncross。

nncross(p,shp)

我创建.ppp对象时没有问题,但是当我尝试将.shp文件转换为.psp时,出现了一个错误,显示为:Error in as.psp.default(shp) : 无法将x解释为线段模式。有什么建议吗? - Renzo Ferreira
这里有一个文档(http://cran.r-project.org/web/packages/spatstat/vignettes/shapefiles.pdf),可能会对您有所帮助。maptools识别您的shp文件可能存在问题。在执行`readShapeSpatial()`函数后,您的数据属于哪个类别(class())? - xraynaud
该类是[1]“SpatialPolygonsDataFrame”。 - Renzo Ferreira
在某种程度上,这不是正确的答案。点与折线之间的最小距离不一定是折线节点之一。但是,nncross确实可以做到这一点:仅查找折线的最近节点。如果我想知道到折线上任何点的最小距离怎么办? - agoldev
1
请问您能否开发一下?我的系统上没有这种行为。如果我使用 line = psp(0.25,0.5,0.75,0.5,window=owin(c(0,1),c(0,1))) 创建一个psp线段,以及点集 pts = ppp((1:9)/10, rep(0.25,length.out=9)),则 nncross(pts,line) 返回所有具有 0.25 >= x值 >= 0.75 的点的距离为0.25。参数的顺序很重要:nncross(line,pts) 返回线段节点和其中一个点之间的最小距离。 - xraynaud

3

按照 @xraynaud 的步骤进行(稍作修改):

library(maptools)
shp = readShapeSpatial("yourdata.shp") #read shp file
W = as.owin(shp) # convert to owin object

library(spatstat)
p = ppp(x, y, window = W)

现在p是一个点形态,其中包含由多边形限定的点。为了计算每个点到边界多边形的距离(通常在spatstat术语中称为窗口):

d = bdist.points(p)

现在,d是一个距离向量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接