自适应最近邻 R 代码以识别每个池塘 1 公里范围内的池塘位置

Posted

技术标签:

【中文标题】自适应最近邻 R 代码以识别每个池塘 1 公里范围内的池塘位置【英文标题】:Adaptation of nearest neighbour R code to identify locations of ponds within 1 km for each pond 【发布时间】:2013-08-28 20:27:25 【问题描述】:

我有一个 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 公里内所有池塘的身份。但是尽我所能,我无法弄清楚如何为所有池塘找到答案。如果有人能给我一个解决方案并解释它为什么有效,我将不胜感激。

谢谢,

艾丹

【问题讨论】:

您看过sp 包吗?其中的spDists 函数应该为您提供一些易于使用的功能。 【参考方案1】:

您可以使用 rgeos 包中的 gWithinDistance 创建一个布尔矩阵。 row/col 值表示 sp 对象的行名。然后,您可以将矩阵强制转换为数据框并分配回 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)

【讨论】:

非常感谢您的回答。抱歉这么久才回复我想确保我理解答案并可以应用它。意识到如果我使用纬度/经度坐标,距离将以度为单位,所以我需要转换为东向和北向。

以上是关于自适应最近邻 R 代码以识别每个池塘 1 公里范围内的池塘位置的主要内容,如果未能解决你的问题,请参考以下文章

从公里 (km) 转换为十进制度

R中的空间最近邻分配

为 R 中的列表长度分析重新组织数据集

k-最近邻,其中每个类中的对象数差异很大

使用最近邻算法进行图像模式识别

提取手写数字的属性以紧固最近邻算法