我有一个包含+ 500k行的表,其中坐标x
,y
按shapeid
分组(总共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的物理邻居?
答案 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多边形距离。最终,你将获得一个距离矩阵。