ピタゴラスを覚えていますか?
$sql = "SELECT * FROM table
WHERE lon BETWEEN '$minLon' AND '$maxLon'
AND lat BETWEEN '$minLat' AND '$maxLat'
ORDER BY (POW((lon-$lon),2) + POW((lat-$lat),2))";
技術的には、これは実際の距離ではなく距離の2乗ですが、並べ替えに使用しているだけなので、問題ありません。
これは平面距離の式を使用します。これは、短い距離で有効です。
ただし:
より正確にしたい場合、またはより長い距離を使用したい場合は、大円距離のこの式を使用してくださいラジアンで :
dist = acos[ sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lng1-lng2) ]
(距離をラジアンではなく実数単位で取得するには、地球の半径を掛けます。ただし、注文の目的では必要ありません。)
緯度と経度は、MySQL計算エンジンによってラジアンであると想定されているため、度で保存されている場合(おそらくそうである場合)、各値にpi / 180、約0.01745を掛ける必要があります。
$sf = 3.14159 / 180; // scaling factor
$sql = "SELECT * FROM table
WHERE lon BETWEEN '$minLon' AND '$maxLon'
AND lat BETWEEN '$minLat' AND '$maxLat'
ORDER BY ACOS(SIN(lat*$sf)*SIN($lat*$sf) + COS(lat*$sf)*COS($lat*$sf)*COS((lon-$lon)*$sf))";
または:
$sf = 3.14159 / 180; // scaling factor
$er = 6350; // earth radius in miles, approximate
$mr = 100; // max radius
$sql = "SELECT * FROM table
WHERE $mr >= $er * ACOS(SIN(lat*$sf)*SIN($lat*$sf) + COS(lat*$sf)*COS($lat*$sf)*COS((lon-$lon)*$sf))
ORDER BY ACOS(SIN(lat*$sf)*SIN($lat*$sf) + COS(lat*$sf)*COS($lat*$sf)*COS((lon-$lon)*$sf))";