已知一點座標(經緯度),如何判斷其方圓500米的範圍?

你可以先算出該點周圍的矩形的四個點,然後使用經緯度去直接匹配數據庫中的記錄;如下圖

參考wiki百科上的一些球面計算公式:

假設已知點的經緯度分別爲$lng, $lat先實現經度範圍的查詢,在haversin公式中令φ1 = φ2,可得:

用PHP進行計算,就是:

 $dlng = 2 * asin(sin($distance / (2 * self::EARTH_RADIUS) / cos(deg2rad($lat))));
        $dlng = rad2deg($dlng);

然後是緯度範圍的查詢,在haversin公式中令 Δλ = 0,可得

在PHP中進行計算,就是:

$dlat = $distance / self::EARTH_RADIUS;
$dlat = rad2deg($dlat);

最後,就可以得出四個點的座標:

left-top : (lat + dlat, lng – dlng)

right-top : (lat + dlat, lng + dlng)

left-bottom : (lat – dlat, lng – dlng)

right-bottom: (lat – dlat, lng + dlng)

 

我把以上方法寫成了一個函數,綜合起來就是:

const EARTH_RADIUS = 6371;//地球半徑,平均半徑爲6371km
/**
 * 計算某個經緯度的周圍某段距離的正方形的四個點
 * @param $lng  經度
 * @param $lat  緯度
 * @param float $distance 該點所在圓的半徑,該圓與此正方形內切,默認值爲0.5km
 * @return array
 */
public static function squarePoint($lng, $lat, $distance=0.5)
{
    $dlng = 2 * asin(sin($distance / (2 * self::EARTH_RADIUS) / cos(deg2rad($lat))));
    $dlng = rad2deg($dlng);
    $dlat = $distance / self::EARTH_RADIUS;
    $dlat = rad2deg($dlat);
    return [
        ['lat' => $lat + $dlat, 'lng' => $lng + $dlng],//東北
        ['lat' => $lat + $dlat, 'lng' => $lng - $dlng],//西北
        ['lat' => $lat - $dlat, 'lng' => $lng - $dlng],//西南
        ['lat' => $lat - $dlat, 'lng' => $lng + $dlng],//東南
    ];
}

 

參考:https://zhidao.baidu.com/question/391364265109203045.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章