我的问题如下:我有鹿和街道网络的GPS数据。我需要确定经常用于穿越鹿的高速公路路段。为此,我想识别/选择在高速公路两侧发生的所有连续GPS修复对。为此,我尝试将鹿的GPS点转换为一条线,然后将该轨道划分为每个固定点的起点和终点。在此之后,我想找到与街道网络相交的那些段,以便识别位于高速公路两侧的GPS定位对。我试图通过使用移动包的突发功能来创建段。但是,在将这些段保存为空间线的下一步中,我失败了。这是代码和数据,看看我做了什么:
可以在此处找到数据:https://www.dropbox.com/sh/nwuisjc5d58ys8r/AAAlV8vy5a4aPnKw-7aJwTjXa?dl=0
library(maptools)
library(rgdal)
library(move)
准备数据集:
data <- read.csv("deer.csv", sep=";")
street <-readOGR("street_data", "street")
data$DateTime <- as.POSIXct(
paste(data$LMT_Date,data$LMT_Time),
format = "%d.%m.%Y %H:%M:%S",
tz = "Africa/Algiers")
mov <- move(x=data$X, y=data$Y,
time=as.POSIXct(data$DateTime,format = "%d.%m.%Y %H:%M:%S",tz = "Africa/Algiers"),
proj = "+proj=somerc +lat_0=46.9524056 +lon_0=7.43958333 +ellps=bessel +x_0=2600000 +y_0=1200000 +towgs84=674.374,15.056,405.346
+units=m +k_0=1 +no_defs", data=data)
创建突发以创建包含两个连续GPS修复的分段(基本上是起点和终点)。但是,这里num.pos和num.neg的定义值不起作用,因为您只有一个示例数据。我不知道如何调整它...我的理论是关于num.pos和num.neg需要具有什么样的值似乎是错误的。所以在这里的任何帮助也将非常感激:
num.row<- nrow(data)
num <- (num.row-2)/2
num.pos <- trunc(num)
num.neg <- trunc(abs(num-num.row))
num.neg
fun <- c(rep(1:num.pos, each=2), rep(num.neg,1))
track.segments <- move::burst(x=mov, f=fun)
plot(track.segments, type="l", lwd=2)
data.burst <- data[-nrow(data),]
data.burst$burstID <- track.segments@burstId
情节看起来很安静。您可以看到这些段是在两个连续修复之间创建的,如预期的那样。 segment plot
现在将上面创建的段保存为空间线:
points_to_line <- function(data, long, lat, id_field = NULL, sort_field = NULL) {
coordinates(data) <- c(long, lat)
if (!is.null(sort_field)) {
if (!is.null(id_field)) {
data <- data[order(data[[id_field]], data[[sort_field]]), ]
} else {
data <- data[order(data[[sort_field]]), ]
}
}
if (is.null(id_field)) {
lines <- SpatialLines(list(Lines(list(Line(data)), "id")))
return(lines)
} else if (!is.null(id_field)) {
paths <- sp::split(data, data[[id_field]])
sp_lines <- SpatialLines(list(Lines(list(Line(paths[[1]])), "line1")))
for (p in 2:length(paths)) {
id <- paste0("line", as.character(p))
l <- SpatialLines(list(Lines(list(Line(paths[[p]])), id)))
sp_lines <- spRbind(sp_lines, l)
}
return(sp_lines)
}
}
data.lines <- points_to_line(data = data.burst,
long = "X",
lat = "Y",
id_field = "burstID")
但是,如果您绘制data.lines,您可以清楚地看到,有些段丢失了。这似乎是这种情况,因为在前两个修复分配了相同的burstID之后,burstID总是跳过两个连续修复之间的连接。那么我该怎样做才能将所有段保存为空间线,甚至更好地保存为空间线数据帧?或者还有另一种方法可以识别位于街道两侧的GPS定位吗?
感谢您的帮助