Артём Мáлков

Рассчитываем расстояние между двумя точками на поверхности Земли на PHP/JavaScript

26 мар0 комм

Представим, что в вашем распоряжении две пары географических координат (долгота и широта), и ваша задача – рассчитать кратчайшее расстояние между ними. Что для этого нужно сделать и, соответственно, учесть?

Поскольку Земля имеет форму, приближенную к сфере, расстояние между двумя географическими объектами на ней мы будем искать по формуле Гаверсинуса, которая в преобразованном виде выглядит следующим образом:

Рассчитываем расстояние между двумя точками на поверхности Земли на PHP/JavaScript

В ней:

r – радиус Земли в километрах;
φ1, φ2 – широта в радианах;
λ1, λ2 – долгота в радианах;

На основе ее составим две (по одной из указанных языков программирования) несложные функции, которые помогут нам получить нужный результат.

Как рассчитать расстояние между двумя координатами на PHP?

Итак, формула у нас есть, просто переведем ее в код и для удобства упакуем в некую функцию.

Вид всего этого будет следующий:

function distance($lat_1, $lon_1, $lat_2, $lon_2) {

	$radius_earth = 6371; // Радиус Земли

	$lat_1 = deg2rad($lat_1);
	$lon_1 = deg2rad($lon_1);
	$lat_2 = deg2rad($lat_2);
	$lon_2 = deg2rad($lon_2);

	$d = 2 * $radius_earth * asin(sqrt(sin(($lat_2 - $lat_1) / 2) ** 2 + cos($lat_1) * cos($lat_2) * sin(($lon_2 - $lon_1) / 2) ** 2));

	return number_format($d, 2, '.', '').' км.';

}

Вызов:

echo 'Расстояние между Костромой и Ярославлем: '.distance(57.37, 39.51, 57.46, 40.55); // 63.08 км.

В нем мы (в виде широта_1, долгота_1, широта_2, долгота_2) передаем известные координаты объектов и получаем кратчайшее расстояние между ними.

Поскольку Земля – не идеальная сфера, значение радиуса мы берем усредненное – 6371 километр, а потому в итоговом результате будет присутствовать погрешность в 0.5% (если верить Википедии).

Все координаты перед началом расчета мы переводим из градусов в радианы через функцию deg2rad.

Последовательность передаваемых пар координат не имеет значения.

Как рассчитать расстояние между двумя координатами на JavaScript?

Предыдущий вариант из PHP по определению расстояния между двумя точками в JavaScript будет выглядеть следующим образом:

function deg2rad(num) {

	// Функция для перевода градусов в радианы

	return num * Math.PI / 180;

}

function distance(lat_1, lon_1, lat_2, lon_2) {

	let radius_earth = 6371; // Радиус Земли
	
	let lat_1 = deg2rad(lat_1),
		lon_1 = deg2rad(lon_1),
		lat_2 = deg2rad(lat_2),
		lon_2 = deg2rad(lon_2);

	let d = 2 * radius_earth * Math.asin(Math.sqrt(Math.sin((lat_2 - lat_1) / 2) ** 2 + Math.cos(lat_1) * Math.cos(lat_2) * Math.sin((lon_2 - lon_1) / 2) ** 2));

	return d.toFixed(2)+' км.';

}

Использование аналогичное:

alert('Расстояние между Костромой и Ярославлем: '+distance(57.37, 39.51, 57.46, 40.55)); // 63.08 км

Согласитесь, не такая уж и сложная, но определенно полезная функция.

Рекомендуем к просмотру
Как определить, на сколько процентов прокручена страница на jQuery/JavaScript?
Посты
Как использовать две и более библиотек jQuery на сайте?
Статьи и советы
Простое склонение числительных на PHP/JavaScript
Модули и скрипты
0
комментариев
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
Подняться наверх
«Pandoge» - помощник вебмастера