MKMapView ज़ूम और क्षेत्र


85

मैं Google मानचित्र जावास्क्रिप्ट एपीआई का उपयोग करने से परिचित हूं। हाल ही में मैंने एक iphone प्रोजेक्ट के लिए MapKit फ्रेमवर्क का उपयोग करना शुरू किया, लेकिन मुझे ज़ूम करने और क्षेत्र को मानचित्र पर सेट करने का कठिन समय मिल रहा है।

Google मैप्स एपीआई में मैंने पूर्णांक फ़ंक्शन सेटज़ूम () के साथ 8, 9, 10 जैसे पूर्णांक ज़ूम स्तरों का उपयोग किया। MapKit फ्रेमवर्क में मैं देख सकता हूँ कि एकमात्र समतुल्य विधि सेटिगेशन है: एनिमेटेड। जैसा कि मैं समझता हूं, मुझे ज़ूम स्तर निर्दिष्ट करने के लिए एक क्षेत्र की अवधि अक्षांश और देशांतर "डेल्टा" मान सेट करने की आवश्यकता है। लेकिन मुझे वास्तव में इस बात का अंदाजा नहीं है कि ये मूल्य क्या दर्शाते हैं (मैंने प्रलेखन पढ़ा)।

जब मैं MKMapView डेलीगेट का उपयोग करता हूं और क्षेत्र में मानों का पता लगाता हूं, तो डीडीसीचेंज प्रतिनिधि पद्धति के परिणाम एक-दूसरे को सहसंबंधित नहीं करते हैं। यह ठीक है जब मैं बाहर ज़ूम करता हूं और देखता हूं कि प्रलेखन में निर्दिष्ट डेल्टा मान बढ़ रहे हैं। लेकिन अचानक मैं ज़ूम के बिना मानचित्र खींचता हूं और डेल्टा मान 0.0 हो जाता है।

क्या कोई यह बता सकता है कि इन अवधि और डेल्टा का संदर्भ बिंदु क्या है? या क्या कोई डेल्टा ज़ूम स्तर (जैसे 9) को इन डेल्टा मानों में बदलना है?

एक बोनस सवाल के रूप में MKMapView पर न्यूनतम-अधिकतम ज़ूम स्तर निर्दिष्ट करने का कोई तरीका है :)

धन्यवाद

जवाबों:


134

सबसे पहले, MKMapView गूगल मैप्स की तरह ज़ूम स्तर का पूर्वनिर्धारित सेट का उपयोग / उपयोग नहीं करता है।

इसके बजाय, एक MKMapView के दृश्य क्षेत्र का उपयोग कर वर्णन किया गया है MKCoordinateRegion दो मूल्यों के होते हैं, जो:

  1. केंद्र (क्षेत्र का केंद्र बिंदु), और
  2. स्पैन (केंद्र के चारों ओर दृश्य क्षेत्र का आकार)।

केंद्र बिंदु स्पष्ट होना चाहिए (यह क्षेत्र का केंद्र बिंदु है।)

हालाँकि, स्पैन (जो कि एक MKCoordinateSpan है ) में शामिल हैं:

  1. latitudeDelta (क्षेत्र द्वारा प्रदर्शित ऊर्ध्वाधर दूरी), और
  2. देशांतरडेल्टा (क्षेत्र द्वारा प्रतिनिधित्व की जाने वाली क्षैतिज दूरी)।

एक संक्षिप्त उदाहरण। यहाँ एक खिलौना MKCoordinateRegion है:

  1. केंद्र:
    • अक्षांश: 0
    • देशांतर: ०
  2. अवधि:
    • अक्षांशधातु::
    • देशांतरदालता: ६

इस क्षेत्र को इसके न्यूनतम और अधिकतम निर्देशांक का उपयोग करके वर्णित किया जा सकता है:

  1. न्यूनतम समन्वय (निचले बाएं हाथ का बिंदु):
    • अक्षांश: -4
    • देशांतर: -3
  2. अधिकतम समन्वय (ऊपरी दाएँ हाथ के बिंदु):
    • अक्षांश: 4
    • देशांतर: 3

इसलिए, आप उचित आकार के MKCoordinateSpan का उपयोग करके केंद्र बिंदु के आसपास ज़ूम स्तर निर्दिष्ट कर सकते हैं। Google के संख्यात्मक ज़ूम स्तरों के सन्निकटन के रूप में, आप इंजीनियर को स्पैन के आकार का उल्टा कर सकते हैं जो Google किसी दिए गए ज़ूम स्तर के लिए उपयोग करता है और उसी के अनुसार स्पैन बनाता है। (Google उनके दृश्य क्षेत्रों का वर्णन उसी तरह करता है, जो MKMapView केंद्र + स्पैन के रूप में करता है, इसलिए आप Google मैप्स के इन मूल्यों को खींच सकते हैं।)

इस क्षेत्र को प्रतिबंधित करने के लिए, आप डब्ल्यू / इस प्रतिनिधि पद्धति को खेल सकते हैं:

mapView:regionWillChangeAnimated

उदाहरण के लिए क्षेत्र को आपके स्वीकृत ज़ूम स्तरों में बदलकर। (यह देखने के लिए कि टेबल व्यू किस तरह आपको किनारे पर स्क्रॉल करने देगा, लेकिन इसके बाद रबर बैंड वापस आ जाएगा।) हालाँकि, आपका माइलेज अलग-अलग हो सकता है, क्योंकि मैंने इस उद्देश्य के लिए इसका उपयोग नहीं किया है।

btw, OSK के नक्शों में OS 3.1 के निश्चित सुधार / सुधार हैं जो मुझे 3.0 में परेशानी दे रहे थे।


@ केल्विन, क्या आप अधिक विस्तार से वर्णन कर सकते हैं कि "इंजीनियर किस प्रकार स्पैन के आकार का उपयोग करता है जो Google एक दिए गए ज़ूम स्तर के लिए उपयोग करता है और एक स्पैन बनाता है"। मुझे वास्तव में इसकी आवश्यकता है
स्कोफील्ड ट्रैन

118

यदि आप MKCoordinateSpan को परिभाषित करने के बजाय स्पष्ट ज़ूम स्तरों का उपयोग करना पसंद करते हैं, तो मैंने एक श्रेणी लिखी है जो MKMapView के ज़ूम स्तर को निर्दिष्ट करने के लिए समर्थन जोड़ता है। यहां कोड पाया जा सकता है


4
ट्रॉय के ब्लॉग पोस्ट ने मुझे एक बेहतरीन समझ दी कि मैपकिट और गूगल मैप कैसे काम करते हैं। मैं इसे पढ़ने की अत्यधिक सलाह देता हूं।
एरोन


@ जॉनमोर्लिनो ने यह किया है
ज़ोल्टन मटुक

5

अवधि अक्षांश और देशांतर की डिग्री में है। MKCoordinateRegion संरचना का निर्माण करने के लिए एक विधि है जो इसके बजाय दूरी तय करती है। यह हो सकता है कि आप स्पैन निर्दिष्ट करने के लिए MKCoordinateRegionMakeWithDistance का उपयोग कर रहे हों, और फिर जब आप इसे रीजेंसीडाईचेंज में चेक करते हैं, तो आप लेट / लॉन्ग स्पैन में देख रहे हैं, जो कि यह कैसे एक MKCoordinateRegion स्ट्रक्चर में स्टोर होता है।

जहाँ तक मुझे पता है, MKMapKit के साथ काम करने पर पूर्णांक ज़ूम स्तर उपलब्ध या उपयोगी नहीं हैं। मैं व्यक्तिगत रूप से स्पैन के आंकड़ों का उपयोग करना पसंद करता हूं, इसकी अधिक लचीली।

आप अधिकतम और न्यूनतम ज़ूम निर्दिष्ट नहीं कर सकते, और मुझे इसे हैक करने का तरीका नहीं पता है। MKMapKit वास्तव में अभी बहुत कमजोर है, मैं सुविधाओं की कमी से बहुत निराश हूं।


3

लिंक querystring का निरीक्षण करके maps.google.com का उपयोग करते हुए किसी स्थान के लिए ज़ूम स्तरों की त्वरित तुलना से पता चलता है कि dx और डाई अवधि मान 2 के कारक से बढ़ जाते हैं:

 (0.005334, 0.011834) starting span
 (0.010668, 0.023668) dx: x2, dy: x2 
 (0.021335, 0.047337) dx: x2, dy: x2
 (0.042671, 0.094671) dx: x2, dy: x2
  ...

2

MKMapView पर ब्रेंट की श्रेणी अच्छी तरह से काम करती है। हालाँकि, ऐसा प्रतीत होता है कि मैपसाइजइन पिक्सल्स की गणना करते समय रेटिना स्क्रीन के साथ नए उपकरणों का समर्थन करने के लिए इसे अपडेट नहीं किया गया है।

इस पंक्ति को बदलकर इसे ठीक किया जा सकता है:

CGSize mapSizeInPixels = mapView.bounds.size;

इस लाइन के साथ:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.