実装の原則は、まずその点の周りの長方形の 4 つの点を計算し、次に経度と緯度を使用してデータベース内のレコードを直接照合することです。
- //周囲の座標を取得
- public function returnSquarePoint($lng, $lat,$ distance = 0.5){
- $earthRadius = 6378138;
- $dlng = 2 * asin(sin($ distance / (2 * $earthRadius )) / cos(deg2rad($lat)));
- $dlng = rad2deg($dlng);
- $dlat = $ distance/$earthRadius;
- $dlat = rad2deg($dlat);
- return array(
- 'left -top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
- 'right-top'=>array('lat'=> $lat + $dlat, 'lng'=>$lng + $dlng),
- 'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
- 'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
- );
- }
- // 2 つを計算します座標の直線距離
-
- public function getDistance($lat1, $lng1, $lat2, $lng2){
- $earthRadius = 6378138; // 地球のおおよその半径 (メートル)
- // ラジアンに変換
- $lat1 = ( $lat1 * pi()) / 180;
- $lng1 = ($lng1 * pi()) / 180;
- $lat2 = ($lat2 * pi()) / 180;
- $lng2 = ($lng2 * pi( )) / 180;
- // 定規とコンパスで計算するには半正弦の公式を使用します
- $calcLongitude = $lng2 - $lng1;
- $calcLatitude = $lat2 - $lat1;
- $stepOne = pow(sin($calcLatitude / 2), 2 ) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2)
- $stepTwo = 2 * asin(min(1, sqrt($stepOne))); ;
- $calculatedDistance = $earthRadius * $stepTwo;
- returnround($calculatedDistance);
- }
コードをコピー
|