我需要制作一个2D行程图,显示行程距离与当时的值(“强度”)。
我的数据格式为:
lon lat intensity
1. -85.01478 37.99030 -68.3167
2. -85.00752 37.97601 -68.0247
3. -85.00027 37.96172 -67.9565
4. -84.99302 37.94743 -67.8917
并继续这样的282行。我正在查看一些计算经度(lon)和纬度(lat)点(例如geosphere)之间距离的软件包,但我无法理解如何将我的数据转换为它想要的格式。我知道以度为单位的总行程距离应该是4.01538,在282点之间均匀分布,但我不知道如何在R中创建一个列,并考虑到这一点。
答案 0 :(得分:1)
dfrm$dist<- cumsum(c(0, with(dfrm, sqrt( (lat[-1]-lat[-nrow(dfrm)])^2+
(lon[-1]-lon[-nrow(dfrm)])^2
))) )
with(dfrm, plot(dist, intensity, type="b"))
或者使用滞后列值选择更“地理”的距离度量。但考虑到增量,我怀疑使用天真距离测量的误差可能是那么多。
答案 1 :(得分:1)
从here我找到一些包来计算坐标之间的距离。假设您的数据名为dtf
并使用RSEIS
包:
dtf <- data.frame(rbind(c(-85.01478,37.99030,-68.3167),
c(-85.00752,37.97601,-68.0247),c(-85.00027,37.96172,-67.9565),
c(-84.99302,37.94743,-67.8917)))
names(dtf) <- c('lon','lat','int')
library(RSEIS)
travelint <- function(i,data){
ddeg <- GreatDist(dtf$lon[i],dtf$lat[i],dtf$lon[i+1],dtf$lat[i+1])$ddeg;
dint <- dtf$int[i+1] - dtf$int[i]; return(list(ddeg,dint))}
out <- sapply(1:(nrow(dtf)-1),data=dtf,travelint)
out <- data.frame(matrix(as.numeric(out),ncol=2,byrow=T))
out$X1 <- cumsum(out$X1)
这将获取您的数据,计算点之间的行进距离以及它们之间的强度变化。之后可以这样绘制:
ggplot(out,aes(X1,X2)) + geom_line() +
labs(x="Distance (Degrees)",y="Intensity Change")
如果您希望增加强度,可以再次使用cumsum
来获得强度的累积变化,然后将其添加到第一个强度:
out2 <- out
out2 <- rbind(c(0,0),out2)
out2$X2 <- cumsum(out2$X2) + dtf$int[1]
ggplot(out2,aes(X1,X2)) + geom_line() +
labs(x="Distance (Degrees)",y="Intensity")
答案 2 :(得分:0)
如DWin所述,您可以使用天真测量或地理距离测量。这里我使用来自Imap包的gdist函数计算大圆距离。
library(Imap)
library(lattice)
#Dummy data
longlat <- read.table(text="lon lat intensity
1. -85.01478 37.99030 -68.3167
2. -85.00752 37.97601 -68.0247
3. -85.00027 37.96172 -67.9565
4. -84.99302 37.94743 -67.8917", header=TRUE)
ll <- lapply(seq(nrow(longlat)-1), function(x){
start <- longlat[x,]
end <- longlat[x+1,]
cbind(distance = gdist(start$lon, start$lat, end$lon, end$lat,units = "m"),
intensity = end$intensity - start$intensity)
})
dd <- as.data.frame(do.call(rbind,ll))
library(lattice)
xyplot(intensity~distance,dd,type= c('p','l'),pch=20,cex=2)