Вопрос по c# – Расстояние от точки wgs до определенного отрезка линии wgs

2

Я искал, но я не мог найти полный ответ. В C # если это вообще возможно. Мне нужно кратчайшее расстояние между точкой WGS и отрезком, определенным точкой WGS на сфере (точно на Земле).

<code>float DistanceInKilometres(PointF LineStartA, PointF LineEndB, PointF ThePoint)
</code>

РЕДАКТИРОВАТЬ: Возможно, иллюстрация поможет

enter image description here

Обратите внимание, что это идеальный пример. «точка»; может быть где угодно на поверхности сферы, сегмент начала и конца тоже. Очевидно, я не ищу расстояние через сферу. Математика не моя сильная сторона, поэтому я не понимаюnormalize или жеto cartesian, Может быть, я также должен отметить, что путь AB - самый короткий из возможных, а расстояние? - тоже самый короткий из возможных.

Это может быть идея бога, чтобы узнать эти вещи. Простой веб-поиск должен дать массу информации по этой теме. Sam Axe
Связанные или дубликаты:stackoverflow.com/questions/1299567/… Nate Kohl
@Nate Kohl И когда я сказал «я не смог найти полный ответ», именно это я и имел в виду. JJ_Jason
напримерstackoverflow.com/questions/7803004/… Nate Kohl
Я удивлен, что ни у кого нет даже ссылки на возможное решение? JJ_Jason

Ваш Ответ

2   ответа
3

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;
}
How to calculate distance from a point to a line segment, on a sphere? http://en.wikipedia.org/wiki/Great-circle_distance

Имейте в виду, что единицы не были явно объявлены. При работе с точками в космосе существует множество способов определения позиции. Главное, чтобы вам приходилось прибегать к единицам единообразного типа.

Работая с положением на земле, я в основном использую координаты широты / долготы и векторы для величины / направления. Существует несколько известных типов, которые можно использовать для векторов и положения земли. Среди них есть следующие:

Earth-centered earth-fixed (ECEF) coordinate system North-East-Down (NED) Geodetic coordinate system

Для вашего примера, я мог бы рассмотреть возможность придерживаться геодезического.

Теперь, собрав это вместе, вы можете получить псевдокод, который выглядит следующим образом:

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);
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded JJ_Jason
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded JJ_Jason
Error: User Rate Limit Exceeded JJ_Jason
0

который определяется конечными точками вашего отрезка и перпендикулярно линии, то этоответ следует сделать.

Если ваша точка лежит за пределами этого коридора, то рассчитайте расстояние от вашей точки до каждого конца отрезка и выберите меньшее.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded JJ_Jason
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded JJ_Jason

Похожие вопросы