我设法找到了一个函数,它给出了我的NE角和SW角坐标给出了一个latLng和一个半径。
/**
* Get NE & SW coordinates around a point
*
* @param $lat float latitude of origin pt
* @param $lng float longitude of origin pt
* @param $distance int radius in km
*
*/
function getBoundsCoords($latitude, $longitude, $distance) {
$radius = 6378.1;
$neLat = rad2deg(asin(sin(deg2rad($latitude)) * cos($distance / $radius) + cos(deg2rad($latitude)) * sin($distance / $radius) * cos(deg2rad(0))));
$swLat = rad2deg(asin(sin(deg2rad($latitude)) * cos($distance / $radius) + cos(deg2rad($latitude)) * sin($distance / $radius) * cos(deg2rad(180))));
$neLng = rad2deg(deg2rad($longitude) + atan2(sin(deg2rad(90)) * sin($distance / $radius) * cos(deg2rad($latitude)), cos($distance / $radius) - sin(deg2rad($latitude)) * sin(deg2rad($neLat))));
$swLng = rad2deg(deg2rad($longitude) + atan2(sin(deg2rad(270)) * sin($distance / $radius) * cos(deg2rad($latitude)), cos($distance / $radius) - sin(deg2rad($latitude)) * sin(deg2rad($neLat))));
return array(
'ne' => array(
'lat' => $neLat,
'lng' => $neLng
),
'sw' => array(
'lat' => $swLat,
'lng' => $swLng
)
);
}
我还设法找到相反功能的一部分,它让我回到中心点坐标(非常容易),但我无法找到半径:
function getCoordsFromBounds($coordsNeSw) {
return array(
'lat' => ($coordsNeSw['ne']['lat'] + $coordsNeSw['sw']['lat']) / 2,
'lng' => ($coordsNeSw['ne']['lng'] + $coordsNeSw['sw']['lng']) / 2,
'radius' => "??????"
);
}
我怀疑我应该与getBoundsCoords()函数相反,但我对sin / cos / deg / rad不太满意...
答案 0 :(得分:1)
假设你的getCoordsFromBounds只适用于正方形而不是矩形,半径将是两个纬度或经度之间距离的一半。纬度差异比经度更容易计算。基于纬度的距离几乎恒定在111 km /度(从极点到赤道略有变化)
因此广场顶部和底部之间的距离为(以km为单位)
$distance = abs(($coordsNeSw['ne']['lat'] - $coordsNeSw['sw']['lat'])) * 111
因此半径是
的一半$radius = $distance / 2
我认为您计算边界框的解决方案似乎比需要的更复杂,请参阅Calculating bounding box a certain distance away from a lat/long coordinate in Java