Найти ближайшие 5 координат к данным

53
13 января 2018, 03:18

Есть json с названиями городов и их координатами:

[{
    "coordinates": {
      "lon": 37.617633,
      "lat": 55.755786
    },
    "code": "MOW",
    "name": "Moscow"
}, {
    "coordinates": {
      "lon": 30.315785,
      "lat": 59.939039
    },
    "code": "LED",
    "name": "Saint Petersburg"
}, {
    "coordinates": {
      "lon": 30.5,
      "lat": 50.45
    },
    "code": "IEV",
    "name": "Kiev"
}, {
    "coordinates": {
      "lon": 27.5666667,
      "lat": 53.9
    },
    "code": "MSQ",
    "name": "Minsk"
}, {
    "coordinates": {
      "lon": 49.29824,
      "lat": 55.60844
    },
    "code": "KZN",
    "name": "Kazan"
}, {
    "coordinates": {
      "lon": 36.281185,
      "lat": 49.92078
    },
    "code": "HRK",
    "name": "Kharkov"
}, {
    "coordinates": {
      "lon": 126.9779692,
      "lat": 37.566535
    },
    "code": "SEL",
    "name": "Seoul"
}]

Я беру координаты города Москва и хочу найти 4 ближайших к Москве города по их координатам. В данном случае, это должны быть Санкт-Петербург, Казань, Минск и Харьков. Можно ли как-то это реализовать на JS без скачивания геобазы в PHP и отправки ajax-запросов? Знаю, что вроде есть какая-то формула для вычисления ближайших координат, построенная на косинусах, тангенсах и синусах.

Answer 1

Есть вот такое решение на php(взято с сайта gis-lab.info Автор: Максим Дубинин), там чисто математические вычисления и легко переделать на js:

/*
 * Расстояние между двумя точками
 * $φA, $λA - широта, долгота 1-й точки,
 * $φB, $λB - широта, долгота 2-й точки
 * Написано по мотивам http://gis-lab.info/qa/great-circles.html
 * Михаил Кобзарев <mikhail@kobzarev.com>
 *
 */
function calculateTheDistance ($φA, $λA, $φB, $λB) {
    // Радиус земли
    $EARTH_RADIUS = 6372795;
    // перевести координаты в радианы
    $lat1 = $φA * M_PI / 180;
    $lat2 = $φB * M_PI / 180;
    $long1 = $λA * M_PI / 180;
    $long2 = $λB * M_PI / 180;
    // косинусы и синусы широт и разницы долгот
    $cl1 = cos($lat1);
    $cl2 = cos($lat2);
    $sl1 = sin($lat1);
    $sl2 = sin($lat2);
    $delta = $long2 - $long1;
    $cdelta = cos($delta);
    $sdelta = sin($delta);
    // вычисления длины большого круга
    $y = sqrt(pow($cl2 * $sdelta, 2) + pow($cl1 * $sl2 - $sl1 * $cl2 * $cdelta, 2));
    $x = $sl1 * $sl2 + $cl1 * $cl2 * $cdelta;
    //
    $ad = atan2($y, $x);
    $dist = $ad * $EARTH_RADIUS;
    return $dist;
}
READ ALSO
Проблема с циклами и клеточным игровым полем

Проблема с циклами и клеточным игровым полем

Недавно я создал код, который бы генерировал поле 50x50 клетокВыглядело это примерно так:

28
Как удалить input на чистом JS?

Как удалить input на чистом JS?

Дайте подсказку, как удалить инпут ?

26
Добавить параметр ко всем запросам JQuery Ajax

Добавить параметр ко всем запросам JQuery Ajax

Есть сайт на React (но не SPA) со множеством ajax запросов через JQueryНужно ко всем GET/POST запросам добавить дополнительный параметр в URL

67