我有一个csv文件,池塘区域和纬度和经度坐标为17,305个池塘。对于每个池塘,我想确定距离它1公里范围内所有池塘的坐标。我是R新手所以我认为我可以调整一些最近邻居代码。我在Crawley的The R Book中找到了这个循环:
x<-runif(100)
y<-runif(100)
par(pty="s")
plot(x,y,pch=16)
distance<-function(x1, y1, x2, y2) sqrt((x2 − x1)^2 + (y2 − y1)^2)
r<-numeric(100)
nn<-numeric(100)
d<-numeric(100)
for (i in 1:100) {
for (k in 1:100) d[k]<-distance(x[i],y[i],x[k],y[k])
r[i]<-min(d[-i])
nn[i]<-which(d==min(d[-i]))
}
for (i in 1:100) lines(c(x[i],x[nn[i]]),c(y[i],y[nn[i]]))
我改编了它并使用化石中的deg.dist函数,该函数使用Haversine公式而不是使用毕达哥拉斯。
install.packages("fossil")
library(fossil)
Pond_A<-read.csv("C:\\ PondArea_data\\Pond_areas.csv")
r<-numeric(17305)
nn<-numeric(17305)
d<-numeric(17305)
for (i in 1:17305){
for (k in 1:17305) d[k]<-with(Pond_A,deg.dist(Longitude[i],Latitude[i],Longitude[k],Latitude[k]))
r[i]<-min(d[-i])
nn<-which(d<=1)
}
这似乎给了我最后池塘1公里处所有池塘的身份。但尝试我可能无法弄清楚如何得到所有池塘的答案。如果有人能给我一个解决方案并且解释它为什么会起作用,我将非常感激。
谢谢,
艾丹
答案 0 :(得分:0)
您可以在rgeos包中使用gWithinDistance创建一个布尔矩阵。 row / col值表示sp对象的rownames。然后,您可以将矩阵强制转换为数据帧并分配回sp对象。对于此示例,我使用sp包中的meuse数据。
require(sp)
require(rgeos)
data(meuse)
coordinates(meuse) <- ~x+y
# Create boolean matrix where TRUE is distance condition is |nnd <= d| TRUE else FALSE
d=200
DistMat <- gWithinDistance(meuse, meuse, dist=d, byid=TRUE)
# Turn self-evaluation values to NA
diag(DistMat) <- NA
# Join back to data
cids <- colnames(DistMat)
DistMat <- as.data.frame(DistMat)
names(DistMat) <- paste("NID", cids, sep=".")
meuse@data <- data.frame(meuse@data, DistMat)
str(meuse@data)