R:计算两个点层之间的最短距离

时间:2015-01-05 15:20:17

标签: r gis

我需要计算两个点矩阵之间的最短距离。我是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 并找不到计算最短距离的函数。

3 个答案:

答案 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])

nearest neighbours

答案 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函数的问题在于它们在坐标为平面时评估距离。基本上,你获得的数字并没有多大用处。