MySQL

2017-02-24 12 views
5

में उत्तर पूर्व और दक्षिण पश्चिम निर्देशांक के एक बाउंडिंग बॉक्स के अंदर डेटाबेस से सभी बिंदु प्राप्त करें मैं वर्तमान में किसी विशेष शहर में सभी भू-टैग किए गए पेड़ दिखाने के लिए एक एप्लिकेशन बना रहा हूं। मुख्य स्तंभों मैं तालिका से डेटा प्राप्त करने का उपयोग कर रहा इस प्रकारMySQL

+-----------------+-------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+-----------------+-------------+------+-----+---------+-------+ 
| tree_geotags_id | int(11)  | NO | PRI | None |  | 
| lattitude_dl | double(9,7) | YES |  | NULL |  | 
| longitude_dl | double(9,7) | YES |  | NULL |  | 
+-----------------+-------------+------+-----+---------+-------+ 

तालिका 158,000 से अधिक पंक्तियां हैं कर रहे हैं।

वर्तमान में मैं निम्न क्वेरी का उपयोग कर रहा है मेरी उत्पादन प्राप्त करने के लिए,

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl, 
    SQRT(
     POW(69.1 * (gt.latitude_dl - [ center_lat ]), 2) + 
     POW(69.1 * ([ center_lon ] - gt.longitude_dl) * COS(gt.latitude_dl/57.3), 2) 
    ) AS distance 
    FROM tree_geotags_t gt 
    HAVING distance < 0.4 ORDER BY distance 

यह क्या है है, यह 0.4 के एक त्रिज्या में सभी रिकॉर्ड को हासिल करेगा। मैं डेटा लाने के लिए एक AJAX कॉल का उपयोग करता हूं, हर बार जब नक्शा परिवर्तन के केंद्र समन्वय (मानचित्र पैन या ज़ूम पर) होता है, तो प्राप्त डेटा को geojson प्रारूप में रूपांतरित करें और फिर उसे परत पर एक परत के रूप में लोड करें। मेरे साथ जो मुद्दा है, वह उन जगहों पर है जहां पेड़ों की बहुत अधिक घनत्व होती है, नक्शा के लिए सभी बिंदुओं को रखने में काफी समय लगता है और चूंकि यह इसे त्रिज्या पर लाता है, यह उन बिंदुओं को लोड करता है जो बाहर भी हैं व्यूपोर्ट।

मुझे पूर्वोत्तर और दक्षिणपश्चिम निर्देशांक का उपयोग सीमाओं के रूप में केवल व्यूपोर्ट के अंदर निर्देशांक में डेटा लोड करने के लिए एक प्रश्न की आवश्यकता है। मैंने यहां थोड़ी देर के लिए खोज की लेकिन मेरी आवश्यकताओं के अनुरूप कुछ भी नहीं मिला। कृपया मेरी मदद करें। अग्रिम में धन्यवाद..!!

+0

एक WHERE क्लॉज जोड़ें जो आपके लक्ष्य मानों से अक्षांश/लंबे निचले/अधिक के साथ प्रविष्टियों को बाहर करता है ...? – CBroe

उत्तर

0

आप बहुत करीब हैं। आपका (अन्यथा ग़लत रूप से गलत) दूरी सूत्र में आपके बाउंडिंग बॉक्स चेक का बीज शामिल है।

इस

SET @distance_unit := 69.0; /* for miles, use 111.045 for km. */ 
SET @radius := 1.0;   /* for radius */ 
SET @center_lat := target_latitude_in_degrees; 
SET @center_lon := target_longitude_in_degrees; 

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl 
    FROM tree_geotags_t gt 
WHERE gt.latitude_dl 
    BETWEEN @center_lat - (@radius/@distance_unit) /*east boundary*/ 
     AND @center_lat + (@radius/@distance_unit) /*west*/ 
    AND gt.longitude_dl 
    BETWEEN @center_lon - (@radius/(@distance_unit * COS(RADIANS(@center_lat)))) /*south*/ 
     AND @center_lon + (@radius/(@distance_unit * COS(RADIANS(@center_lat)))) /*north*/ 

मान लीजिए आप पूर्व, पश्चिम, उत्तर, और अपने सीमांकन बॉक्स के बजाय इसके केंद्र के दक्षिण सीमाएं नहीं पता की कोशिश करो। यह उपरोक्त कोड का एक आसान अनुकूलन है।

SELECT gt.tree_geotags_id, gt.latitude_dl, gt.longitude_dl 
    FROM tree_geotags_t gt 
WHERE gt.latitude_dl BETWEEN @east AND @west 
    AND gt.longitude_dl BETWEEN @south AND @north 

कैसे अपने कोनों से अपने बाउंडिंग बॉक्स के पक्ष प्राप्त करने के लिए का सवाल मामूली बात है के रूप में सीमांकन बॉक्स निर्देशांकों के रूप में लंबे समय से डिग्री में हैं। अगर उन्हें कुछ प्रोजेक्शन इकाइयों में दिया जाता है (जैसे transverse UTM coordinate एस) स्टैक ओवरफ़्लो पोस्ट में कोई जवाब नहीं होगा।

यह क्वेरी (latitude_dl, longitude_dl, tree_geotags_id) पर एक कंपाउंड इंडेक्स द्वारा तेजी से बनाई जा सकती है अक्षांश खोज इंडेक्स रेंज स्कैन का उपयोग करेगी, और देशांतर से आईडी को सीधे पुनर्प्राप्त किया जा सकता है।

आपके दूरी के सूत्र में क्या गलत है? यह कार्टशियन है, लेकिन आपको गोलाकार कोसाइन कानून सूत्र की आवश्यकता है क्योंकि आप गोलाकार निर्देशांक से निपट रहे हैं।

यह उत्तर या दक्षिण ध्रुव के करीब काम नहीं करेगा (क्योंकि कॉस (अक्षांश) वहां शून्य की तरफ जाता है) लेकिन यह ठीक है; आप पेड़ों से निपट रहे हैं, और वे वहां तक ​​नहीं बढ़ते हैं।

यहां विषय पर एक व्यापक लेखन है। http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

+0

सुधारों के लिए धन्यवाद, लेकिन मैं वास्तव में एक प्रश्न की तलाश में हूं जो मुझे व्यूपोर्ट के अंदर सभी बिंदुओं को प्राप्त करने में मदद करेगा। मुझे सभी 4 कोनों, पूर्वोत्तर, उत्तर-पश्चिम, दक्षिणपूर्व और दक्षिणपश्चिम के लिए निर्देशांक मिल रहे हैं। हालांकि, मैं इन मानकों के बीच सभी पेड़ प्राप्त करने के लिए इन मूल्यों का उपयोग करके एक प्रश्न बनाने में सक्षम नहीं हूं। –

+0

ऐसा इसलिए है क्योंकि, जब मैं ज़ूम इन करता हूं, यह अभी भी व्यूपोर्ट के बाहर बिंदु लोड करता है। यदि इन्हें टाला जा सकता है, तो प्रदर्शन बहुत तेज हो सकता है। –

+0

मुझे डर है कि आप समस्या को खत्म कर रहे हैं। –