r - 计算 R 中点之间的距离

标签 r location coordinates latitude-longitude

我查看了提出的问题,但处理坐标,但找不到可以帮助我解决问题的东西。

我有包含 ID、速度、时间、纬度和经度列表的数据集。 (数据集可以在链接中找到) https://drive.google.com/file/d/1MJUvM5WEhua7Rt0lufCyugBdGSKaHMGZ/view?usp=sharing

我想测量纬度和经度每个点之间的距离。 例如; 纬度有:x1,x2,x3,...x1000

经度有:y1,y2,y3,...,y100

我想测量 (x1,y1) 到所有点之间的距离,以及 (x2,y2) 到所有点之间的距离,依此类推。

我这样做的原因是为了知道哪个点靠近哪个点,并根据距离为每个位置分配索引。 如果 (x1, y1) 接近 (x4,y4),则 (x1, y1) 将获得索引 A,(x4,y4) 将被标记为 B。根据距离按顺序对点进行排序。

我尝试了 gDistance 函数,但显示错误消息:“package ‘gDistance’ is not available (for R version 3.4.3)”

如果我将版本更改为 3.3 库(rgeos)将无法工作! 有什么建议吗?

这是我尝试过的,

#requiring necessary packages:
library(sp)  # vector data
library(rgeos)  # geometry ops

#Read the data and transform them to spatial objects
d <- read.csv("ReadyData.csv")
sp.ReadData <- d
coordinates(sp.ReadyData) <- ~Longitude + Latitude
d <- gDistance(sp.ReadyData, byid= TRUE)

这里更新我的解决方案,我创建了空间对象并制作了空间数据框,如下所示:

#Create spatial object:
lonlat <- cbind(spatial$Longitude, spatial$Latitude)
#Create a SpatialPoints object:
library(sp) 
pts <- SpatialPoints(lonlat)
crdref <- CRS('+proj=longlat +datum=WGS84')
pts <- SpatialPoints(lonlat, proj4string=crdref)
# make spatial data frame
ptsdf <- SpatialPointsDataFrame(pts, data=spatial)

现在我正在尝试测量经度/纬度坐标的距离。我尝试了 dist 方法,但似乎对我不起作用,并尝试了 pointDistance 方法:

gdis <- pointDistance(pts, lonlat=TRUE)

我仍然不清楚这个函数如何测量距离,我需要计算出距离,以便我可以找到中间的点,并根据每个点距中间点的位置为每个点分配数字..

最佳答案

您可以使用raster::pointDistancegeosphere::distm等函数。

部分示例数据(请避免问题中的文件):

d <- read.table(sep=",", text='
"OBU ID","Time Received","Speed","Latitude","Longitude"
"1",20,1479171686325,0,38.929596,-77.2478813
"2",20,1479171686341,0,38.929596,-77.2478813
"3",20,1479171698485,1.5,38.9295887,-77.2478945
"4",20,1479171704373,1,38.9295048,-77.247922
"5",20,1479171710373,0,38.9294865,-77.2479055
"6",20,1479171710373,0,38.9294865,-77.2479055
"7",20,1479171710373,0,38.9294865,-77.2479055
"8",20,1479171716373,2,38.9294773,-77.2478712
"9",20,1479171716374,2,38.9294773,-77.2478712
"10",20,1479171722373,1.32,38.9294773,-77.2477417')

解决方案:

library(raster)
m <- pointDistance(d[, c("Longitude", "Latitude")], lonlat=TRUE)

要获得每个点最近的点,您可以这样做

mm <- as.matrix(as.dist(m))
diag(mm) <- NA
i <- apply(mm, 1, which.min)

点对

p <- cbind(1:nrow(mm), i)    

要获取距离,您可以执行以下操作:

mm[p] 

或者这样做:

apply(mm, 1, min, na.rm=TRUE)

请注意,rgeos::gDistance 适用于平面数据,不适用于经度/纬度数据。

Here是一个类似的问题/答案,并带有一些插图。

我们的数据集太大,无法制作单个距离矩阵。您可以以此来分块处理数据。在这里,我用 4 行的相当小的 block 大小来展示这一点。将此数字设置得更大以加快处理时间。

library(geosphere)
chunk <- 4  # rows
start <- seq(1, nrow(d), chunk)
end <- c(start[-1], nrow(d))   
x <- d[, c("Longitude", "Latitude")]

r <- list()
for (i in 1:length(start)) {
    y <- x[start[i]:end[i], , drop=FALSE]
    m <- distm(y, x)
    m[cbind(1:nrow(m),  start[i]:end)] <- NA 
    r[[i]] <- apply(m, 1, which.min)
}
r <- unlist(r)
r
# [1] 2 1 1 5 6 6 5 5 9 8 8 8

对于您的数据:

d <- read.csv("ReadyData.csv")
chunk <- 100  # rows
# etc

这需要很长时间。

另一种方法:

library(spdep)
x <- as.matrix(d[, c("Longitude", "Latitude")])
k <- as.vector(knearneigh(x, k=1, longlat=TRUE)$nn)

关于r - 计算 R 中点之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48389027/

相关文章:

android - 从 Android 上的 GPS 供应商获取*粗略*位置

angularjs - AngularJS用$ location更改URL

flutter - 在 LatLng 坐标系中旋转对象

3d - 将 2D 屏幕坐标取消投影到 3D 坐标

ios - 如何标记纬度/经度文本,以便在作为电子邮件发送时识别为位置

java - 基于宽度和高度(坐标和大小)计算值的算法

对数据框的某些部分运行回归并提取估计值 + 错误

r - 向 ggplot 添加图例 - 颜色名称无效

r - 如何包装 gridExtra::tableGrob() 中特定列的每一行

r - 将对象向量作为预测变量放置在 model.matrix 中