Библиотека PHP: рассчитать ограничивающую рамку для заданной широты/долготы

Я ищу PHP-библиотеку/php-скрипт, который позволяет мне рассчитать точную ограничивающую рамку для заданной центральной точки (широта/долгота).

Было бы здорово использовать формулу эллипсоида (например, WGS84). Я знаю, что должна быть библиотека, но я не могу ее найти.


person brain    schedule 13.04.2010    source источник


Ответы (2)


Функция неверна после // бита подшипников, она должна быть такой:

function getBoundingBox($lat_degrees,$lon_degrees,$distance_in_miles) {

    $radius = 3963.1; // of earth in miles

    // bearings - FIX   
    $due_north = deg2rad(0);
    $due_south = deg2rad(180);
    $due_east = deg2rad(90);
    $due_west = deg2rad(270);

    // convert latitude and longitude into radians 
    $lat_r = deg2rad($lat_degrees);
    $lon_r = deg2rad($lon_degrees);

    // find the northmost, southmost, eastmost and westmost corners $distance_in_miles away
    // original formula from
    // http://www.movable-type.co.uk/scripts/latlong.html

    $northmost  = asin(sin($lat_r) * cos($distance_in_miles/$radius) + cos($lat_r) * sin ($distance_in_miles/$radius) * cos($due_north));
    $southmost  = asin(sin($lat_r) * cos($distance_in_miles/$radius) + cos($lat_r) * sin ($distance_in_miles/$radius) * cos($due_south));

    $eastmost = $lon_r + atan2(sin($due_east)*sin($distance_in_miles/$radius)*cos($lat_r),cos($distance_in_miles/$radius)-sin($lat_r)*sin($lat_r));
    $westmost = $lon_r + atan2(sin($due_west)*sin($distance_in_miles/$radius)*cos($lat_r),cos($distance_in_miles/$radius)-sin($lat_r)*sin($lat_r));


    $northmost = rad2deg($northmost);
    $southmost = rad2deg($southmost);
    $eastmost = rad2deg($eastmost);
    $westmost = rad2deg($westmost);

    // sort the lat and long so that we can use them for a between query        
    if ($northmost > $southmost) { 
        $lat1 = $southmost;
        $lat2 = $northmost;

    } else {
        $lat1 = $northmost;
        $lat2 = $southmost;
    }


    if ($eastmost > $westmost) { 
        $lon1 = $westmost;
        $lon2 = $eastmost;

    } else {
        $lon1 = $eastmost;
        $lon2 = $westmost;
    }

    return array($lat1,$lat2,$lon1,$lon2);
}

Я получил эту функцию благодаря: http://xoxco.com/clickable/php-getboundingbox

person susheel    schedule 30.06.2010
comment
Кто-нибудь проверял эту функцию? Это не совсем дает вам ожидаемые значения, т. е. ваша ограничивающая рамка не содержит исходной точки широты и долготы. - person ina; 24.02.2012
comment
Глубоких испытаний не проводил, но вроде работает нормально. Большое спасибо. - person Tadas Sasnauskas; 27.09.2012
comment
Я протестировал этот скрипт и пришел к выводу, что долготы не точны. - person Gilly; 01.11.2012
comment
Спасибо за исправление подшипника, меня убило. - person neoplomero; 22.01.2020

Эту проблему относительно легко решить, если предположить, что ограничивающая рамка проходит с востока на запад в одном направлении и с севера на юг в другом. Вы можете сделать широту и долготу независимо друг от друга.

Для широты отсортируйте точки с запада на восток. В этот момент вы должны рассматривать список как круговой буфер. Вам нужно протестировать каждую точку и найти ту, у которой самая удаленная следующая точка. Итак, предположим, что десять точек от a0 до a9, если a4 и a5 наиболее удалены, ограничивающие широту поле от 5 до 4. Назовите их w и e

Для определения долготы вам просто нужно найти самую северную и самую южную точки, обозначив их как n и as.

Долгота aw и ae и широта an и as определяют ограничивающую рамку.

person cletus    schedule 13.04.2010