2015-10-13 107 views
1

我設法找到了一個函數,該函數給出了一個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

回答

1

假設您的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