формула широты / долготы в решении php для определения углов NSWE из центральной точки - PullRequest
1 голос
/ 28 февраля 2012

широта / большое расстояние около 800 футов с каждой стороны от центра.

У меня есть центральная точка:
Широта: 38.6806353
Долгота: -96,5001029

Я пытаюсь определить формулу с помощью php, как получить широту / долготу к углам NWSE приблизительно в 800 футах наружу от центральной точки.

Таким образом, я получу результат, похожий на (но не правильный):

Центральный:
38.6806353 -96.5001029
N: 38,6806353 -96,5001029
. W: 38,6806353 -96,5001029
S: 38,6806353 -96,5001029
E: 38,6806353 -96,5001029

Я пытался перепроектировать несколько Javascript, которые я нашел, но безуспешно.

Имеется ли класс php, который выполняет эту математику или подобное, что потребует незначительных изменений? Я пока не могу найти его ...

Я нашел эту функцию, и я играл с ней. Я могу получить хороший вывод массива, как:

Array ( [0] => -112.35301079549 [1] => 36.105603064867 [2] => -112.25722008867 [3] => 36.105603064867 )

Но я не могу получить N W S E координаты для генерации? Кто-нибудь знает, что я делаю не так с этим? Мне нужно 4 набора значений вместо двух, таких как:

N: 38,6806353 -96,5001029
W: 38,6806353 -96,5001029
S: 38,6806353 -96,5001029
E: 38,6806353 -96,5001029

<?php function getBoundingBox($lon_degrees,$lat_degrees,$distance_in_miles) { 

    $radius = 3963.1; // of earth in miles

    // bearings 
    $due_north = 0;
    $due_south = 180;
    $due_east = 90;
    $due_west = 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($lon1,$lat1,$lon2,$lat1);
}
?>

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

Я заметил, что $ due_north, $ due_south и т. Д. Даны в градусах, но у вас есть грех ($ due_east) без преобразования $ due_east в радианы.

Для 90 градусов (восток), θ = pi/ 2 (90 градусов), d / R будет 800 футов / 5280 футов / ми / 3959 миль (радиус Земли в милях), lat1 / lon1 - ваша центральная точка широта / долгота в радианах.

east_lat = asin(sin(lat1)*cos(d/R) + cos(lat1)*sin(d/R)*cos(θ))
east_lon = lon1 + atan2(sin(θ)*sin(d/R)*cos(lat1), cos(d/R)−sin(lat1)*sin(lat2)) 

Преобразовать обратно в градусы, затем повторить для остальных 3 углов.

Комментарий в вашем коде ссылается на сайт:

http://www.movable -type.co.uk / scripts / latlong.html

Перейти к разделу Пункт назначения с указанным расстоянием и азимутом от начальной точки .Вы можете проверить свои расчеты с помощью калькулятора на веб-странице.

1 голос
/ 28 февраля 2012

Ограничительная рамка должна удовлетворять некоторым условиям, которые вы не упомянули. Например, Google Maps использует кривую z и уровень масштабирования 21, чтобы подразделить карту на меньшие плитки. Я не знаю, насколько велика одиночная плитка на расстоянии, но я использую сценарий Джона Брэффорда для преобразования гео-координат в WGS84 Datum. Существует также метод для возврата ограничивающего прямоугольника плитки. Вы можете найти скрипт здесь: http://bafford.com/software/aggregate-map-tools/GlobalMapTiles.php.txt.

...