Какую формулу использовать для расчета небольшого расстояния - PullRequest
3 голосов
/ 01 февраля 2012

Hy!

Мне нужно рассчитать расстояние между двумя точками GPS.

Я прочитал этот вопрос Формулы для расчета географической близости но я плохо говорю по-английски.

Моя проблема в том, что 2 точки находятся на расстоянии не более 1 км. Мне нужна самая аккуратная формула из-за малого расстояния

Пример в PHP или псевдокоде был бы отличным

Ответы [ 2 ]

3 голосов
/ 01 февраля 2012

См. эту страницу . Он содержит расстояние между большими кругами функции вычисления для различных языков программирования.

В PHP:

function getDistance($latitude1, $longitude1, $latitude2, $longitude2) {  
    $earth_radius = 6371;  // In the unit you want the result in.

    $dLat = deg2rad($latitude2 - $latitude1);  
    $dLon = deg2rad($longitude2 - $longitude1);  

    $a = sin($dLat/2) * sin($dLat/2) + cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * sin($dLon/2) * sin($dLon/2);  
    $c = 2 * asin(sqrt($a));  
    $d = $earth_radius * $c;  

    return $d;  
}  
0 голосов
/ 01 февраля 2012
function spherical_law_of_cosines($lat_1, $lon_1, $lat_2, $lon_2, $unit = 'mi')
{
    $distance = (3956 * acos(cos(deg2rad($lat_1)) * cos(deg2rad($lat_2)) * cos(deg2rad($lon_2) - deg2rad($lon_1)) + sin(deg2rad($lat_1)) * sin(deg2rad($lat_2))));

    if(strcasecmp($unit, 'mi') == 0 OR strcasecmp($unit, 'miles') == 0)
    {
        return $distance;
    }

    if(strcasecmp($unit, 'km') == 0 OR strcasecmp($unit, 'kilometres') == 0 OR strcasecmp($unit, 'kilometers') == 0)
    {
        return 1.609344 * $distance;
    }

    if(strcasecmp($unit, 'm') == 0 OR strcasecmp($unit, 'metres') == 0 OR strcasecmp($unit, 'meters') == 0
    )
    {
        return 1.609344 * 1000 * $distance;
    }

    if(strcasecmp($unit, 'y') == 0 OR strcasecmp($unit, 'yards') == 0)
    {
        return 1760 * $distance;
    }

    if(strcasecmp($unit, 'ft') == 0 OR strcasecmp($unit, 'feet') == 0)
    {
        return 1760 * 3 * $distance;
    }

    return $distance;
}
...