计算R

时间:2018-01-22 19:36:07

标签: r location coordinates latitude-longitude

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

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

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

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

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

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

我尝试了gDistance功能,但显示错误信息:“package'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)

我还不清楚这个函数如何测量距离,我需要弄清楚距离,这样我就可以找到中间的点,并根据中点的位置为每个点分配数字。

2 个答案:

答案 0 :(得分:0)

假设你将p1作为x的空间点,p2作为y的空间点,以获得最近的其他点的索引:

ReadyData$cloDist <- apply(gDistance(p1, p2, byid=TRUE), 1, which.min)

如果你在列表中有相同的坐标,你将得到一个点本身的索引,因为它自身最近的位置本身。避免这种情况的一个简单技巧是使用第二个最远距离作为参考,具有快速功能:

f_which.min <- function(vec, idx) sort(vec, index.return = TRUE)$ix[idx]
ReadyData$cloDist2 <- apply(gDistance(p1, p2, byid=TRUE), 1, f_which.min, 
idx = 2)

答案 1 :(得分:0)

您可以使用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)