我使用了 Josh O'Brien 的代码,得到了看似合理的跳跃和角度——它们非常适合目测粗略的距离和点之间的航向。然后,我使用他建议中的公式创建一个将极坐标转换回笛卡尔坐标的函数,并使用一个 for 循环将该函数应用于所有极坐标的数据框。循环似乎工作,输出的单位正确,但我不相信它输出的值与我的数据相对应。所以要么我的公式计算错误,要么发生了其他事情。更多详情如下:
这是我的经纬度数据的头部:
> head(Tag1SSM[,3:4])
lon lat
1 130.7940 -2.647957
2 130.7873 -2.602994
3 130.7697 -2.565903
4 130.7579 -2.520757
5 130.6911 -2.704841
6 130.7301 -2.752182
当我将整个数据集绘制为值时,我得到了这个图:
这看起来与我使用 R 中的任何空间或映射包绘制它完全相同。
然后我使用 Josh 的函数将我的数据转换为极坐标:
x<-Tag1SSM$lon
y<-Tag1SSM$lat
getSteps <- function(x,y) {
d <- diff(complex(real = x, imaginary = y))
data.frame(size = Mod(d),
angle = c(NA, diff(Arg(d)) %% (2*pi)) * 360/(2*pi))
}
它适当地产生了以下极坐标:
> polcoords<-getSteps(x,y)
> head(polcoords)
size angle
1 0.04545627 NA
2 0.04103718 16.88852
3 0.04667590 349.38153
4 0.19581350 145.35439
5 0.06130271 59.37629
6 0.01619242 31.86359
同样,这些在我看来是正确的,并且很好地对应于点之间的实际角度和相对距离。到目前为止,一切都很好。
现在我想将这些转换回笛卡尔坐标并计算到原点的欧几里得距离。这些不必是真正的纬度/经度,因为我只是在它们之间进行比较。因此,我很高兴将原点设置为 (0,0) 并以参考 x,y 值而不是公里或类似的值计算距离。
因此,我在 Josh 的帮助和一些网络搜索下使用了这个功能:
polar2cart<-function(x,y,size,angle){
#convert degrees to radians (dividing by 360/2*pi, or multiplying by pi/180)
angle=angle*pi/180
if(is.na(x)) {x=0} #this is for the purpose of the for loop below
if(is.na(y)) {y=0}
newx<-x+size*sin(angle) ##X #this is how you convert back to cartesian coordinates
newy<-y+size*cos(angle) ##Y
return(c("x"=newx,"y"=newy)) #output the new x and y coordinates
}
然后将其插入此 for 循环:
u<-polcoords$size
v<-polcoords$angle
n<-162 #I want 162 new coordinates, starting from 0
N<-cbind(rep(NA,163),rep(NA,163)) #need to make 163 rows, though, for i+1 command below— first row will be NA
for(i in 1:n){
jump<-polar2cart(N[i,1],N[i,2],u[i+1],v[i+1]) #use polar2cart function above, jump from previous coordinate in N vector
N[i+1,1]<-jump[1] #N[1,] will be NA's which sets the starting point to 0,0—new coords are then calculated from each previous N entry
N[i+1,2]<-jump[2]
Dist<-sqrt((N[163,1]^2)+(N[163,2]^2))
}
然后我可以看看 N,我的新坐标基于这些跳跃:
> N
[,1] [,2]
[1,] NA NA
[2,] 0.011921732 0.03926732
[3,] 0.003320851 0.08514394
[4,] 0.114640605 -0.07594871
[5,] 0.167393509 -0.04472125
[6,] 0.175941466 -0.03096891
这就是问题所在......来自 N 的 x,y 坐标逐渐变大——那里有一点变化,但如果你向下滚动列表,y 从 0.39 变为 11.133,几乎没有向后降低的步骤价值观。这不是我的 lat/long 数据所做的,如果我正确计算了 cart->pol 和 pol->cart,那么来自 N 的这些新值应该与我的 lat/long 数据匹配,只是在不同的坐标系中。这是 N 值绘制的样子:
完全不一样... N 中的最后一个点是离原点最远的点,而在我的经纬度数据中,最后一个点实际上非常接近第一个点,而且绝对不是最远的点。我认为问题一定是我从极坐标转换回笛卡尔坐标,但我不知道如何解决它......
任何解决此问题的帮助将不胜感激!
干杯