你可以先算出該點周圍的矩形的四個點,然後使用經緯度去直接匹配數據庫中的記錄;如下圖
參考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