找到相邻的多边形R.

时间:2014-09-10 09:00:43

标签: r coordinates

我有一个包含+ 500k行的表,其中坐标xyshapeid分组(总共289个ID)并形成一个多边形。

shapeid      x           y
1            679400.3   6600354
1            679367.9   6600348
1            679313.3   6600340
1            679259.5   6600331
1            679087.5   6600201
0            661116.3   6606615
0            661171.5   6606604
0            661182.7   6606605
0            661198.9   6606606
0            661205.9   6606605
...          ...        ...

我想找到相交或彼此最接近的坐标,实质上找到每个shapeid的物理邻居

结果应该类似于:

shapeid shapeid_neighbour1   shapeid_neighbour2

所以我尝试使用sp和rgeos如下:

library(sp)
library(rgeos)

mydata <- read.delim('d:/temp/testfile.txt', header=T, sep=",")

sp.mydata <- mydata
coordinates(sp.mydata) <- ~x+y

当我上课时,一切都很好看:

class(sp.mydata)
[1] "SpatialPointsDataFrame"
attr(,"package")
[1] "sp"

我现在尝试计算每个点的距离:

d <- gDistance(sp.mydata, byid=T)

R Studio遇到致命错误。有什么想法吗?我的计划是使用:

min.d <- apply(d, 1, function(x) order(x, decreasing=F)[2])

找到第二个最短距离,即最近点。但也许这不是做我想做的最好的方法 - 找到每个shapeid的物理邻居?

1 个答案:

答案 0 :(得分:1)

假设数据框的每个shapeid标识多边形的顶点,首先需要从坐标创建SpatialPolygons对象,然后应用函数gDistance来了解距离在任何一对多边形之间(假设这是你正在寻找的)。要创建SpatialPolygons,您需要Polygons,然后又需要Polygon个对象。您可以在sp下的Polygon包的帮助页面中找到详细信息。

您可能很快就会发现问题:每个多边形的坐标必须关闭,即最后一个顶点必须与每个shapeid的第一个顶点相同。据我所知,你的数据似乎并非如此。因此,您应该“手动”为数据的每个子集添加一行。

您可以尝试这一点(假设df是您的起始数据帧):

    require(rgeos)
    #split the dataframe for each shapeid and coerce to matrix
    coordlist<-lapply(split(df[,2:3],df$shapeid),as.matrix)
    #apply the following command only if the polygons don't close
    #coordlist<-lapply(coordilist, function(x) rbind(x,x[1,]))
    #create a SpatialPolygons for each shapeid
    SPList<-lapply(coordlist,function(x) SpatialPolygons(list(Polygons(list(Polygon(x)),1))))
    #initialize a matrix of distances
    distances<-matrix(0,ncol=length(SPList),nrow=length(SPList))
    #calculate the distances
    for (i in 1:(length(SPList)-1))
      for (j in (i+1):length(SPList))
        distances[i,j]<-gDistance(SPList[[i]],SPList[[j]])

这可能需要一些时间,因为您正在计算289 * 288/2多边形距离。最终,你将获得一个距离矩阵。