2010-07-07 17 views
13

यदि उपयोगकर्ता किसी MKMapView पर ज़ूम आउट करता है, तो मैं एमकेएएनोटेशन चाहता हूं जो एक-दूसरे के पास स्वचालित रूप से एक "समूह" एनोटेशन में समूहित हो। यदि उपयोगकर्ता वापस ज़ूम करता है, तो "समूह" एनोटेशन को अद्वितीय/मूल एनोटेशन में फिर से विभाजित किया जाना चाहिए।मैं ज़ूम स्तर के संबंध में स्वचालित रूप से एमकेएएनोटेशन कैसे समूहित कर सकता हूं?

सेब आईओएस 4 Photos.app

में पहले से ही इस करता है वहाँ एक आम, "पूर्वनिर्धारित" तरीका यह है है?

+0

www.BMSClusterMap.com – nurxyz

उत्तर

4

यह एक शानदार विचार है। मैं एक समान ऐप पर काम कर रहा हूं, मुझे उम्मीद है कि अगर आप अवधारणा को लागू करते हैं तो आपको कोई फर्क नहीं पड़ता :)।

अपने प्रश्न का उत्तर मेरी अपनी योग्यता के लिए उत्तर देने के लिए, नहीं, मुझे नहीं लगता कि ऐसा करने के लिए एक पूर्वनिर्धारित तरीका है।

यह करने का सबसे अच्छा तरीका है (आईओएस 4 फोटो ऐप को देखने के बाद), mapView:regionDidChangeAnimated: प्रतिनिधि विधि का उपयोग करना है। जब भी उपयोगकर्ता स्क्रॉल/ज़ूम करता है, तो इस विधि को बुलाया जाएगा।

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

जब मैं "त्वरित ज्यामिति गणित" कहता हूं, मेरा मतलब है नक्शा की अवधि के सापेक्ष दो बिंदुओं की दूरी, और पूरे मानचित्र की अवधि के प्रतिशत के रूप में अपनी सापेक्ष दूरी लेना।

जहां यह मुश्किल हो जाएगा यदि आपके पास सैकड़ों एनोटेशन हैं, क्योंकि मैं एक डबल लूप को लागू करने के लिए एक अच्छा तरीका नहीं सोच सकता हूं।

आप क्या मानते हैं?

6

इसके नक्शे पर 1500 से अधिक एनोटेशन के साथ सामान्य काम:

-(void)mapView:(MKMapView *)mapView_ regionDidChangeAnimated:(BOOL)animated 
{ 
    NSMutableSet * coordSet = [[NSMutableSet alloc] init]; 

    for(id<MKAnnotation> an in mapView_.annotations) 
    { 
     if([an isKindOfClass:[MKUserLocation class]]) 
      continue; 

     CGPoint point = [mapView_ convertCoordinate:an.coordinate toPointToView:nil]; 
     CGPoint roundedPoint; 

     roundedPoint.x = roundf(point.x/10)*10; 
     roundedPoint.y = roundf(point.y/10)*10; 

     NSValue * value = [NSValue valueWithCGPoint:roundedPoint]; 

     MKAnnotationView * av = [mapView_ viewForAnnotation:an]; 

     if([coordSet containsObject:value]) 
     { 
      av.hidden = YES; 
     } 
     else 
     { 
      [coordSet addObject:value]; 
      av.hidden = NO; 
     } 
    } 

    [coordSet release]; 
} 
+0

मैं इस समाधान चाहते समाप्त हो गया है, लेकिन यह वास्तव में सामान्य नहीं है। यह यादृच्छिक रूप से एक एनोटेशन का चयन कर रहा है और आसपास के अन्य एनोटेशन छुपा रहा है। मैं लगातार व्यवहार के साथ इसे और अधिक अनुमान लगाने की कोशिश कर रहा हूं। – Mazyod

+1

ठीक है, इस पोस्ट का सबसे अच्छा जवाब है: http://stackoverflow.com/questions/7132207/grouped-ungroup-mkannotation-depending-on-the-zoom-level-and-keep-it-fast – Mazyod

0

यह project कुछ दिलचस्प है। हालांकि, अपने कोड में बहुत सी चीजों को बदलने से पहले रिपोर्ट किए गए मुद्दों पर नज़र डालें। क्योंकि यह अभी तक आपकी जरूरतों के लिए पर्याप्त नहीं हो सकता है।

मैं personnaly को लागू करने this

संबंधित मुद्दे

 संबंधित मुद्दे