2009-07-22 20 views
83

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

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

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

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

एक बोनस सवाल के रूप में वहाँ किसी भी तरह से

धन्यवाद

उत्तर

133

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

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

  1. केंद्र (क्षेत्र के केंद्र बिंदु), और
  2. अवधि (केंद्र के आसपास दृश्य क्षेत्र का आकार)।

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

हालांकि, अवधि (जो एक MKCoordinateSpan) है के होते हैं:

  1. latitudeDelta (ऊर्ध्वाधर क्षेत्र द्वारा प्रतिनिधित्व) दूरी, और
  2. longitudeDelta (क्षैतिज दूरी का प्रतिनिधित्व किया क्षेत्र के आधार पर)।

एक संक्षिप्त उदाहरण।

  1. केंद्र:
    • अक्षांश: 0
    • देशांतर: 0
  2. अवधि:
    • latitudeDelta: 8
    • longitudeDelta: यहाँ एक खिलौना MKCoordinateRegion है 6

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

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

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

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

mapView:regionWillChangeAnimated 

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

बीटीडब्ल्यू, ओएस 3.1 में मैपकिट के पहलुओं के लिए निश्चित सुधार/सुधार हैं जो मुझे 3.0 में परेशानी दे रहे थे।

+0

अच्छा वर्णित जो मुझे मूल बातें पता था। ऊपर उठाया !!! – NSPratik

+0

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

4

अवधि अक्षांश और देशांतर की डिग्री में एक MKMapView :) पर एक न्यूनतम-अधिकतम स्तर ज़ूम निर्दिष्ट करने के लिए है। MKCoordinateRegion structs बनाने के लिए एक विधि है जो इसके बजाय दूरी लेती है। ऐसा हो सकता है कि आप span निर्दिष्ट करने के लिए MKCoordinateRegionMakeWithDistance का उपयोग कर रहे हैं, और उसके बाद जब आप इसे क्षेत्रडिड चेंज में देखते हैं, तो आप lat/long span पर देख रहे हैं, इस तरह यह एक MKCoordinateRegion संरचना में संग्रहीत किया जाता है।

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

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

3

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

(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 
    ... 
117

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

+0

वास्तव में दिलचस्प पोस्ट, लिंक के लिए धन्यवाद। –

+4

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

+1

महान काम आदमी .. गहराई से विश्लेषण में .. – harshalb

2

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

यह इस लाइन बदलकर इसे ठीक किया जा सकता है:

CGSize mapSizeInPixels = mapView.bounds.size; 
इस लाइन के साथ

:

CGSize mapSizeInPixels = CGSizeMake(mapView.bounds.size.width * [UIScreen mainScreen].scale, mapView.bounds.size.height * [UIScreen mainScreen].scale); 
संबंधित मुद्दे