【问题标题】:Calculating Angles from Spatial Points in R从R中的空间点计算角度
【发布时间】:2018-05-29 03:40:12
【问题描述】:

我正在查看一些分散数据,并希望获得点之间的距离以及这些点之间的角度。到目前为止,我只能实现第一部分。使用 adehabitatLT 包中的青色数据我已经这样做了:

require("adehabitatLT")
require("sp")
data("teal")
teal <- teal[1:10 ,]
capsd <- SpatialPointsDataFrame(coords = SpatialPoints(coords = 
    teal[, c("x","y")], proj4string = CRS("+proj=longlat +datum=WGS84 
    +ellps=WGS84 +towgs84=0,0,0")), data=teal)
capdistance <- as.data.frame(pointDistance(capsd))

capdistance 是一个 10x10 的数据框,显示蓝绿色数据集前 10 个点之间的距离。

有谁知道我将如何计算这些点之间的角度以创建与 capdistance data.frame 类似的矩阵?我已经搜索过了,但到目前为止,我还没有找到任何可以计算两个设定位置之间角度的东西。任何帮助将不胜感激。

编辑

所以我一直在环顾四周,似乎 geosphere 包中的方位功能对此很有用,但我仍然(至少)一步之遥:

require("geosphere")
capbearing1 <- bearing(capsd[1:10 ,], capsd[1 ,])
capbearing2 <- bearing(capsd[1:10 ,], capsd[2 ,])

我可以重复这十次以获得十个列表,每个列表给出十个点之一相对于所有十个点(本身和其他九个点)的角度;但是,我真的希望它能够顺利运行,以一次将所有十个列表作为单个矩阵提供;再次,非常感谢任何帮助。

如果您在单个区域中使用 UTM 并且数据点有限,那么 cygps 提供了一些很好的代码,因此如果您有这些参数,请尝试一下。

【问题讨论】:

    标签: r loops spatial angle


    【解决方案1】:
    foo <- function(df) {
          x1 <- x2 <- df$x
          y1 <- y2 <- df$y
          Xpair<-merge(x1,x2)
            names(Xpair)<-c("x1","x2")
          Ypair<-merge(y1,y2)
           names(Ypair)<-c("y1","y2")
    
          dist <- c(sqrt((Xpair$x1 - Xpair$x2)^2 + (Ypair$y1 - Ypair$y2)^2), NA)
    
          dx <- c(Xpair$x1 - Xpair$x2, NA)
          dy <- c(Ypair$y1 - Ypair$y2, NA)
          abs.angle <- ifelse(dist < 1e-07, NA, atan2(dy, dx))
          so <- list(dist,  abs.angle)
          return(so)
        }
    

    我从adehabitatLT:as.ltraj 改编了这个函数。它会生成您的距离和绝对角度矩阵(假设您想要所有点之间的距离和角度,而不是按时间排序的距离和角度)。

    【讨论】:

    • 谢谢cgyps,这确实可以产生你所说的距离和角度。但是,它输出的列表有点笨重,我希望有人知道如何将角度创建为 10x10 矩阵;这样可以更容易地引用它们。
    • 所以,再看看这个,它实际上对于这个数据集并没有那么好,因为 x 和 y 数据是经度/纬度的。我认为,如果您要处理的是在同一区域中的诸如 UTM 之类的东西,这将起作用。
    • 您可以更改函数,使其仅输出角度。并且不建议使用纬度/经度计算任何距离度量。一定要先转换成 UTM!
    • 即使移除了距离,你最终还是会得到一个庞大的数据集而不是 10x10 矩阵;同样,这只是为了方便引用数据,但如果您正在处理更大的内容(例如 100 点),您将不想要长 10,000 条记录的内容。至于切换到 UTM 进行距离计算,这并不是必需的。这些点都是空间参考的,所以当 pointDistance 命令应用于 capsd 对象时,一切都很好。输出以米为单位,但只要 CRS 最初是正确的就没有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    相关资源
    最近更新 更多