k最近的邻居**在球体上**

时间:2016-11-23 14:41:42

标签: r nearest-neighbor

我试图使用R

在球体上找到k-最近邻居

当我处理百万分时,暴力不是一种选择。

有谁知道我该怎么办?谢谢

1 个答案:

答案 0 :(得分:3)

使用Ben Bolker提供的链接,我设法解决了我的问题。

lonlat2xyz=function (lon, lat, r) 
{
lon = lon * pi/180
lat = lat * pi/180
if (missing(r)) 
    r <- 6378.1
x <- r * cos(lat) * cos(lon)
y <- r * cos(lat) * sin(lon)
z <- r * sin(lat)
return(cbind(x, y, z))
}

lon1=runif(100,-180,180);lon2=runif(100,-180,180);lat1=runif(100,-90,90);lat2=runif(100,-90,90)

xyz1=lonlat2xyz(lon1,lat1)
xyz2=lonlat2xyz(lon2,lat2)

library(nabor)

out=knn(data=xyz1,query = xyz2,k=20)

library(maps)

map()
points(lon1,lat1,pch=16,col="black")
points(lon2[1],lat2[1],pch=16,col="red")
points(lon1[out$nn.idx[1,]],lat1[out$nn.idx[1,]],pch=16,col="blue")

请注意knn函数给出的距离不是地理距离!