我需要计算两个点矩阵之间的最短距离。我是R的新手,并不知道如何做到这一点。这是我以前在数据中调用并将它们转换为点
的代码library(dismo)
laurus <- gbif("Laurus", "nobilis")
locs <- subset(laurus, select = c("country", "lat", "lon"))
#uk observations
locs.uk <-subset(locs, locs$country=="United Kingdom")
#ireland observations
locs.ire <- subset(locs, locs$country=="Ireland")
uk_coord <-SpatialPoints(locs.uk[,c("lon","lat")])
ire_coord <-SpatialPoints(locs.ire[,c("lon","lat")])
crs.geo<-CRS("+proj=longlat +ellps=WGS84 +datum=WGS84") # geographical, datum WGS84
proj4string(uk_coord) <-crs.geo #define projection
proj4string(ire_coord) <-crs.geo #define projection
我需要计算从爱尔兰的点到英国的点的最短距离(欧几里德)。换句话说,我需要计算从爱尔兰的每个点到英国点层的壁橱点的距离。 有人可以告诉我为了做到这一点我需要使用什么功能或包。我查看 gdistance 并找不到计算最短距离的函数。
答案 0 :(得分:3)
您可以使用使用空间树的FNN包来提高搜索效率。它适用于欧几里德几何,因此您应该将点转换为平面坐标系。我将使用rgdal
包转换为英国网格参考(稍微扩展它以在爱尔兰使用它,但您的原始数据是纽约,您应该使用纽约平面坐标系统) :
> require(rgdal)
> uk_coord = spTransform(uk_coord, CRS("+init=epsg:27700"))
> ire_coord = spTransform(ire_coord, CRS("+init=epsg:27700"))
现在我们可以使用FNN:
> require(FNN)
> g = get.knnx(coordinates(uk_coord), coordinates(ire_coord),k=1)
> str(g)
List of 2
$ nn.index: int [1:69, 1] 202 488 202 488 253 253 488 253 253 253 ...
$ nn.dist : num [1:69, 1] 232352 325375 87325 251770 203863 ...
g
是最接近69个爱尔兰点的英国点的索引和距离列表。距离以米为单位,因为坐标系以米为单位。
你可以通过绘制点然后加入爱尔兰点1到英国点202,爱尔兰2到英国488,爱尔兰3到英国202等来说明这一点。代码:
> plot(uk_coord, col=2, xlim=c(-1e5,6e5))
> plot(ire_coord, add=TRUE)
> segments(coordinates(ire_coord)[,1], coordinates(ire_coord)[,2], coordinates(uk_coord[g$nn.index[,1]])[,1], coordinates(uk_coord[g$nn.index[,1]])[,2])
答案 1 :(得分:1)
gDistance()
包的 rgeos
将为您提供距离矩阵
library(rgeos)
gDistance(uk_coord, ire_coord, byid = TRUE)
另一个选项是nncross()
包中的spatstat
。 Pro:它给出了距离最近邻居的距离。 Contra:您需要将SpatialPoints转换为SpatialPointPattern(请参阅?as.ppp
中的statstat
)
library(spatstat)
nncros(uk.ppp, ire.ppp)
答案 2 :(得分:0)
包geosphere
提供了大量dist*
函数来评估两个纬度/经度点的距离。在您的示例中,您可以尝试:
require(geosphere)
#get the coordinates of UK and Ireland
pointuk<-uk_coord@coords
pointire<-ire_coord@coords
#prepare a vector which will contain the minimum distance for each Ireland point
res<-numeric(nrow(pointire))
#get the min distance
for (i in 1:length(res)) res[i]<-min(distHaversine(pointire[i,,drop=FALSE],pointuk))
您将获得的距离以米为单位(您可以通过将呼叫中的地球半径设置为distHaversine
来更改)。
gDistance
和其他rgeos
函数的问题在于它们在坐标为平面时评估距离。基本上,你获得的数字并没有多大用处。