2009-07-10 79 views
9

我目前正在处理GPS数据并结合精确高度测量。 我想计算两个连接点之间的距离。关于使用WGS84椭球等计算两点之间的距离有很多信息。计算测地距离时考虑海拔高度

但是,我没有找到任何信息,这需要海拔高度更改为计算此 距离。

有没有人知道一些网站,论文,书籍等描述这种方法? 谢谢

编辑:当计算距离时,Sql Server 2008地理扩展也忽略了海拔高度信息。

+0

我没有看过的WGS84方程,所以我不写这作为一个答案。也就是说,在我看来,你应该能够调整一个或两个半径以使您的测量点成为“新”表面。如果你的高度测量是基于GPS的话,这可能效果最好;如果基于机械手段(例如气压),那么“海平面”可能与模型大地水准面几乎没有关系。 – kdgregory 2009-07-10 12:11:53

+0

你有没有想出一个好的解决方案呢? – lnafziger 2012-08-19 18:06:37

回答

0

我会建议在使用WGS84的任何距离上都会给你更高的准确度,以至于海拔差异无关紧要。在任何高度差异很重要的距离上,你应该使用直线近似。

0

为了做到这一点,你必须解决的第一个问题是如何定义高度变化。法线方程式因为它们位于二维曲面上而起作用,但是添加第三维意味着最短距离的简单定义不再适用,例如现在第三维是“起作用”的,您的最短距离可能会穿过原始曲线椭球。 这有点快速和肮脏,但你最好的解决方案可能是假设在椭球体上原始2D路径上的变化率是恒定的。然后,您可以将二维距离计算为长度,求出高度变化率,然后简单地使用毕达哥拉斯计算长度的增加量,三角形的一边为二维距离,高度为第二长度。

6

我使用开始和结束高度的平均值作为恒定高度,实现了WGS84距离函数。如果你确定沿着你的路径会有相对较小的高度变化,这个工作可以接受的很好(误差与你的两个LLA点的高度差有关)。

这里是我的代码(C#):

/// <summary> 
    /// Gets the geodesic distance between two pathpoints in the current mode's coordinate system 
    /// </summary> 
    /// <param name="point1">First point</param> 
    /// <param name="point2">Second point</param> 
    /// <param name="mode">Coordinate mode that both points are in</param> 
    /// <returns>Distance between the two points in the current coordinate mode</returns> 
    public static double GetGeodesicDistance(PathPoint point1, PathPoint point2, CoordMode mode) { 
     // calculate proper geodesics for LLA paths 
     if (mode == CoordMode.LLA) { 
      // meeus approximation 
      double f = (point1.Y + point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double g = (point1.Y - point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double l = (point1.X - point2.X)/2 * LatLonAltTransformer.DEGTORAD; 

      double sinG = Math.Sin(g); 
      double sinL = Math.Sin(l); 
      double sinF = Math.Sin(f); 

      double s, c, w, r, d, h1, h2; 
      // not perfect but use the average altitude 
      double a = (LatLonAltTransformer.A + point1.Z + LatLonAltTransformer.A + point2.Z)/2.0; 

      sinG *= sinG; 
      sinL *= sinL; 
      sinF *= sinF; 

      s = sinG * (1 - sinL) + (1 - sinF) * sinL; 
      c = (1 - sinG) * (1 - sinL) + sinF * sinL; 

      w = Math.Atan(Math.Sqrt(s/c)); 
      r = Math.Sqrt(s * c)/w; 
      d = 2 * w * a; 
      h1 = (3 * r - 1)/2/c; 
      h2 = (3 * r + 1)/2/s; 

      return d * (1 + (1/LatLonAltTransformer.RF) * (h1 * sinF * (1 - sinG) - h2 * (1 - sinF) * sinG)); 
     } 

     PathPoint diff = new PathPoint(point2.X - point1.X, point2.Y - point1.Y, point2.Z - point1.Z, 0); 
     return Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y + diff.Z * diff.Z); 
    } 

在实践中我们发现,高度差几乎使一个大的差异,我们的路径通常与100米量级的高度变化的1-2km长我们发现平均约5米的变化与使用未修改的WGS84椭球相比。

编辑:

要添加到这一点,如果你希望大高度变化,您可以将您的WGS84坐标ECEF(地心地固定)和在底部所示评估直线路径我功能。转换一个点到ECEF很简单的事:

/// <summary> 
    /// Converts a point in the format (Lon, Lat, Alt) to ECEF 
    /// </summary> 
    /// <param name="point">Point as (Lon, Lat, Alt)</param> 
    /// <returns>Point in ECEF</returns> 
    public static PathPoint WGS84ToECEF(PathPoint point) { 
     PathPoint outPoint = new PathPoint(0); 

     double lat = point.Y * DEGTORAD; 
     double lon = point.X * DEGTORAD; 
     double e2 = 1.0/RF * (2.0 - 1.0/RF); 
     double sinLat = Math.Sin(lat), cosLat = Math.Cos(lat); 

     double chi = A/Math.Sqrt(1 - e2 * sinLat * sinLat); 
     outPoint.X = (chi + point.Z) * cosLat * Math.Cos(lon); 
     outPoint.Y = (chi + point.Z) * cosLat * Math.Sin(lon); 
     outPoint.Z = (chi * (1 - e2) + point.Z) * sinLat; 

     return outPoint; 
    } 

编辑2:

有人问我的一些在我的代码中的其他变量:

// RF is the eccentricity of the WGS84 ellipsoid 
public const double RF = 298.257223563; 

// A is the radius of the earth in meters 
public const double A = 6378137.0; 

LatLonAltTransformer是我使用的类将LatLonAlt坐标转换为ECEF坐标并定义上述常量。

0

对于初学者,您需要一个模型,告诉您两个点之间的高度如何变化。没有这样的模型,你没有任何两点之间距离的一致定义。

如果你有一个线性模型(行驶50%的点之间的距离也意味着你上升了50%的高度),那么你可以假设整个事情是一个直角三角形;即您确定世界是平坦的,以确定高度变化如何影响距离。沿地面的距离是基础,高度变化是三角形的高度,斜边是您估计的从点到点的真实行驶距离。

如果您想进一步细化,那么您可以注意到上面的模型对于无穷小距离来说是非常好的,这意味着您可以遍历距离的单个增量,微积分式,每次使用当前高度计算地面距离,然后使用相同的三角比来计算行驶距离的高度变化贡献。我可能会在包含10到100段的for()循环中执行此操作,并且可能通过反复试验找出需要达到真实值的epsilon所需的块数。计算这个模型下两点之间的实际距离也可以计算出线积分。

0

您可能并不关心大型2D距离分离的高度。所以如果你得到的距离超过20(或50公里),那么谁在乎高度差(取决于你的需求情况)。在说20公里以下,饲喂简单的毕达哥拉斯加除了高度差。顺利进料。

Distance between two geo-points?