【发布时间】:2016-08-17 11:27:45
【问题描述】:
我想找到最有效(最快)的方法来计算经纬度坐标对之间的距离。
使用sapply 和spDistsN1{sp} 提出了一个不太有效的解决方案(here)。我相信如果有人在data.table 中使用spDistsN1{sp} 和:= 运算符,这可以做得更快,但我无法做到这一点。有什么建议吗?
这是一个可重现的示例:
# load libraries
library(data.table)
library(dplyr)
library(sp)
library(rgeos)
library(UScensus2000tract)
# load data and create an Origin-Destination matrix
data("oregon.tract")
# get centroids as a data.frame
centroids <- as.data.frame(gCentroid(oregon.tract,byid=TRUE))
# Convert row names into first column
setDT(centroids, keep.rownames = TRUE)[]
# create Origin-destination matrix
orig <- centroids[1:754, ]
dest <- centroids[2:755, ]
odmatrix <- bind_cols(orig,dest)
colnames(odmatrix) <- c("origi_id", "long_orig", "lat_orig", "dest_id", "long_dest", "lat_dest")
我使用data.table 的尝试失败了
odmatrix[ , dist_km := spDistsN1(as.matrix(long_orig, lat_orig), as.matrix(long_dest, lat_dest), longlat=T)]
这是一个可行的解决方案(但可能效率较低)
odmatrix$dist_km <- sapply(1:nrow(odmatrix),function(i)
spDistsN1(as.matrix(odmatrix[i,2:3]),as.matrix(odmatrix[i,5:6]),longlat=T))
head(odmatrix)
> origi_id long_orig lat_orig dest_id long_dest lat_dest dist_km
> (chr) (dbl) (dbl) (chr) (dbl) (dbl) (dbl)
> 1 oregon_0 -123.51 45.982 oregon_1 -123.67 46.113 19.0909
> 2 oregon_1 -123.67 46.113 oregon_2 -123.95 46.179 22.1689
> 3 oregon_2 -123.95 46.179 oregon_3 -123.79 46.187 11.9014
> 4 oregon_3 -123.79 46.187 oregon_4 -123.83 46.181 3.2123
> 5 oregon_4 -123.83 46.181 oregon_5 -123.85 46.182 1.4054
> 6 oregon_5 -123.85 46.182 oregon_6 -123.18 46.066 53.0709
【问题讨论】:
-
查看
spDistsN1的代码。你应该重写你自己的不需要转换为矩阵的函数,因为我敢打赌这是大部分时间的地方。 -
也可以查看这篇文章:stackoverflow.com/questions/36686312/…
标签: r data.table geospatial sp