ऐसा करने का सबसे तेज़ तरीका MySQL के लिए भू-स्थानिक एक्सटेंशन का उपयोग करना है, जो काफी आसान होना चाहिए क्योंकि आप पहले से ही MyISAM तालिका का उपयोग कर रहे हैं। इन एक्सटेंशन के लिए दस्तावेज़ यहां देखे जा सकते हैं:http:/ /dev.mysql.com/doc/refman/5.6/hi/spatial-extensions.html
POINT डेटाटाइप के साथ एक नया कॉलम जोड़ें:
ALTER TABLE `adverts`
ADD COLUMN `geopoint` POINT NOT NULL AFTER `longitude`
ADD SPATIAL KEY `geopoint` (`geopoint`)
फिर आप इस कॉलम को अपने मौजूदा अक्षांश और देशांतर क्षेत्रों से भर सकते हैं:
UPDATE `adverts`
SET `geopoint` = GeomFromText(CONCAT('POINT(',`latitude`,' ',`longitude`,')'));
अगला चरण इनपुट अक्षांश और देशांतर के आधार पर एक बाउंडिंग बॉक्स बनाना है जिसका उपयोग आपके WHERE
में किया जाएगा एक CONTAINS
के रूप में क्लॉज बाधा आपको X,Y का एक सेट निर्धारित करना होगा POINT
वांछित खोज क्षेत्र और दिए गए प्रारंभिक बिंदु के आधार पर आपकी आवश्यकताओं के लिए काम करने वाले निर्देशांक।
आपकी अंतिम क्वेरी सभी POINT
. की खोज करेगी डेटा जो आपकी खोज में है POLYGON
, और फिर आप अपने डेटा को और परिष्कृत और क्रमबद्ध करने के लिए दूरी गणना का उपयोग कर सकते हैं:
SELECT a.*,
ROUND( SQRT( ( ( (adverts.latitude - '53.410778') * (adverts.latitude - '53.410778') ) * 69.1 * 69.1 ) + ( (adverts.longitude - '-2.97784') * (adverts.longitude - '-2.97784') * 53 * 53 ) ), 1 ) AS distance
FROM adverts a
WHERE a.type_id = 3
AND CONTAINS(a.geopoint, GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))'))
HAVING distance < 25
ORDER BY distance DESC
LIMIT 0, 30
ध्यान दें कि GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))')
उपरोक्त में काम नहीं करेगा , आपको अपने खोज प्रारंभ के आसपास निर्देशांकों को मान्य बिंदुओं से बदलना होगा। यदि आप अक्षांश/लंबे समय के बदलने की अपेक्षा करते हैं, तो आपको POINT
रखने के लिए ट्रिगर का उपयोग करने पर विचार करना चाहिए डेटा और संबद्ध SPATIAL KEY
आधुनिक। बड़े डेटासेट के साथ आपको HAVING
का उपयोग करके प्रत्येक रिकॉर्ड के लिए दूरी की गणना करने और फ़िल्टर करने की तुलना में अत्यधिक बेहतर प्रदर्शन देखना चाहिए खंड। मैंने दूरी निर्धारित करने और बाउंडिंग POLYGON
. बनाने में उपयोग के लिए व्यक्तिगत रूप से कार्यों को परिभाषित किया है ।