Сократить этот код, который определяет расстояние между двумя широтами / долготами в C #? - PullRequest
1 голос
/ 07 октября 2010
public static double Distance(LatLong from, LatLong to)
{
    double lat1 = from.Latitude * (Math.PI / 180.0);
    double lat2 = to.Latitude * (Math.PI / 180.0);

    return
        Math.Acos((Math.Sin(lat1) * Math.Sin(lat2)) +
        (Math.Cos(lat1) * Math.Cos(lat2) *
        Math.Cos((Math.PI / 180.0) * (to.Longitude - from.Longitude)))) * 3958.760;
}

Можете ли вы укоротить этот код?Мне просто интересно ...

Ответы [ 3 ]

3 голосов
/ 07 октября 2010

Это стандартная сферическая формула косинуса.Вы не получите это проще, чем это.В лучшем случае вы могли бы немного очистить код:

public static double Distance(LatLong from, LatLong to)
{
    double deg = Math.PI / 180.0;       // One degree in radians
    double lat1 = from.Latitude * deg;
    double lat2 = to.Latitude * deg;
    double dLng = (to.Longitude - from.Longitude) * deg;
    double R = 3958.760;

    return Math.Acos(Math.Sin(lat1) * Math.Sin(lat2) +
                     Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(dLng)) * R;
}
1 голос
/ 07 октября 2010

Нет, но я могу предложить более короткий, более быстрый, но гораздо менее точный способ получения относительных расстояний:

public static double RelativeDistance(LatLong from, LatLong to)
{
  return (from.Latitude - to.Latitude) * (from.Latitude - to.Latitude) + (from.Longitude - to.Longitude) * (from.Longitude - to.Longitude);
}

Возвращает значение относительно квадратарасстояние в терминах проекции координат на квадратную двумерную сетку (как если бы мир представлял собой прямоугольник 2: 1).Это настолько бесполезно для реальных расстояний, что я даже не потрудился бы взять квадратный корень, чтобы вернуть его обратно пропорциональному проекции (поскольку проекция глупа), но он может служить для быстрой сортировки по относительным расстояниям внутри такихнебольшая область (и достаточно далеко от полюсов), что грубая неточность не имеет большого значения.

Следовательно, это не поможет вам рассчитать ваши расходы на топливо, но поможет вам определить, какой паб(наверное) ближайший.Если вы хотите отсортировать по относительному расстоянию до заданной точки, это может хорошо послужить, и его скорость будет благом.Вне этого использования это бессмысленно.

0 голосов
/ 07 октября 2010

Формула выглядит так, как будто она вычисляет расстояние вдоль поверхности сферы и, таким образом, будет достаточно точной даже для точек, которые находятся практически на противоположных сторонах света. Если расстояния будут очень близки друг к другу, вы можете приблизить их, проецируя точки на поверхность цилиндра (соосного с Землей), проходящего через одну из точек; масштабируйте цилиндр так, чтобы расстояния север / юг и восток / запад на цилиндре соответствовали расстояниям на Земле. Это просто потребует принятия косинуса одной из широт. Обратите внимание, что если точки находятся достаточно далеко друг от друга, так что важно, какую широту точки вы используете, они слишком далеко друг от друга, чтобы это было хорошим приближением, но для небольших расстояний такой подход быстрый и легкий.

Обратите внимание, что что-то вроде конической проекции будет точным на более широких расстояниях, но также потребует дополнительных вычислений; если кто-то пойдет на такие неприятности, он также может использовать «правильные» вычисления.

...