Изучение методов расчета расстояния между широтой и долготой в Laravel

При работе с географическими данными в 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.