我搜索过,但找不到完整的答案。 在C#中,如果可能的话。 我需要WGS点和球体上的WGS点定义线段之间的最短距离(确切地说是地球)。
float DistanceInKilometres(PointF LineStartA, PointF LineEndB, PointF ThePoint)
编辑:也许插图会有所帮助
请注意,这是一个理想的例子。 '点'可以是球体表面上的任何位置,即段开始端。显然,我不是在寻找通过球体的距离。数学不是我强大的一面,所以我不理解 normalize 或 to cartesian 。也许我还应该注意路径AB是最短的,而距离?也是最短的。
答案 0 :(得分:3)
你可以使用余弦的球面定律:
您必须使用地球的半径进行计算:
EARTH_RADIUS_KM = 6371;
在这里,从我对OsmMercator.java的贡献,来自openstreetmap.org:
/**
* Gets the distance using Spherical law of cosines.
*
* @param la1 the Latitude in degrees
* @param lo1 the Longitude in degrees
* @param la2 the Latitude from 2nd coordinate in degrees
* @param lo2 the Longitude from 2nd coordinate in degrees
* @return the distance
*/
public static double getDistance(double la1, double lo1, double la2, double lo2) {
double aStartLat = Math.toRadians(la1);
double aStartLong = Math.toRadians(lo1);
double aEndLat =Math.toRadians(la2);
double aEndLong = Math.toRadians(lo2);
double distance = Math.acos(Math.sin(aStartLat) * Math.sin(aEndLat)
+ Math.cos(aStartLat) * Math.cos(aEndLat)
* Math.cos(aEndLong - aStartLong));
return (EARTH_RADIUS_KM * distance);
}
您需要做的就是找到带点积的最近点,并将其与距离方程一起使用。
这是最接近的点示例:
double[] nearestPointSegment (double[] a, double[] b, double[] c)
{
double[] t= nearestPointGreatCircle(a,b,c);
if (onSegment(a,b,t))
return t;
return (distance(a,c) < distance(b,c)) ? a : c;
}
请记住,未明确声明单位。在处理太空中的点时,有多种方法可以确定位置。最重要的是你必须将你的单位确定为一致的类型。
当处理地球上的位置时,我主要使用纬度/经度坐标和向量来表示幅度/方向。有几种已知类型可用于向量和地球的位置。其中包括:
对于您的示例,我可能会考虑坚持使用Geodetic。
现在,把它们放在一起,你可能会有一些伪代码,如下所示:
Where a Vector is made up of Geodetic coordinates:
class Vector {
double x=0.0; //latitude
double y=0.0; //longitude
double h=0.0; //height
...
}
public Vector closestPoint(Vector lineStartA, Vector lineEndB, final Vector thePoint ) {
Vector w = thePoint.subtract(lineStartA);
double proj = w.dot(lineEndB);
// endpoint 0 is closest point
if ( proj <= 0.0f )
return lineStartA;
else
{
//Vector square
double vsq = lineEndB.dot(lineEndB);
// endpoint 1 is closest point
if ( proj >= vsq )
return lineStartA.add(lineEndB);
else
return lineStartA.add(lineEndB.multiply(proj/vsq));
}
}
double DistanceInKilometres(Vector lineStartA, Vector lineEndB, Vector thePoint) {
Vector cp=closestPoint(lineStartA, lineEndB, thePoint);
return getDistance(cp.x, cp.y, thePoint.x, thePoint.y);
}
答案 1 :(得分:0)
如果您的点位于由线段的终点定义并垂直于线段的走廊内,则此answer应该这样做。
如果您的点位于该走廊之外,则计算从您的点到线段每端的距离并取较小的值。