2

私は何年もの間 MySQL でこれを行ってきましたが、PHP でこれを行うにはどうすればよいでしょうか?

CoordinateArray の例: http://pastebin.com/grVsbgL9

指定された座標から 100 マイル以内のすべての座標を返したいと思います。

function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
    //
    return $resultArray;
}

MySQL では、通常、次のようなクエリを使用しました。

SELECT *, ( 3959 * acos( cos( radians($latitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians($longitude) ) + sin( radians($latitude) ) * sin( radians( latitude ) ) ) ) AS distance FROM table HAVING distance < $radius ORDER BY distance;

PHPで同じことを行うにはどうすればよいですか?

4

2 に答える 2

3

以下のコードでは、座標オブジェクトが 2 つの要素の配列 ( $centerパラメータと$coordinateArrayの座標の両方) として格納されていると想定しています。そうでない場合は、何を変更する必要があるかがかなり明白になるはずです。

function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
  $resultArray= array();
  $lat1 = $center[0];
  $long1 = $center[1];
  foreach ($coordinateArray as $coordinate) {
    $lat2 = $coordinate[0];
    $long2 = $coordinate[1];
    $distance = 3959 * acos(cos(radians($lat1)) * cos(radians($lat2)) * cos(radians($long2) - radians($long1)) + sin(radians($lat1)) * sin(radians($lat2)));
    if ($distance < $radius) $resultArray[] = $coordinate;
  }
  return $resultArray;  
}

コードはすべての座標をループし、中心点からの距離を計算し、指定された$radius未満の場合は、座標を$resultArrayに追加します。

$distanceの計算を確認していません。基本的には、mysql クエリからカット アンド ペーストしただけなので、正しいと思います。

また、上記のコードはラジアン関数の存在を前提としています。持っていない場合は、次のように追加できます。

function radians($deg) { 
  return $deg * M_PI / 180;
}

これは、座標が度単位であると仮定しています。

于 2013-06-24T23:00:53.870 に答える