Google マップの JavaScript v3 を使用しています。地図上に円を描き、ユーザーが半径を変更できるようにします。次に、中心の座標と半径 (km) をサーバー スクリプトに送信します。中心から半径未満の距離にあるすべてのマーカーを抽出します。大円の式と MySql GEOPOINT オブジェクトを使用して距離を計算します。
(6371 * acos (cos(radians(".$coord_X_center."))* cos(radians(X(GEOPOINT)))
* cos(radians(Y(GEOPOINT)) - radians(".$coord_Y_center."))
+ sin(radians(".$coord_X_center."))
* sin( radians(X(GEOPOINT) )))) AS Distance FROM table_markers c
HAVING Distance <= ".$radius." ORDER BY RATING desc,Distance;"
ここで、私が用意した例を考えてみましょう: 例 円の半径を変更すると、1 つのマーカーを除外するだけで、さらに多くのマーカーが消えます。これは、中心と消えたマーカーの間で計算された距離が、円の半径よりも大きいためです。なんで?違いはなんですか?上の式のように、Google マップは地球を球体と見なしていないのでしょうか?
アップデート:
POST リクエストが送信されました (firebug で再確認): centerx: 8.222424000000046
センター: 45.295839
半径: 60.84800957919576
それらはキャストされます:
$coord_X_center = number_format((float) $post_filtered['centerx'], 4, '.', '');
$coord_Y_center = number_format((float) $post_filtered['centery'], 4, '.', '');
$radius = (int) $post_filtered['radius'];
上記の式による答え:
{"names":["PONT-SAINT-MARTIN","FONTAINEMORE","LILLIANES","PERLOZ","GABY"],
"positions":[{"Lat":"7.81191320621736","Lon":"45.5991574533545"},
{"Lat":"7.88378299041174","Lon":"45.6488324511642"},
{"Lat":"7.85828195583629","Lon":"45.6242900876236"},
{"Lat":"7.81139246615188","Lon":"45.6285105114389"},
{"Lat":"7.88397564319245","Lon":"45.7144850123829"}]}