i'm目前处理与精确高度测量组合GPS数据。 我想计算两个consecuting点之间的距离。 有大量的信息在那里有关使用WGS84椭球等上两点之间的距离计算。
但是,我并没有发现需要高度变化考虑进去这个距离计算的任何信息。
没有人知道的一些网站,报纸,书籍等描述这样的方法? 谢谢
编辑 :SQL Server 2008中的地理扩展也忽视计算距离时,高度信息。
i'm目前处理与精确高度测量组合GPS数据。 我想计算两个consecuting点之间的距离。 有大量的信息在那里有关使用WGS84椭球等上两点之间的距离计算。
但是,我并没有发现需要高度变化考虑进去这个距离计算的任何信息。
没有人知道的一些网站,报纸,书籍等描述这样的方法? 谢谢
编辑 :SQL Server 2008中的地理扩展也忽视计算距离时,高度信息。
我实现使用的开始和结束高度为恒定高度的平均值的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);
}
在实践中我们发现,高度差几乎使一个大的差异,我们的路径是典型1-2km长有100米量级的高度变化,我们看一下〜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坐标和限定上述常数。
你可能不关心海拔大型2D距离separatiions。 所以,如果你得到的DIST是在说20(或50或许)公里,那么谁在乎的高度差异(取决于你的需要的情况下)。 在说20公里,饲料中的简单的勾股除了高度差。 饲料它顺利。
2地理点之间的距离?
我建议,在任何距离,其中使用WGS84会给你显著更好的精确度,在高度差并不重要。 而在其中海拔的不同事项的任何距离你应该只使用直线近似。
为了做到这一点,你必须解决的首要问题是如何界定的高度变化。 正规方程组工作,因为他们是在二维表面,但是增加第三个维度是指最短距离的简单定义不再适用,例如现在THRID尺寸“在剧中你的最短距离可以减少通过原椭球。 这是一个有点快速和肮脏的,但你最好的解决方案可能是假设alltitude的变化率是沿椭圆原始的2D路径不变。 然后,可以计算出2D距离的长度,计算出高度的变化率,然后简单地用毕达哥拉斯来计算与所述三角形是所述二维距离的一侧的长度的增加,以及高度为所述第二长度。
首先,你需要一个模型,告诉你海拔高度上的两个点之间的线路将如何变化。 如果没有这样的模型,你不必两点之间的距离的任何一致的定义。
如果你有一个线性模型(行驶50%的点,也意味着你去向上通过高度的50%之间的距离),那么你或许可以假装整个事情是一个直角三角形; 也就是说,你的行为仿佛世界是平的确定高度转变如何影响距离的目的。 沿地面的距离为基础,高度的变化是三角形的高度,斜边是从点您预计真正的行驶距离为指向。
如果您想进一步细化,那么你就可以注意到,上面的模型是无限小的距离非常好,这意味着你可以在远处,演算式的个体三角洲利用当前高度来计算地迭代,每次距离,然后使用相同的三角比率来计算到行进的距离的海拔变化的贡献。 我可能会,也可能通过试验和错误搞清楚真实值的小量内获得所需的片数这样做是有10到100个分段的为()循环。 这也有可能制定出的线积分这种模式下,找出两点之间的实际距离。