Есть 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-запросов? Знаю, что вроде есть какая-то формула для вычисления ближайших координат, построенная на косинусах, тангенсах и синусах.
Есть вот такое решение на 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Недавно я создал код, который бы генерировал поле 50x50 клетокВыглядело это примерно так:
Есть сайт на React (но не SPA) со множеством ajax запросов через JQueryНужно ко всем GET/POST запросам добавить дополнительный параметр в URL