Dal momento che l'OP vuole utilizzare il rettangolo per impostare sulla mappa, l'algoritmo deve tener conto del fatto che la latitudine e le longitudini sono in un sistema di coordinate sferiche e la mappa utilizza un sistema di coordinate bidimensionale. Nessuna delle soluzioni postate finora tenerne conto e quindi finire con un torto rettangolo ma per fortuna è abbastanza facile per creare una valida soluzione utilizzando il metodo MKMapPointForCoordinate trovato in questo codice di esempio dal WWDC 2013 "Che cosa è nuovo in MapKit" video di sessione.
MKMapRect MapRectBoundingMapPoints(MKMapPoint points[], NSInteger pointCount){
double minX = INFINITY, maxX = -INFINITY, minY = INFINITY, maxY = -INFINITY;
NSInteger i;
for(i = -; i< pointCount; i++){
MKMapPoint p = points[i];
minX = MIN(p.x,minX);
minY = MIN(p.y,minY);
maxX = MAX(p.x,maxX);
maxY = MAX(p.y,maxY);
}
return MKMapRectMake(minX,minY,maxX - minX,maxY-minY);
}
CLLocationCoordinate2D london = CLLocationCoordinate2DMake(51.500756,-0.124661);
CLLocationCoordinate2D paris = CLLocationCoordinate2DMake(48.855228,2.34523);
MKMapPoint points[] = {MKMapPointForCoordinate(london),MKMapPointForCoordinate(paris)};
MKMapRect rect = MapRectBoundingMapPoints(points,2);
rect = MKMapRectInset(rect,
-rect.size.width * 0.05,
-rect.size.height * 0.05);
MKCoordinateRegion coordinateRegion = MKCoordinateRegionForMapRect(rect);
Si può facilmente cambiare il metodo di lavorare su un NSArray delle annotazioni, se si preferisce. Per esempio. qui è il metodo che sto usando nella mia domanda:
- (MKCoordinateRegion)regionForAnnotations:(NSArray*)anns{
MKCoordinateRegion r;
if ([anns count] == 0){
return r;
}
double minX = INFINITY, maxX = -INFINITY, minY = INFINITY, maxY = -INFINITY;
for(id<MKAnnotation> a in anns){
MKMapPoint p = MKMapPointForCoordinate(a.coordinate);
minX = MIN(p.x,minX);
minY = MIN(p.y,minY);
maxX = MAX(p.x,maxX);
maxY = MAX(p.y,maxY);
}
MKMapRect rect = MKMapRectMake(minX,minY,maxX - minX,maxY-minY);
rect = MKMapRectInset(rect,
-rect.size.width * 0.05,
-rect.size.height * 0.05);
return MKCoordinateRegionForMapRect(rect);
}
Sono sicuro che questo non è più di grande preoccupazione per voi (2 anni più tardi), ma si deve sapere che è possibile - almeno in teoria - per tutte le risposte elencate fallire in modo spettacolare. Considera uno o più poligoni sul Pacifico con una X in basso a sinistra di +170 e una X in alto a destra di -170. Ti scioglierà il cervello cercando di adattarsi alla tua scatola di delimitazione. Questo articolo: http://www.stonybrook.edu/libmap/coordinates/seriesa/no2/a2.htm (sezione Global Gotchas) implica che il problema non può e non dovrebbe essere risolto. – tomfumb