Positionierung MKMapView auf mehrere Anmerkungen zeigen auf einmal

stimmen
89

Ich habe einige Anmerkungen habe ich zu meinem MKMapView hinzufügen möchten (es könnte 0-n Elemente, wobei n im allgemeinen etwa 5). Ich kann die Anmerkungen hinzufügen in Ordnung, aber ich will die Karte, um die Größe alle Anmerkungen Bildschirm auf einmal zu passen, und ich bin nicht sicher, wie dies zu tun.

Ich habe mir auf , -regionThatFits:aber ich bin nicht ganz sicher , was damit zu tun. Ich werde einige Code schreiben zu zeigen , was ich bisher bekommen habe. Ich denke , dies ist eine allgemein einfache Aufgabe sein sollte , aber ich bin so weit ein bisschen überwältigt MapKit fühlen.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

location = newLocation.coordinate;
//One location is obtained.. just zoom to that location

MKCoordinateRegion region;
region.center = location;

//Set Zoom level using Span
MKCoordinateSpan span;
span.latitudeDelta = 0.015;
span.longitudeDelta = 0.015;
region.span = span;
// Set the region here... but I want this to be a dynamic size
// Obviously this should be set after I've added my annotations
[mapView setRegion:region animated:YES];

// Test data, using these as annotations for now
NSArray *arr = [NSArray arrayWithObjects:@one, @two, @three, @four, nil];
float ex = 0.01;
for (NSString *s in arr) {
    JBAnnotation *placemark = [[JBAnnotation alloc] initWithLat:(location.latitude + ex) lon:location.longitude];
    [mapView addAnnotation:placemark];
    ex = ex + 0.005;
}
    // What do I do here?
    [mapView setRegion:[mapView regionThatFits:region] animated:YES];
}

Beachten Sie , das alles geschieht , wie ich eine Location Update erhalten ... Ich weiß nicht , ob das ein geeigneter Ort , dies zu tun. Wenn nicht, wo wäre ein besserer Ort sein? -viewDidLoad?

Danke im Voraus.

Veröffentlicht am 26/08/2009 um 18:35
quelle vom benutzer
In anderen Sprachen...                            


23 antworten

stimmen
133

Der Link von Jim geschrieben ist jetzt tot, aber ich war in der Lage , den Code zu finden (was ich hatte irgendwo vorgemerkt). Hoffe das hilft.

- (void)zoomToFitMapAnnotations:(MKMapView *)mapView { 
    if ([mapView.annotations count] == 0) return; 

    CLLocationCoordinate2D topLeftCoord; 
    topLeftCoord.latitude = -90; 
    topLeftCoord.longitude = 180; 

    CLLocationCoordinate2D bottomRightCoord; 
    bottomRightCoord.latitude = 90; 
    bottomRightCoord.longitude = -180; 

    for(id<MKAnnotation> annotation in mapView.annotations) { 
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude); 
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude); 
        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude); 
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude); 
    } 

    MKCoordinateRegion region; 
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5; 
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;      

    // Add a little extra space on the sides
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1; 

    region = [mapView regionThatFits:region]; 
    [mapView setRegion:region animated:YES]; 
}
Beantwortet am 26/08/2011 um 07:22
quelle vom benutzer

stimmen
132

Warum so kompliziert?

MKCoordinateRegion coordinateRegionForCoordinates(CLLocationCoordinate2D *coords, NSUInteger coordCount) {
    MKMapRect r = MKMapRectNull;
    for (NSUInteger i=0; i < coordCount; ++i) {
        MKMapPoint p = MKMapPointForCoordinate(coords[i]);
        r = MKMapRectUnion(r, MKMapRectMake(p.x, p.y, 0, 0));
    }
    return MKCoordinateRegionForMapRect(r);
}
Beantwortet am 08/08/2012 um 11:41
quelle vom benutzer

stimmen
43

Ich habe etwas similiar dazu getan, um zu verkleinern (oder in) zu einem Bereich, der einen Punkt Annotation und die aktuelle Position enthalten. Man könnte dies durch Schleife durch Ihre Anmerkungen erweitern.

Die grundlegenden Schritte sind:

  • Berechnen Sie die min lat / long
  • Berechnen Sie die max lat / long
  • Erstellen CLLocation Objekte für diese beiden Punkte
  • Berechnen Abstand zwischen den Punkten
  • Erstellen Region unter Verwendung Mittelpunkt zwischen den Punkten und dem Abstand zum Grad umgewandelt
  • Pass Region in MapView anzupassen
  • Verwenden eingestellten Region MapView Region einzustellen
    -(IBAction)zoomOut:(id)sender {

        CLLocationCoordinate2D southWest = _newLocation.coordinate;
        CLLocationCoordinate2D northEast = southWest;

        southWest.latitude = MIN(southWest.latitude, _annotation.coordinate.latitude);
        southWest.longitude = MIN(southWest.longitude, _annotation.coordinate.longitude);

        northEast.latitude = MAX(northEast.latitude, _annotation.coordinate.latitude);
        northEast.longitude = MAX(northEast.longitude, _annotation.coordinate.longitude);

        CLLocation *locSouthWest = [[CLLocation alloc] initWithLatitude:southWest.latitude longitude:southWest.longitude];
        CLLocation *locNorthEast = [[CLLocation alloc] initWithLatitude:northEast.latitude longitude:northEast.longitude];

        // This is a diag distance (if you wanted tighter you could do NE-NW or NE-SE)
        CLLocationDistance meters = [locSouthWest getDistanceFrom:locNorthEast];

        MKCoordinateRegion region;
        region.center.latitude = (southWest.latitude + northEast.latitude) / 2.0;
        region.center.longitude = (southWest.longitude + northEast.longitude) / 2.0;
        region.span.latitudeDelta = meters / 111319.5;
        region.span.longitudeDelta = 0.0;

        _savedRegion = [_mapView regionThatFits:region];
        [_mapView setRegion:_savedRegion animated:YES];

        [locSouthWest release];
        [locNorthEast release];
    }
Beantwortet am 27/08/2009 um 20:56
quelle vom benutzer

stimmen
36

Ab iOS7 können Sie verwenden showAnnotations: animiert:

[mapView showAnnotations:annotations animated:YES];
Beantwortet am 22/03/2014 um 02:27
quelle vom benutzer

stimmen
21

Ich habe eine andere Antwort. Ich wollte den Zoom-to-fit - Algorithmus selbst tun zu implementieren, aber ich dachte , dass Apple muss eine Möglichkeit haben , zu tun , was wir ohne so viel Arbeit wollten. Mit Hilfe der API doco zeigte schnell , dass ich MKPolygon nutzen könnten , um zu tun , was nötig war:

/* this simply adds a single pin and zooms in on it nicely */
- (void) zoomToAnnotation:(MapAnnotation*)annotation {
    MKCoordinateSpan span = {0.027, 0.027};
    MKCoordinateRegion region = {[annotation coordinate], span};
    [mapView setRegion:region animated:YES];
}

/* This returns a rectangle bounding all of the pins within the supplied
   array */
- (MKMapRect) getMapRectUsingAnnotations:(NSArray*)theAnnotations {
    MKMapPoint points`theAnnotations count`;

    for (int i = 0; i < [theAnnotations count]; i++) {
        MapAnnotation *annotation = [theAnnotations objectAtIndex:i];
        points[i] = MKMapPointForCoordinate(annotation.coordinate);
    }

    MKPolygon *poly = [MKPolygon polygonWithPoints:points count:[theAnnotations count]];

    return [poly boundingMapRect];
}

/* this adds the provided annotation to the mapview object, zooming 
   as appropriate */
- (void) addMapAnnotationToMapView:(MapAnnotation*)annotation {
    if ([annotations count] == 1) {
        // If there is only one annotation then zoom into it.
        [self zoomToAnnotation:annotation];
    } else {
        // If there are several, then the default behaviour is to show all of them
        //
        MKCoordinateRegion region = MKCoordinateRegionForMapRect([self getMapRectUsingAnnotations:annotations]);

        if (region.span.latitudeDelta < 0.027) {
            region.span.latitudeDelta = 0.027;
        }

        if (region.span.longitudeDelta < 0.027) {
            region.span.longitudeDelta = 0.027;
        }
        [mapView setRegion:region];
    }

    [mapView addAnnotation:annotation];
    [mapView selectAnnotation:annotation animated:YES];
}

Hoffe das hilft.

Beantwortet am 04/10/2011 um 02:50
quelle vom benutzer

stimmen
14

Sie können es auch auf diese Weise tun ..

// Position the map so that all overlays and annotations are visible on screen.
MKMapRect regionToDisplay = [self mapRectForAnnotations:annotationsToDisplay];
if (!MKMapRectIsNull(regionToDisplay)) myMapView.visibleMapRect = regionToDisplay;

- (MKMapRect) mapRectForAnnotations:(NSArray*)annotationsArray
{
    MKMapRect mapRect = MKMapRectNull;

    //annotations is an array with all the annotations I want to display on the map
    for (id<MKAnnotation> annotation in annotations) { 

        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);

        if (MKMapRectIsNull(mapRect)) 
        {
            mapRect = pointRect;
        } else 
        {
            mapRect = MKMapRectUnion(mapRect, pointRect);
        }
    }

     return mapRect;
}
Beantwortet am 12/09/2011 um 05:59
quelle vom benutzer

stimmen
12

Basierend auf den Informationen und Anregungen von allen kam ich mit der Follow-up. Vielen Dank für alle in dieser Diskussion für einen Beitrag :) Diese im View-Controller gehen würde, der die mapView enthält.

- (void)zoomToFitMapAnnotations { 

if ([self.mapView.annotations count] == 0) return; 

int i = 0;
MKMapPoint points`self`.`mapView`.`annotations count`;

//build array of annotation points
for (id<MKAnnotation> annotation in [self.mapView annotations])
        points[i++] = MKMapPointForCoordinate(annotation.coordinate);

MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i];

[self.mapView setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect]) animated:YES]; 
}
Beantwortet am 20/10/2011 um 21:00
quelle vom benutzer

stimmen
5

In meinem Fall fange ich mit CLLocation Objekten und Anmerkungen für jeden von ihnen zu schaffen.
Ich brauche nur zwei Anmerkungen zu platzieren, so dass ich einen einfachen Ansatz , um die Anordnung von Punkten zu bauen, aber es leicht erweitert werden könnte einen Array mit einer beliebigen Länge einer Reihe von CLLocations gegeben zu bauen.

Hier ist meine Implementierung (erfordert keine MKMapPoints erstellen):

//start with a couple of locations
CLLocation *storeLocation = store.address.location.clLocation;
CLLocation *userLocation = [LBLocationController sharedController].currentLocation;

//build an array of points however you want
CLLocationCoordinate2D points[2] = {storeLocation.coordinate, userLocation.coordinate};

//the magic part
MKPolygon *poly = [MKPolygon polygonWithCoordinates:points count:2];
[self.mapView setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect])];
Beantwortet am 25/01/2012 um 21:11
quelle vom benutzer

stimmen
4

Mit Swift, ein Polygon, und einige zusätzliche Polsterung ich folgendes verwendet:

func zoomToFit() {
    var allLocations:[CLLocationCoordinate2D] = [
        CLLocationCoordinate2D(latitude: 32.768805, longitude: -117.167119),
        CLLocationCoordinate2D(latitude: 32.770480, longitude: -117.148385),
        CLLocationCoordinate2D(latitude: 32.869675, longitude: -117.212929)
    ]

    var poly:MKPolygon = MKPolygon(coordinates: &allLocations, count: allLocations.count)

    self.mapView.setVisibleMapRect(poly.boundingMapRect, edgePadding: UIEdgeInsetsMake(40.0, 40.0, 40.0, 40.0), animated: false)
}

Beantwortet am 06/04/2015 um 15:46
quelle vom benutzer

stimmen
3

Es gibt eine neue Methode in ‚MKMapView‘ ab iOS 7, die Sie verwenden können,

Erklärung

SCHNELL

func showAnnotations(_ annotations: [AnyObject]!,
            animated animated: Bool)

ZIEL C

- (void)showAnnotations:(NSArray *)annotations
               animated:(BOOL)animated

Parameter

Anmerkungen Die Anmerkungen, die Sie in der Karte sichtbar sein sollen. animiert JA, wenn Sie die Karte Region ändern wollen animiert werden, oder NO, wenn Sie die Karte wollen, ohne Animationen sofort die neue Region angezeigt werden soll.

Diskussion

Das Aufrufen dieser Methode aktualisiert den Wert in der Eigenschaft Region und möglicherweise andere Eigenschaften des neuen map Region widerzuspiegeln.

Beantwortet am 26/02/2015 um 04:39
quelle vom benutzer

stimmen
3

Hier ist der SWIFT-Äquivalent (Bestätigte Arbeiten in: Xcode6.1, SDK 8.2) für Mustafa-Antworten:

    func zoomToFitMapAnnotations() {
    if self.annotations.count == 0 {return}

    var topLeftCoordinate = CLLocationCoordinate2D(latitude: -90, longitude: 180)
    var bottomRightCoordinate = CLLocationCoordinate2D(latitude: 90, longitude: -180)

    var i = 1
    for object in self.annotations {
        if let annotation = object as? MKAnnotation {
            topLeftCoordinate.longitude = fmin(topLeftCoordinate.longitude, annotation.coordinate.longitude)
            topLeftCoordinate.latitude = fmin(topLeftCoordinate.latitude, annotation.coordinate.latitude)
            bottomRightCoordinate.longitude = fmin(bottomRightCoordinate.longitude, annotation.coordinate.longitude)
            bottomRightCoordinate.latitude = fmin(bottomRightCoordinate.latitude, annotation.coordinate.latitude)
        }
    }

    var center = CLLocationCoordinate2D(latitude: topLeftCoordinate.latitude - (topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 0.5, longitude: topLeftCoordinate.longitude - (topLeftCoordinate.longitude - bottomRightCoordinate.longitude) * 0.5)

    print("\ncenter:\(center.latitude) \(center.longitude)")
    // Add a little extra space on the sides
    var span = MKCoordinateSpanMake(fabs(topLeftCoordinate.latitude - bottomRightCoordinate.latitude) * 1.01, fabs(bottomRightCoordinate.longitude - topLeftCoordinate.longitude) * 1.01)
    print("\nspan:\(span.latitudeDelta) \(span.longitudeDelta)")

    var region = MKCoordinateRegion(center: center, span: span)


    region = self.regionThatFits(region)

    self.setRegion(region, animated: true)

}
Beantwortet am 23/01/2015 um 11:19
quelle vom benutzer

stimmen
2

Aufgrund der sehr guten Antwort von me2(jetzt in Swift)

func coordinateRegionForCoordinates(coords: [CLLocationCoordinate2D]) -> MKCoordinateRegion {
    var rect: MKMapRect = MKMapRectNull
    for coord in coords {
        let point: MKMapPoint = MKMapPointForCoordinate(coord)
        rect = MKMapRectUnion(rect, MKMapRectMake(point.x, point.y, 0, 0))
    }
    return MKCoordinateRegionForMapRect(rect)
}
Beantwortet am 18/05/2015 um 14:05
quelle vom benutzer

stimmen
2
- (void)zoomToFitMapAnnotations {

if ([self.mapview.annotations count] == 0) return;

int i = 0;
MKMapPoint points`self`.`mapview`.`annotations count`;

//build array of annotation points
for (id<MKAnnotation> annotation in [self.mapview annotations])
    points[i++] = MKMapPointForCoordinate(annotation.coordinate);

MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i];

[self.mapview setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect]) animated:YES];
}
Beantwortet am 03/12/2014 um 09:56
quelle vom benutzer

stimmen
2

Eine mögliche Lösung könnte den Abstand zwischen der aktuellen Position wird gemessen und alle Anmerkungen und mit Hilfe der Methode MKCoordinateRegionMakeWithDistance auf eine Region zu bilden, die einen etwas größeren Abstand aufweist als die am weitesten Annotation.

Dies würde natürlich bekommen langsamer, desto mehr Anmerkungen, die Sie allerdings hinzugefügt.

Beantwortet am 26/08/2009 um 21:13
quelle vom benutzer

stimmen
1

Ich weiß, das ist eine alte Frage, aber, wenn Sie alle Anmerkungen bereits auf der Karte verwenden, angezeigt werden sollen:

 mapView.showAnnotations(mapView.annotations, animated: true)
Beantwortet am 23/12/2016 um 20:35
quelle vom benutzer

stimmen
1

Es wurde ein wenig, wenn Klausel 1 orts- zu handhaben zu mustufa der cound Code-Snippet hinzuzufügen. pkclSoft der zoomToAnnotation Funktion für das verwendet:

if ([mapView.annotations count] == 1){
    MKCoordinateSpan span = {0.027, 0.027};
    region.span = span;
    CLLocationCoordinate2D singleCoordinate = [[mapView.annotations objectAtIndex:0] coordinate];
    region.center.latitude = singleCoordinate.latitude;
    region.center.longitude = singleCoordinate.longitude;
}
else
{
    // mustufa's code
}
Beantwortet am 31/01/2012 um 05:31
quelle vom benutzer

stimmen
0

Eine schnelle 5-Version:

   func regionFor(coordinates coords: [CLLocationCoordinate2D]) -> MKCoordinateRegion {
        var r = MKMapRect.null

        for i in 0 ..< coords.count {
            let p = MKMapPoint(coords[i])

            r = r.union(MKMapRect(x: p.x, y: p.y, width: 0, height: 0))
        }

        return MKCoordinateRegion(r)
    }
Beantwortet am 28/08/2019 um 12:40
quelle vom benutzer

stimmen
0

Betrachten Sie diese Erweiterung:

extension MKCoordinateRegion {
    init(locations: [CLLocationCoordinate2D], marginMultiplier: Double = 1.1) {
        let mapRect = locations.reduce(MKMapRect(), {
            let point = MKMapPointForCoordinate($1)
            let rect = MKMapRect(origin: point, size: MKMapSize(width: 0.0, height: 0.0))
            return MKMapRectUnion($0, rect)
        })

        var coordinateRegion = MKCoordinateRegionForMapRect(mapRect)
        coordinateRegion.span.latitudeDelta *= marginMultiplier
        coordinateRegion.span.longitudeDelta *= marginMultiplier
        self = coordinateRegion
    }
}
Beantwortet am 30/09/2017 um 13:21
quelle vom benutzer

stimmen
0

Dieser Code funktioniert für mich, es alle Pins mit aktueller Position zeigt, hofft das hilft dir,

func setCenterForMap() {
    var mapRect: MKMapRect = MKMapRectNull
    for loc in mapView.annotations {
        let point: MKMapPoint = MKMapPointForCoordinate(loc.coordinate)
        print( "location is : \(loc.coordinate)");
        mapRect = MKMapRectUnion(mapRect, MKMapRectMake(point.x,point.y,0,0))
    }
    if (locationManager.location != nil) {
        let point: MKMapPoint = MKMapPointForCoordinate(locationManager.location!.coordinate)
        print( "Cur location is : \(locationManager.location!.coordinate)");
        mapRect = MKMapRectUnion(mapRect, MKMapRectMake(point.x,point.y,0,0))
    }

    mapView.setVisibleMapRect(mapRect, edgePadding: UIEdgeInsetsMake(40.0, 40.0, 40.0, 40.0), animated: true)

}
Beantwortet am 08/04/2016 um 08:35
quelle vom benutzer

stimmen
0

Da ich nicht auf eine Antwort kommentieren kann, würde Ich mag mein bisschen Bequemlichkeit hinzuzufügen in @ me2 ‚s Antwort (da ich dachte, es die eleganteste Ansatz war hier gefunden).

Für mein persönliches Projekt habe ich einfach eine Kategorie auf der MKMapView Klasse der „sichtbaren Bereich“ Funktionalität für eine ver gemeinsamen Betrieb zu kapseln: Einstellung der Lage sein, alle zu sehen, die aktuell geladenen Anmerkungen auf der MKMapView Instanz. das Ergebnis war:

.h-Datei

#import <MapKit/MapKit.h>

@interface MKMapView (Extensions)

-(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated;
-(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated;


@end

.m-Datei

#import "MKMapView+Extensions.h"

@implementation MKMapView (Extensions)

/**
 *  Changes the currently visible portion of the map to a region that best fits all the currently loadded annotations on the map, and it optionally animates the change.
 *
 *  @param animated is the change should be perfomed with an animation.
 */
-(void)ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:(BOOL)animated
{
    MKMapView * mapView = self;

    NSArray * annotations = mapView.annotations;

    [self ij_setVisibleRectToFitAnnotations:annotations animated:animated];

}


/**
 *  Changes the currently visible portion of the map to a region that best fits the provided annotations array, and it optionally animates the change.
    All elements from the array must conform to the <MKAnnotation> protocol in order to fetch the coordinates to compute the visible region of the map.
 *
 *  @param annotations an array of elements conforming to the <MKAnnotation> protocol, holding the locations for which the visible portion of the map will be set.
 *  @param animated    wether or not the change should be perfomed with an animation.
 */
-(void)ij_setVisibleRectToFitAnnotations:(NSArray *)annotations animated:(BOOL)animated
{
    MKMapView * mapView = self;

    MKMapRect r = MKMapRectNull;
    for (id<MKAnnotation> a in annotations) {
        ZAssert([a conformsToProtocol:@protocol(MKAnnotation)], @"ERROR: All elements of the array MUST conform to the MKAnnotation protocol. Element (%@) did not fulfill this requirement", a);
        MKMapPoint p = MKMapPointForCoordinate(a.coordinate);
        //MKMapRectUnion performs the union between 2 rects, returning a bigger rect containing both (or just one if the other is null). here we do it for rects without a size (points)
        r = MKMapRectUnion(r, MKMapRectMake(p.x, p.y, 0, 0));
    }

    [mapView setVisibleMapRect:r animated:animated];

}

@end

Wie Sie sehen können, habe ich zwei Methoden hinzugefügt, so weit: man den sichtbaren Bereich der Karte auf einen für die Einstellung, die alle aktuell geladenen Anmerkungen auf der MKMapView Instanz passt, und ein anderes Verfahren es einem Array von Objekten zu setzen. So setzen sichtbaren Bereich des mapView der Code würde dann so einfach sein wie:

   //the mapView instance  
    [self.mapView ij_setVisibleRectToFitAllLoadedAnnotationsAnimated:animated]; 

Ich hoffe, es hilft =)

Beantwortet am 10/06/2014 um 14:16
quelle vom benutzer

stimmen
0

Basierend auf me2 Antwort schrieb ich eine Kategorie für MKMapView einige Ränder hinzufügen und Benutzerstandort Anmerkung überspringen:

@interface MKMapView (ZoomToFitAnnotations)
- (void)zoomToFitAnnotations:(BOOL)animated;
@end

@implementation MKMapView (ZoomToFitAnnotations)
- (void)zoomToFitAnnotations:(BOOL)animated {
    if (self.annotations.count == 0)
        return;

    MKMapRect rect = MKMapRectNull;
    for (id<MKAnnotation> annotation in self.annotations) {
        if ([annotation isKindOfClass:[MKUserLocation class]] == false) {
            MKMapPoint point = MKMapPointForCoordinate(annotation.coordinate);
            rect = MKMapRectUnion(rect, MKMapRectMake(point.x, point.y, 0, 0));
        }
    }

    MKCoordinateRegion region = MKCoordinateRegionForMapRect(rect);
    region.span.longitudeDelta *= 2; // Margin
    region.span.latitudeDelta *= 2; // Margin
    [self setRegion:region animated:animated];
}
@end
Beantwortet am 15/04/2014 um 06:39
quelle vom benutzer

stimmen
0
CLLocationCoordinate2D min = CLLocationCoordinate2DMake(99999.0, 99999.0);
CLLocationCoordinate2D max = CLLocationCoordinate2DMake(-99999.0, -99999.0);

// find max/min....

// zoom to cover area
// TODO: Maybe better using a MKPolygon which can calculate its own fitting region.
CLLocationCoordinate2D center = CLLocationCoordinate2DMake((max.latitude + min.latitude) / 2.0, (max.longitude + min.longitude) / 2.0);
MKCoordinateSpan span = MKCoordinateSpanMake(max.latitude - min.latitude, max.longitude - min.longitude);
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);

[_mapView setRegion:[_mapView regionThatFits:region] animated:YES];
Beantwortet am 27/07/2012 um 13:08
quelle vom benutzer

stimmen
0

Ich hoffe, dass dies zumindest relevant ist, das ist, was ich zusammen für Mono (basierend aus der pkclSoft Antwort):

void ZoomMap (MKMapView map)
{
    var annotations = map.Annotations;

    if (annotations == null || annotations.Length == 0) 
        return;

    var points = annotations.OfType<MapAnnotation> ()
                            .Select (s => MKMapPoint.FromCoordinate (s.Coordinate))
                            .ToArray ();            

    map.SetVisibleMapRect(MKPolygon.FromPoints (points).BoundingMapRect, true); 
}
Beantwortet am 06/03/2012 um 07:13
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more