【问题标题】:Calculating angle from latitude and longitude从纬度和经度计算角度
【发布时间】:2012-06-25 16:00:23
【问题描述】:

我有一组纬度和经度,所以这是动物随时间移动的数据。我想做的是计算转动角度,即每次运动之间转动的角度。所以说我有点 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

它们是十进制度数

【问题讨论】:

  • 你试过什么?至少表明你尝试过搜索,和/或表明你理解所涉及的数学。
  • 我尝试将纬度和经度转换为以千米为单位的 x 和 y 坐标,假设地球是球形的(为简单起见)。然后我尝试使用余弦公式来计算角度。但是我得到的角度值非常小,这实际上几乎不可能。任何帮助将不胜感激。
  • 显示你的代码和一些示例数据,否则我们只能猜测你的问题是什么。你是以度还是弧度工作的?
  • 我无法明智地上传此专栏。所以它上传的方式是经度(例如36.89379547),然后是纬度(例如0,290166977)
  • 尝试将样本数据放入问题本身,而不是作为评论

标签: r latitude-longitude angle


【解决方案1】:

maptools中使用函数trackAzimuth

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 包含计算轨道方向和角度的函数。

【讨论】:

  • 是否应该去掉trackAngle函数中的ifelse语句?当角度 > 180 时,它会默默地将角度方向从顺时针变为逆时针。您实际上无法理解方位角 89.7° 和 97.7° 相差 172°,因为第二个实际上是 262.3°。
  • 啊,好点,我只是想衡量敏锐度,而不是方向。
【解决方案2】:

您的数据点仅在很小的范围内变化。我们可以看一小块地球表面,假装它是平的,二维的。你必须弄清楚多少公里、米、英里,无论你最喜欢的单位是多少,对应于一个纬度和一个经度。后者取决于纬度——它与赤道附近的纬度比例相同,但如果你站在离北极一臂远的地方,一步将带你穿过 50 度。设置 x,y 坐标,其中 x=0 为经度 36.88000,y=0 为纬度 0.29000。

所以,现在您有一系列 (x,y) 点。将每个点的差异带到下一个点:P2-P1、P3-P2 等。这些可以称为“位移​​矢量”,但其他术语可能用于我来自的其他领域。称它们为 V1、V2 等。使用点积和范数: dot(V1,V2) = 幅度(V1)*幅度(V2)*cos(a) 其中 a 是 V2 偏离 V1 方向的角度。对 V3 和 V2 重复此操作,依此类推。

R 拥有执行此操作的所有工具,但我对 R 的语法了解不多,无法举出例子。

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多