iPhone MKMapView: jeu de carte de la région de montrer toutes les broches sur la carte
Je suis en train de définir la zone de la carte (centre et de la durée), de sorte que la carte montre tous les pin-annotations en même temps.
Je vais avoir du mal à convertir le long/lat coordonnées de NSString à double, resp. faire des calculs avec eux. Voici le code que j'utilise:
- (void)updateMemberPins{
//calculate new region to show on map
double center_long = 0.0f;
double center_lat = 0.0f;
double max_long = 0.0f;
double min_long = 0.0f;
double max_lat = 0.0f;
double min_lat = 0.0f;
for (Member *member in members) {
//find min and max values
if ([member.locLat doubleValue] > max_lat) {max_lat = [member.locLat doubleValue];}
if ([member.locLat doubleValue] < min_lat) {min_lat = [member.locLat doubleValue];}
if ([member.locLong doubleValue] > max_long) {max_long = [member.locLong doubleValue];}
if ([member.locLong doubleValue] < min_long) {min_long = [member.locLong doubleValue];}
//sum up long and lang to get average later
center_lat = center_lat + [member.locLat doubleValue];
center_long = center_long + [member.locLong doubleValue];
}
//calculate average long /lat
center_lat = center_lat / [members count];
center_long = center_long / [members count];
NSLog(@"center long: %d, center lat: %d", center_long, center_lat);
NSLog(@"max_long: %d, min_long: %d, max_lat: %d, min_lat: %d", max_long, min_long, max_lat, min_lat);
//create new region and set map
CLLocationCoordinate2D coord = {latitude: center_lat, longitude: center_long};
MKCoordinateSpan span = MKCoordinateSpanMake(abs(max_lat) + abs(min_lat), abs(max_long) + abs(min_long));
MKCoordinateRegion region = {coord, span};
[resultMapView setRegion:region];
//remove all pins from map
[resultMapView removeAnnotations:resultMapView.annotations];
//show member pins
for (id member in members) {
[resultMapView addAnnotation:(Member *) member];
}
}
Le résultat de la connexion de sortie est:
centre de long: -1946827116, centre lat: 1075651472
max_long: -6267216, min_long: 1076018553, max_lat: 0, min_lat: 0
Je pense que le problème vient (à tort) de la conversion des valeurs de NSString à double, cependant je ne peux pas trouver un moyen de le faire fonctionner... Le format de l'emplacement-les chaînes est comme "43.5686473'.
Un indice? Cheerz
et la durée de calculs? pourquoi en rajouter? Et aussi abs int renvoie pas de double-ci doit donc être fabs: MKCoordinateSpan span = MKCoordinateSpanMake(fabs(max_lat - min_lat), fab(max_long - min_long));
merci quand même, +1 il m'a sauvé un peu de temps
et aussi, pas besoin d'accumuler des lats lons-le-saunier dans une boucle. Ceux-ci peuvent être calculées à partir des valeurs min max: center_lat = (min_lat + max_lat) / 2.0; center_long = (min_long + max_long) / 2.0;
OriginalL'auteur pawi | 2011-02-18
Vous devez vous connecter pour publier un commentaire.
Pour montrer le double de la valeur dans NSLog(), vous devez utiliser
%f
, au lieu de%d
Changement
NSLog()
partie comme ceci:Également, à l'aide de la région de
MKMapView
est beaucoup plus simple que de faire votre propre. Une fois qu'elle est avec zoom, tous vous avez besoin est de déplacer dynamiquement autour de la carte avec des coordonnées différentes.Eh bien, il s'est avéré que j'étais juste confondu avec le mauvais numéros que le mauvais Journal-déclaration m'a donné. Puis j'ai eu des fous quelques erreurs dans ma cvac - et aussi de mauvaises données (0, 0 coordonnées).
Vous pouvez modifier
ratioZoomMax
à être plus petits pour montrer beaucoup plus large zone, montrant broches qui sont loin l'un de l'autre. La lecture de votre code, j'ai trouvé que vous aviez fait inutile plus à trouver le centre de valeur. Comme vous l'avez déjà compris, pour trouver le centre, vous avez juste à faire(lowestValue + highestValue)/2.0
, pas en le divisant par[members count]
Correct! Ce qui la rend encore plus simple 😉 je vais poster mon code final qui travaille maintenant comme il se doit. Merci Peter!
Vous êtes les bienvenus~ j'ai fait part de ce que j'ai appris. Content que ça vous a été utile
OriginalL'auteur petershine
La finale, code de travail pour ceux qui recherchent quelque chose de similaire:
OriginalL'auteur pawi
Ce peut être remplacé par
OriginalL'auteur zurbergram
Vous pouvez simplement utiliser ce morceau de code:
OriginalL'auteur Lapinou