経度と緯度の値を取得し、それを 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;