Я ищу PHP-библиотеку / PHP-скрипт, который позволяет вычислить точную ограничительную рамку для данной центральной точки (lat / lon).
Использование формулы эллипсоида (f.ex. WGS84) было бы здорово. Я знаю, должна быть библиотека, но я не могу ее найти.
Функция неправильна после бит // подшипников, она должна быть следующей:
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
Это относительная простая проблема для решения, если вы предполагаете, что ограничительная коробка работает на восток-запад в одном направлении, а с севера на юг – в другую. Вы можете делать широту и долготу самостоятельно.
Для широты отсортируйте точки с запада на восток. В этот момент вы должны рассматривать список как циклический буфер. Вам нужно проверить каждую точку и найти ту, которая находится в самой отдаленной следующей точке. Так что предположим, что десять очков – от 0 до 9 , если 4 и 5 наиболее отдалены, ширина ограничивающего прямоугольника составляет от 5 до 4 . Назовите их w и e
Для долготы вам просто нужно найти самые северные и самые южные точки, назовите их n и s .
Длины w и a e и широты n и a s определяют ограничивающий прямоугольник.