我正在查看一些分散数据,并希望获得点之间的距离以及这些点之间的角度。到目前为止,我只能实现第一部分。使用来自adehabitatLT包的teal数据我已经完成了这个:
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会给出一些好的代码,所以如果您有这些参数,请尝试一下。答案 0 :(得分:0)
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
改编了这个功能。它产生你的距离和绝对角度矩阵(假设你想要所有点之间的距离和角度,而不是时间有序的距离和角度)。