2011-10-27 161 views

回答

4

在iOS 7中使用MKMap Snapshotter。從NSHipster

MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init]; 
options.region = self.mapView.region; 
options.size = self.mapView.frame.size; 
options.scale = [[UIScreen mainScreen] scale]; 

NSURL *fileURL = [NSURL fileURLWithPath:@"path/to/snapshot.png"]; 

MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:options]; 
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *error) { 
    if (error) { 
     NSLog(@"[Error] %@", error); 
     return; 
    } 

    UIImage *image = snapshot.image; 
    NSData *data = UIImagePNGRepresentation(image); 
    [data writeToURL:fileURL atomically:YES]; 
}]; 

iOS7之前,請執行下列操作之一:

  • 添加一個活地圖,並禁用互動。
  • 使用Google靜態地圖API(如下所述)。
  • 創建一個MKMapView並將其渲染爲圖像。我試過了(見前面的編輯​​),但無法加載瓷磚。我試着調用needsLayout和其他方法,但沒有奏效。

蘋果與谷歌的交易比一個免費的API更可靠,但在光明方面,它非常簡單。文檔是在http://code.google.com/apis/maps/documentation/staticmaps/

這對於實際使用的參數的最小量: http://maps.googleapis.com/maps/api/staticmap?center=40.416878,-3.703530&zoom=15&size=290x179&sensor=false

參數的總結:

  • center:這可以是一個地址,或緯度,經度配對最多6位小數(忽略6個以上)。
  • format:png8(默認),png24,git,jpg,jpg-baseline。
  • language:使用任何語言。如果請求不可用,將使用默認值。
  • maptype:以下之一:路線圖,衛星,混合,地形。
  • scale:1,2,4。使用2返回兩倍於視網膜顯示器上的像素數量。 4僅限於高級客戶。 對於1和2,非付費分辨率限制爲640x640。
  • sensor:對或錯。強制性。它指示用戶是否正在使用設備進行定位。
  • size:以像素爲單位的大小。
  • zoom:0(整個地球)至21

有一些更多的補充的多邊形,自定義標記和樣式的地圖。

NSData* data = [NSData dataWithContentsOfURL:@"http://maps.googleap..."]; 
    UIImage *img = [UIImage imageWithData:data]; 
+0

,謝謝!我把它放在一個額外的視圖(addSubview)中,並添加了#import

+0

可悲的是,當我嘗試我的答案時,地圖回來了空白的瓷磚。我想一些調試會找到訣竅,但現在我正在關注Matt的建議。 – Jano

+0

我仍在使用舊(未編輯)答案中的代碼 –