पाइथागोरस याद है?
$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))";
तकनीकी रूप से यह वास्तविक दूरी के बजाय दूरी का वर्ग है, लेकिन चूंकि आप इसे केवल छँटाई के लिए उपयोग कर रहे हैं इससे कोई फर्क नहीं पड़ता।
यह तलीय दूरी सूत्र का उपयोग करता है, जो छोटी दूरी पर अच्छा होना चाहिए।
हालांकि:
यदि आप अधिक सटीक होना चाहते हैं या लंबी दूरी का उपयोग करना चाहते हैं, तो इस सूत्र का उपयोग महान सर्कल दूरियों के लिए करें रेडियन में :
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))";