2011-08-24 16 views
7

Sto creando un'app in cui devo mostrare solo la parte dell'area in cui verrà tracciata la posizione sul mio posto, simile a quella qui sotto.Ottieni parte della visualizzazione mappa come immagine in iOS

MAp part

Cliccando questa immagine volontà prenderà ulteriormente la mia app. Ma qui è solo un'immagine statica generata a seconda della mia longitudine e latitudine.

Qualsiasi aiuto sarebbe molto apprezzato. Grazie

risposta

35

Ecco il codice di lavoro. In caso qualcuno stia ancora cercando la risposta.

NSString *staticMapUrl = [NSString stringWithFormat:@"http://maps.google.com/maps/api/staticmap?markers=color:red|%f,%f&%@&sensor=true",yourLatitude, yourLongitude,@"zoom=10&size=270x70"];  
NSURL *mapUrl = [NSURL URLWithString:[staticMapUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:mapUrl]]; 

Grazie

+0

ringrazia il suo lavoro per me e mi fa risparmiare tempo. –

+0

posso modificare l'immagine pin –

-2

per essere chiari, non v'è alcun modo per ottenere un'immagine di una località specifica tramite carta kit.

Devi usare la MKMapView, disabilitare utente panning/zoom, aggiungere annotazioni e gestire cliccare su un'annotazione di fare quello che voleva fare ..

+1

Di seguito è riportato un codice di accesso. –

3

Si può provare Google Static Maps API

Ecco il codice di esempio

NSString *urlString = @"http://maps.googleapis.com/maps/api/staticmap?center=Berkeley,CA&zoom=14&size=200x200&sensor=false"; 
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; 
UIImage *imageData = [UIImage imageWithData:data]; 
[yourImageView setImage:imageData]; 

Attraverso questo è possibile ottenere un'immagine statica in base alle coordinate. Ma ho paura di dire che la personalizzazione delle annotazioni potrebbe non essere possibile.

3

Si potrebbe anche usare MKMapSnapshotter, questo permette di prendere uno screenshot della mappa;

MKMapSnapshotOptions * snapOptions= [[MKMapSnapshotOptions alloc] init]; 
     self.options=snapOptions; 
     CLLocation * Location = [[CLLocation alloc] initWithLatitude:self.lat longitude:self.long]; 
     MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(Location.coordinate, 300, 300); 
     self.options.region = region; 
     self.options.size = self.view.frame.size; 
     self.options.scale = [[UIScreen mainScreen] scale]; 

     MKMapSnapshotter * mapSnapShot = [[MKMapSnapshotter alloc] initWithOptions:self.options]; 

     [mapSnapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) { 
      if (error) { 
       NSLog(@"[Error] %@", error); 
       return; 
      } 

      UIImage *image = snapshot.image;//map image 
      NSData *data = UIImagePNGRepresentation(image); 

     }]; 
+0

Proprietà 'opzioni' non trovato su oggetto di tipo –

+0

@ShahbazAkram è necessario dichiarare una proprietà di MKMapSnapShotOptions chiamato opzioni – DevC

0

Vorrei aggiungere alla risposta @DevC, fornendo un metodo (con blocco di completamento) che aggiunge un'annotazione nel mezzo dell'immagine. All'inizio ero interessato a vedere se potevo aggiungere un'annotazione prima che iniziasse lo snapshot, tuttavia MKMapSnapshotter fa not support this. Quindi la soluzione che mi è venuta in mente è creare un pin, disegnarlo sopra l'immagine della mappa e quindi creare un'altra immagine della mappa + pin. Qui è il mio metodo personalizzato:

-(void)create_map_screenshot:(MKCoordinateRegion)region :(map_screenshot_completion)map_block { 

    // Set the map snapshot properties. 
    MKMapSnapshotOptions *snap_options = [[MKMapSnapshotOptions alloc] init]; 
    snap_options.region = region; 
    snap_options.size = // Set the frame size e.g.: custom_view.frame.size; 
    snap_options.scale = [[UIScreen mainScreen] scale]; 

    // Initialise the map snapshot camera. 
    MKMapSnapshotter *map_camera = [[MKMapSnapshotter alloc] initWithOptions:snap_options]; 

    // Take a picture of the map. 
    [map_camera startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) { 

     // Check if the map image was created. 

     if ((error == nil) && (snapshot.image != nil)) { 

      // Create the pin image view. 
      MKAnnotationView *pin = [[MKPinAnnotationView alloc] initWithAnnotation:nil reuseIdentifier:nil]; 

      // Get the map image data. 
      UIImage *image = snapshot.image; 

      // Create a map + location pin image. 
      UIGraphicsBeginImageContextWithOptions(image.size, YES, image.scale); { 

       [image drawAtPoint:CGPointMake(0.0f, 0.0f)]; 
       CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 

       // Create the pin co-ordinate point. 
       CGPoint point = [snapshot pointForCoordinate:region.center]; 

       if (CGRectContainsPoint(rect, point)) { 

        // Draw the pin in the middle of the map. 
        point.x = (point.x + pin.centerOffset.x - (pin.bounds.size.width/2.0f)); 
        point.y = (point.y + pin.centerOffset.y - (pin.bounds.size.height/2.0f)); 
        [pin.image drawAtPoint:point]; 
       } 
      } 

      // Get the new map + pin image. 
      UIImage *map_plus_pin = UIGraphicsGetImageFromCurrentImageContext(); 

      // Return the new image data. 
      UIGraphicsEndImageContext(); 
      map_block(map_plus_pin); 
     } 

     else { 
      map_block(nil); 
     } 
    }]; 
} 

Questo metodo richiede anche un colpo di testa di completamento per essere dichiarato in questo modo:

typedef void(^map_screenshot_completion)(UIImage *); 

Spero che questo sia di qualche utilità per le persone in cerca di aggiungere annotazioni all'immagine mappa .

Problemi correlati