计算R中的点之间的距离 [英] Calculating the distance between points in R
本文介绍了计算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::pointDistance
或geosphere::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屋!
查看全文