2011-08-24 60 views
7

我正在創建一個應用程序,其中我必須展示我的位置將繪製的區域的部分,類似如下所示。作爲iOS中的圖像獲取地圖視圖的一部分

MAp part

單擊此按鈕圖像將我的應用程序進一步。但這裏只是根據我的經度和緯度生成的靜態圖像。

任何幫助將非常感激。 謝謝

回答

35

以下是工作代碼。請任何人仍然在尋找答案。

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]]; 

感謝

+0

感謝它爲我工作,節省了我的時間。 –

+0

我可以編輯PIN圖像 –

-2

需要明確的是,有沒有辦法讓圖像通過地圖包的特定位置。

您必須使用的MKMapView,從平移/縮放禁用用戶,添加註釋和處理點擊註釋做任何你想做的事..

+1

下面提到了一種方法代碼。 –

3

您可以嘗試Google Static Maps API

這裏的示例代碼

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]; 

通過這個,你可以得到基於你的座標的靜態圖像。 但是我不敢說定製註釋可能是不可能的。

3

您也可以使用MKMapSnapshotter,這可以讓你把地圖的屏幕截圖;

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

在類型爲 –

+0

@ShahbazAkram的物體上找不到屬性「選項」,您應該聲明MKMapSnapShotOptions的一個屬性,稱爲選項 – DevC

0

我想添加到@DevC答案,通過提供一個方法(與完成塊),在圖像的中間添加註釋。起初我有興趣看看在快照開始之前是否可以添加註釋,但MKMapSnapshotter確實是not support this。因此,我想出的解決方案是創建一個針,在地圖圖像上繪製它,然後創建地圖+針的另一個圖像。這裏是我的自定義的方法:

-(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); 
     } 
    }]; 
} 

這種方法還需要完成頭聲明,像這樣:

typedef void(^map_screenshot_completion)(UIImage *); 

我希望這是一些使用的人尋找到註解添加到地圖圖像。