2012-06-25 137 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