计算R中的点之间的距离 [英] Calculating the distance between points in R

查看:33
本文介绍了计算R中的点之间的距离的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我仔细查看了询问的问题,但处理坐标但找不到帮助我解决问题的方法。

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

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

经度有:Y1、Y2、Y3、.、Y100

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

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

我尝试了gDistance函数,但显示错误消息:"软件包‘gDistance’不可用(适用于R版本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行)展示了这一点。将此数字调大以加快处理时间。

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中的点之间的距离的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆