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

380
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 клетокВыглядело это примерно так:

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

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

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

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

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

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

350