我查看了提出的问题,但处理坐标,但找不到可以帮助我解决问题的东西。
我有包含 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::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 行的相当小的 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/