MySQL 大圏距離 (Haversine 式) 質問する

MySQL 大圏距離 (Haversine 式) 質問する

経度と緯度の値を取得し、それを MySQL クエリに入力する PHP スクリプトが動作しています。これを完全に MySQL で実行したいと思っています。現在の PHP コードは次のとおりです。

if ($distance != "Any" && $customer_zip != "") { //get the great circle distance

    //get the origin zip code info
    $zip_sql = "SELECT * FROM zip_code WHERE zip_code = '$customer_zip'";
    $result = mysql_query($zip_sql);
    $row = mysql_fetch_array($result);
    $origin_lat = $row['lat'];
    $origin_lon = $row['lon'];

    //get the range
    $lat_range = $distance/69.172;
    $lon_range = abs($distance/(cos($details[0]) * 69.172));
    $min_lat = number_format($origin_lat - $lat_range, "4", ".", "");
    $max_lat = number_format($origin_lat + $lat_range, "4", ".", "");
    $min_lon = number_format($origin_lon - $lon_range, "4", ".", "");
    $max_lon = number_format($origin_lon + $lon_range, "4", ".", "");
    $sql .= "lat BETWEEN '$min_lat' AND '$max_lat' AND lon BETWEEN '$min_lon' AND '$max_lon' AND ";
    }

これを完全に MySQL にする方法を知っている人はいますか? インターネットを少し調べてみましたが、それに関する文献のほとんどはかなりわかりにくいです。

ベストアンサー1

からGoogle Code FAQ - PHP、MySQL、Google マップを使用した店舗検索の作成:

以下は、37, -122 座標から半径 25 マイル以内にある最も近い 20 か所を検索する SQL ステートメントです。このステートメントは、その行の緯度/経度とターゲットの緯度/経度に基づいて距離を計算し、距離値が 25 未満の行のみを要求し、クエリ全体を距離順に並べ替えて、結果を 20 件に制限します。マイルではなくキロメートルで検索するには、3959 を 6371 に置き換えます。

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) 
* cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin(radians(lat)) ) ) AS distance 
FROM markers 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 20;

おすすめ記事