2012-06-25 138 views
2

我有一套緯度和經度,所以這是一隻動物隨時間移動的數據。我想要做的就是計算轉向角度,也就是每個運動之間轉動的角度。所以說我有點1,點2和點3與緯度和經度值對應的每個點(動物從點1到點2到點3等),我想要計算這3點之間的角度,點2是中間點。我該怎麼辦?我的操作系統是Windows,我正在使用R進行分析。根據緯度和經度計算角度

所以這裏是我的樣本數據:

longitude      latitude 
36.89379547    0.290166977 
36.89384037    0.290194109 
36.88999724    0.286821044 
36.88708721    0.288339411 
36.88650313    0.29010232 
36.88563203    0.289939416 
36.88545224    0.290924863 

他們以十進制度

+0

你有什麼嘗試?至少表明你試圖尋找某些東西,並且/或者表明你理解了所涉及的數學。 – Andrie

+0

我試圖將緯度和長度轉換成以km爲單位的x和y座標,假設地球是球形的(爲簡單起見)。然後我試着用餘弦公式來計算角度。但是我看起來幾乎不太可能的角度極小的值。任何幫助將不勝感激。 – Maddy

+1

顯示你的代碼和一些示例數據,否則我們只能猜測你的問題是什麼。你是以度或弧度工作嗎? – Andrie

回答

8

使用功能trackAzimuthmaptools

library(maptools) 

trackAngle <- function(xy) { 
    angles <- abs(c(trackAzimuth(xy), 0) - 
        c(0, rev(trackAzimuth(xy[nrow(xy):1, ])))) 
    angles <- ifelse(angles > 180, 360 - angles, angles) 
    angles[is.na(angles)] <- 180 
    angles[-c(1, length(angles))] 
} 

trackAzimuth函數是gzAzimuth一個簡單的循環包裝。請參閱?gzAzimuth以獲取關於計算球體方向的參考。

使用您的數據:

x <- read.table(text = "longitude      latitude 
36.89379547    0.290166977 
36.89384037    0.290194109 
36.88999724    0.286821044 
36.88708721    0.288339411 
36.88650313    0.29010232 
36.88563203    0.289939416 
36.88545224    0.290924863", header = TRUE) 

trackAngle(as.matrix(x)) 
[1] 10.12946 111.17211 135.88514 97.73801 89.74684 

編輯:我不得不從功能去除第一/最後一個角度,這是我與其他地方的此功能在事後做。應該是現在。 :)

此外,包adehabitatLTargosfilter包含計算軌道方向和角度的函數。

+0

應在trackAngle功能的ifelse語句刪除嗎?它會悄悄地從順時針改變角度方向爲逆時針時角度> 180。你不能真正認識到,方位89.7°和97.7°的開172°,作爲第二一個實際上是262.3°。 – mbask

+0

阿好一點,我正在想劇烈的度量,而不是方向的。 – mdsumner

0

你的數據點在變化只有一個很小的範圍內。我們可以看到地球表面的一小塊區域,並假設它是平坦的,二維的。你必須計算出多少公里,米,英里,無論你最喜歡的單位是多少,對應於一個緯度和一個經度。後者取決於緯度 - 它與赤道附近的緯度比例相同,但如果站在北極的臂長內,則一步將通過50度。設置x,y座標,其中x = 0是經度36.88000,y = 0是緯度0.29000。

所以,現在你有一系列(x,y)點。從每個點到下一個點之間的差異:P2-P1,P3-P2等。這些可以被稱爲「位移​​矢量」,但其他術語可以用於除我之外的其他領域。將它們稱爲V1,V2等。使用點積和規範:點(V1,V2)=幅度(V1)*幅度(V2)* cos(a)其中a是V2偏離V1方向的角度。對V3和V2重複,等等。 R有所有的工具可以做到這一點,但我不知道R的足夠的語法來給出例子。

+0

我也不:( – Maddy