WGS点的从WGS定义线段的距离(Distance of wgs point from a wgs

2019-07-28 20:28发布

我搜查,但我无法找到一个完整的答案。 在C#中,如果在所有可能的。 我需要在球体上(地球精确地)一个WGS点和WGS点定义线段之间的最短距离。

float DistanceInKilometres(PointF LineStartA, PointF LineEndB, PointF ThePoint)

编辑:也许一个例证,将有助于

请注意,这是一个理想的例子。 “点”可能是球体表面上的任何位置,该段开始结束了。 很显然,我不是在寻找通过球的距离。 数学是不是我的强势的一方,所以我不明白正常化 或直角 。 也许我也应该注意到,线路AB,是最短的,并且距离?太最短的。

Answer 1:

您可以使用余弦的球形法:

  • http://en.wikipedia.org/wiki/Spherical_law_of_cosines
  • http://mathworld.wolfram.com/SphericalSegment.html
  • http://mathworld.wolfram.com/SphericalTrigonometry.html

你将不得不使用地球半径进行计算:

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;
}
  • 如何计算从点距离线段,球体上?
  • http://en.wikipedia.org/wiki/Great-circle_distance

请记住,单位没有明确声明。 当与空间中的点处理有很多种方式来确定位置。 最主要的是你有你的单位明确到一致的类型。

当位置在地球上的工作,我主要使用经/纬度坐标和向量幅度/方向。 目前正在几个已知的类型使用矢量和地球的位置。 其中包括以下内容:

  • 地球为中心的地球固定(ECEF)坐标系
  • 东北向下(NED)
  • 大地坐标系

对于你的榜样,我可能会考虑坚持大地。

现在,将这一在一起,你可能有一些伪代码,看起来像这样:

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);
}


Answer 2:

如果您的点在于由您线段的结束点定义的走廊内,并垂直于行,那么这个答案应该做的。

如果你点的是位于外走廊然后计算从点的距离,线段的两端,取较小。



文章来源: Distance of wgs point from a wgs defined line segment