我希望能够找到点与多边形边界之间的最小距离(所有点都在多边形内部)。如果可以的话,请问如何提取这些值?这样我就可以找到个体数量和距离边界的相关性。
多边形以.SHP格式给出,点以X/Y坐标表示。
如果有任何缺失信息,请告诉我!非常感谢您的帮助!
单位正方形多边形:
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中。
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)
按照 @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
是一个距离向量。
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