1. ホーム
  2. php

[解決済み] MySQL 大圏航路距離(Haversine 式)

2022-04-13 20:35:05

質問

経度と緯度の値を取得し、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にする方法をご存知の方はいらっしゃいますか?インターネットを少し見てみましたが、それに関する文献のほとんどはかなり分かりにくいです。

どのように解決するのですか?

から Google Code FAQ - PHP、MySQL、Google Mapsでストア・ロケーターを作成する :

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;