При работе с географическими данными в Laravel часто необходимо рассчитать расстояния между координатами широты и долготы. В этой статье мы рассмотрим несколько методов выполнения этой задачи, а также примеры кода. Если вам нужно определить расстояние между двумя точками или найти близлежащие местоположения по расстоянию, эти методы пригодятся. Давайте погрузимся!
Метод 1: формула гаверсинуса
Формула гаверсинуса широко используется для расчета расстояний между двумя точками на поверхности Земли. Он учитывает кривизну Земли и дает точные результаты.
function calculateDistance($lat1, $lon1, $lat2, $lon2)
{
$earthRadius = 6371; // in kilometers
$latDelta = deg2rad($lat2 - $lat1);
$lonDelta = deg2rad($lon2 - $lon1);
$a = sin($latDelta / 2) * sin($latDelta / 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($lonDelta / 2) * sin($lonDelta / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$distance = $earthRadius * $c;
return $distance;
}
Метод 2: Формулы Винсенти
Формулы Винсенти обеспечивают более точный расчет расстояний между двумя точками на поверхности Земли с учетом формы эллипсоида. Laravel предоставляет пакет под названием «geocoder-php», реализующий эту формулу.
Сначала установите пакет с помощью Composer:
composer require willdurand/geocoder
Вот пример использования формул Винсенти:
use Geocoder\GeocoderFactory;
use Geocoder\Provider\GeocoderServiceProvider;
function calculateDistance($lat1, $lon1, $lat2, $lon2)
{
$geocoder = GeocoderFactory::create();
$geocoder->registerProviders([
new GeocoderServiceProvider\GeocoderServiceProvider(),
]);
$point1 = new Geocoder\Model\Coordinates($lat1, $lon1);
$point2 = new Geocoder\Model\Coordinates($lat2, $lon2);
$distance = $geocoder->getDistanceBetween($point1, $point2);
return $distance;
}
Метод 3: пакет Laravel GeoIP
Если вам нужно рассчитать расстояния на основе IP-адресов, можно использовать пакет Laravel GeoIP. Он предоставляет информацию о геолокации и позволяет рассчитывать расстояния между IP-адресами.
Сначала установите пакет с помощью Composer:
composer require torann/geoip
Вот пример расчета расстояния между двумя IP-адресами:
use Torann\GeoIP\GeoIPFacade as GeoIP;
function calculateDistance($ip1, $ip2)
{
$location1 = GeoIP::getLocation($ip1);
$location2 = GeoIP::getLocation($ip2);
$distance = GeoIP::getDistance($location1->lat, $location1->lon, $location2->lat, $location2->lon);
return $distance;
}
В этой статье мы рассмотрели несколько методов расчета расстояний между координатами широты и долготы в Laravel. Формула Хаверсина обеспечивает простой подход, а формулы Винсенти обеспечивают более высокую точность. Кроме того, пакет Laravel GeoIP позволяет рассчитывать расстояния на основе IP-адресов. Выберите метод, который лучше всего соответствует вашим потребностям, и начните включать географические вычисления в свои приложения Laravel.