从NE SW区域查找圆半径

问题描述:

我设法找到了一个函数,该函数给出了一个latLng和一个半径的NE角和SW角坐标。从NE SW区域查找圆半径

/** 
* 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

当您从NE。比如说” W区域“是指你获得的是平方英里,还是给定了NE和SW坐标,并且你需要基于该坐标的半径? –

+0

给出了NE和SW坐标,我正在寻找基于此的半径 – Axi

假设您的getCoordsFromBounds仅适用于正方形而不是矩形,则半径将是两个纬度或经度之间的距离。纬度差异比经度更容易计算。基于纬度距离是在111公里几乎恒定/度(从极轻微变化到赤道)

所以你的正方形的顶部和底部之间的距离是(单位:公里)

$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