2010-07-07 6 views
13

Wenn der Benutzer auf eine MKMapView zoomt, möchte ich, dass MKAnnotations, die nahe beieinander liegen, automatisch in einer "Gruppen" -Anmerkung gruppiert werden. Wenn der Benutzer zurück zoomt, sollte die Annotation "group" erneut in die eindeutigen/ursprünglichen Annotationen aufgeteilt werden.Wie kann ich MKAnnotations automatisch bezüglich der Zoomstufe gruppieren?

Apfel tut dies bereits in den iOS 4 Photos.app

gibt es eine gemeinsame „vordefinierten“ Art und Weise, dies zu tun?

+0

www.BMSClusterMap.com – nurxyz

Antwort

4

Das ist eine brillante Idee. Ich arbeite an einer ähnlichen App, ich hoffe, es macht Ihnen nichts aus, wenn ich das Konzept auch umsetzen werde :).

Um Ihre Frage zu beantworten die besten meiner eigenen Fähigkeit, nein, ich glaube nicht, es gibt eine vordefinierte Möglichkeit, dies zu tun.

Der beste Weg, um es (nach dem Betrachten der iOS4 Fotos App) zu tun, ist die mapView:regionDidChangeAnimated: Delegate-Methode zu verwenden. Jedes Mal, wenn der Benutzer scrollt/zoomt, wird diese Methode aufgerufen.

Innerhalb dieser Methode könnten Sie eine schnelle Geometrie-Mathe haben, um zu bestimmen, ob Ihre Punkte "nah genug" sind, um das Zusammenführen in Betracht zu ziehen. Sobald sie "zusammengeführt" sind, entfernen Sie eine oder beide Annotationen und fügen eine weitere Annotation an derselben Stelle ein, die eine Referenz auf beide ist (Sie könnten sehr einfach eine AnnotationCluster-Klasse erstellen, die MKAnnotation entsprechen könnte, aber auch eine NSArray von Annotationen und auch Methoden zum "Ausbrechen" oder "Absorbieren" anderer Annotationen und/oder AnnotationCluster-Instanzen usw.).

Wenn ich "schnelle Geometrie Mathe" sage, meine ich die Entfernung der zwei Punkte relativ zur Spannweite der Karte, und ihre relative Entfernung als Prozentsatz der Spannweite der ganzen Karte.

Wo würde es schwierig werden, wenn Sie Hunderte von Anmerkungen hatten, wie ich nicht denken kann über eine gute Möglichkeit, das ohne eine doppelte Schleife zu implementieren.

Was meinen Sie?

6

Seine normale Arbeiten mit mehr als 1500 Anmerkungen auf der Karte:

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

ich diese Lösung gefällt, aber es ist nicht wirklich normal. Es wählt zufällig eine Anmerkung aus und versteckt die anderen Anmerkungen in der Nähe. Ich versuche, es mit konsistentem Verhalten berechenbarer zu machen. – Mazyod

+1

OK, dieser Beitrag hat die beste Antwort: http://StackOverflow.com/Questions/7132207/grouped-ungroup-mkannotation-depending-on-the-Zoom-Level-and-keep-it-fast – Mazyod

0

Diese project tut etwas interessant. Sehen Sie sich jedoch die gemeldeten Probleme an, bevor Sie zu viele Änderungen an Ihrem Code vornehmen. Weil es für Ihre Bedürfnisse noch nicht gut genug sein könnte.

Ich landete personnaly up Umsetzung this