2009-12-09 3 views
2

J'utilise ce tutoriel pour intégrer MapKit à ma demande: http://iphonebcit.wordpress.com/iphone-map-kit-tutorial/iPhone MapKit - annotations mise à jour des coordonnées et plan

CLLocationCoordinate2D coordinate; 
coordinate.latitude = 49.2802; 
coordinate.longitude = -123.1182; 

NSUInteger count = 1; 
for(int i = 0; i < 10; i++) { 
    CGFloat latDelta = rand()*.035/RAND_MAX - .02; 
    CGFloat longDelta = rand()*.03/RAND_MAX - .015; 

    CLLocationCoordinate2D newCoord = {coordinate.latitude+latDelta, coordinate.longitude+longDelta}; 
    MapDemoAnnotation* annotation = [[MapDemoAnnotation alloc] initWithCoordinate:newCoord andID:count++]; 
    [mapView addAnnotation:annotation]; 
    [annotation release]; 
} 

et

- (MKAnnotationView *)mapView:(MKMapView *)mapViewLocal viewForAnnotation:(id <MKAnnotation>)annotation { 
MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapViewLocal dequeueReusableAnnotationViewWithIdentifier:@"Pin"]; 
if(pinView == nil) { 
    pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"]; 
    pinView.pinColor = MKPinAnnotationColorPurple; 
    pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    pinView.animatesDrop = YES; 
    pinView.canShowCallout = YES; 
} else { 
    pinView.annotation = annotation; 
} 
return pinView; 

}

Ainsi, les broches fixeront sur la carte au hasard. Dans ma demande, les coordonnées vont changer. Comment puis-je modifier les coordonnées des annotations afin qu'elles soient mises à jour sur la carte?

Quelqu'un sait-il?

Répondre

2

à 3.x iPhone SDK vous devez supprimer les annotations de broches et le mettre à nouveau. Ce n'est pas très bien si vous avez beaucoup d'annotations sur votre carte.

J'essaie de faire mieux donc j'Ony écran/renew mes annotations de broches qui sont à l'écran. Donc, si un utilisateur effectue un zoom sur New York, il n'y aura pas d'annotations à San Francisco ou autres que l'utilisateur ne peut pas voir. Donc, la performance sera beaucoup mieux.

Peut-être que ce serait possible à l'avenir. Je l'espère :-)

1

Ce didacticiel est uniquement destiné à afficher une vue de carte, rien d'autre. Vous allez avoir besoin d'un tutoriel plus grand. J'ai trouvé celui-ci utile:

http://blog.objectgraph.com/index.php/2009/04/02/iphone-sdk-30-playing-with-map-kit/

probablement ce que vous devez faire est de faire une boucle à travers toutes les annotations sur la carte, les enlever, puis boucle à travers votre réseau de données, en ajoutant les annotations à nouveau. Vous pourriez être plus intelligent à ce sujet et faire une boucle dans le tableau de données, en vérifiant s'il y a déjà une épingle avec la même latitude/longitude sur la carte, mais cela devient plus compliqué.

+0

Merci beaucoup. Mon protocole d'annotation implémenté a une variable d'instance supplémentaire appelée locationId. Cet identifiant est unique et je sais quel emplacement doit être mis à jour avec les nouvelles coordonnées. Comment pourrais-je y accéder facilement? Puis-je supprimer une annotation avec: « annotation avec LocationID = 3999 supprimer et ajouter les nouvelles coordonnées? » - mieux: "annotation avec locationId = 3999 définir de nouvelles coordonnées et mettre à jour l'emplacement si la broche". – Tim

+0

Ah, j'ai oublié. Je l'ai déjà vu ce tutoriel, mais cela ne peut me aider, parce qu'il n'y a rien d'utile dans pour résoudre mon problème. – Tim

1

Depuis que je fais des annotations pour le moment je viens de faire un test rapide. Vous obtenez un avertissement du compilateur, donc il pourrait ne pas être supporté. Mais ça fonctionne.

Faire une classe MKAnnotation personnalisée de sorte que vous pouvez définir la propriété coordonnée à inscriptibles:

@property (nonatomic, readwrite) CLLocationCoordinate2D coordinate; 

Ensuite, quel que soit le cas ou l'intervalle que vous souhaitez, modifier les coordonnées en utilisant quelque chose comme ceci:

CLLocation *loc=[[CLLocation alloc] initWithLatitude:55.0 longitude:17.0]; 
annotation.coordinate=loc.coordinate; 
[loc release];