Ingat Pythagoras?
$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))";
Secara teknis itu adalah kuadrat jarak, bukan jarak sebenarnya, tetapi karena Anda hanya menggunakannya untuk menyortir, itu tidak masalah.
Ini menggunakan rumus jarak planar, yang seharusnya bagus untuk jarak kecil.
NAMUN:
Jika Anda ingin lebih presisi atau menggunakan jarak yang lebih jauh, gunakan rumus ini untuk jarak lingkaran besar dalam radian :
dist = acos[ sin(lat1)*sin(lat2)+cos(lat1)*cos(lat2)*cos(lng1-lng2) ]
(Untuk mendapatkan jarak dalam satuan nyata, bukan radian, kalikan dengan jari-jari Bumi. Namun, itu tidak perlu untuk tujuan pengurutan.)
Lintang dan bujur diasumsikan oleh mesin komputasi MySQL dalam radian, jadi jika disimpan dalam derajat (dan mungkin demikian), Anda harus mengalikan setiap nilai dengan pi/180, kira-kira 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))";
atau bahkan:
$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))";