2013-07-03 31 views
0

我需要做一個距離的距離與我在這一點的價值(「強度」)的二維圖。XYZ數據到二維圖在R

我的數據格式爲:

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行這樣的。我正在尋找一些計算經度(緯度)和緯度(緯度)點(如緯度)之間距離的軟件包,但我無法理解如何將數據轉換爲所需的格式。我知道以度爲單位的總距離應該是4.01538,在282個點之間均勻分佈,但我不知道如何在R中創建一個列。

+1

要獲得的距離,你需要兩個百分點;你如何配對數據來繪製距離? – DiscreteCircle

+0

@DiscreteCircle我相信這是一次旅行,點數是有序的。所以歐普要求第一點到第二點,第二和第三點之間的距離...... – agstudy

回答

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")) 

enter image description here

,或者選擇更多的 「地理」 距離與滯後列值的措施。但考慮到增量,我懷疑使用天真距離度量的錯誤可能會非常大。

+0

非常感謝!這工作完美。我現在剛剛學習R,並且一直堅持2天。現在去查看你用來查看它的工作原理的所有命令...... – Riebeckite

+0

'with'函數有點高。它允許您跳過多次將數據框名稱寫入爲'dfrm $ ...'。 fn:'cumsum'應該是相當自我解釋的,應該是計算直角三角形斜邊長度的算術。我想我可以創建一箇中間間隔距離變量,然後使用'cumsum',但過了一段時間後,您將Excel思維背後留下,不想回去。 –

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") 

enter image description here

相反,如果你想增加強度,你可以再次使用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") 

enter image description here

0

正如迪文,你可以用天真的措施或地理d提到度量衡。這裏我使用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) 

enter image description here