计算3D(NED)地理坐标(纬度,长度,深度)之间的距离

时间:2015-10-26 15:41:12

标签: r math trigonometry

众所周知,Haversine formula是计算地理坐标之间距离的有用机制。显然,R中有某些包提供了进一步的改进;考虑到地球的椭球性质。

然而,我找不到的是找到NED coordinates 之间的直线距离的任何方法:即纬度,经度和深度

这种类型的距离计算对于研究发生在海洋深处或地壳下的事件至关重要。

是否有人知道在球体上协助此类距离计算的方法?在地球上?如果没有,有没有人有任何想法,这个问题的最佳三角方法是什么?

1 个答案:

答案 0 :(得分:6)

线性距离在笛卡尔坐标系中更容易计算,因此第一步是将NED坐标(即长纬高度)坐标转换为某些此类系统。在开源世界中,PROJ4" geocent"投影,在正交的x-y-z坐标系中以米为单位给出位置,是一个不错的选择。

Simon Urbanek的proj4软件包提供了一种很好的轻量级方法来完成转换。为了演示它的使用,我将编写一个小的包装函数,在NED坐标中取两个点,并以米为单位计算它们的间隔。 (一个复杂因素是ptransform()期望其纬度和经度坐标以弧度为单位;因此在函数的第一行和第二行中除以180/pi。)

library(proj4)
findDist <- function(x=c(0,0,0), y=c(0,0,0)) {
    x <- matrix(x/c(180/pi, 180/pi, 1), ncol=3)
    y <- matrix(y/c(180/pi, 180/pi, 1), ncol=3)
    xx <- ptransform(x, src.proj="+proj=longlat +ellps=WGS84",
                        dst.proj="+proj=geocent +ellps=WGS84")
    yy <- ptransform(y, src.proj="+proj=longlat +ellps=WGS84",
                        dst.proj="+proj=geocent +ellps=WGS84")
    sqrt(sum((yy-xx)^2))
}

## A sanity check. (Find distance between two points at 0°N 0°E, one on the
## surface and one 100m below the surface (i.e. at a height of -100m).)
findDist(c(0,0,0), c(0,0,-100))
## [1] 100

## Distance from North to South Pole
findDist(c(0,90,0), c(0,-90,0))
## [1] 12713505

## Diameter of the earth at its equator
findDist(c(0,0,0), c(180,0,0))
## [1] 12756274