2013-06-19 117 views

回答

9

離線地圖需要iOS的一些經驗,因爲沒有太多的項目和例子。 但是,您有一個名爲Route-Me的項目,可以爲您提供一個起點。 我們用它來開發Metro Valencia Offline,它成功地將它發送到App Store。 我寫了一個small tutorial關於如何將Route-Me添加到您的項目中。

基本上你可以使用任何地圖飼料,你可能想要的(OpenStreetMaps是其中之一,也是我們使用的)。什麼你需要做的是:

  1. 下載的地圖圖塊(https://metacpan.org/pod/Geo::OSM::Tiles
  2. 把它們放入一個SQLite數據庫(http://shikii.net/blog/downloads/map2sqlite-bin.zip
  3. 修改路線,我要的瓷磚從數據庫反饋而不是從開放街道地圖網站
+0

你能解釋我這個例外嗎? 「SimpleMap [1020:907] ***因未捕獲異常'NSInternalInconsistencyException'而終止應用程序,原因是:如果[內容minZoom]小於[tileSource minZoom]''''' – CrazyDev

+3

',則圖形和內存過度納稅實際上是我從未完全理解的Route-Me拋出的NSAssert。我評論說,從來沒有任何問題。 NSAssert可以在'setTileSource:'PS方法內的'RMMapContents.m'中找到。 'setMinZoom:'還有另外一個:'但是我保留原來的最後一個。 –

+0

哇太棒了,現在它的工作!謝謝...如果我有其他問題,我可以在這裏寫信嗎? – CrazyDev

1

還有Nutiteq Maps SDK:http://developer.nutiteq.com,適用於iOS和Android的離線地圖,支持Xamarin IDE(C#)和本地語言(Java,ObjectiveC,Swift)。它不是那麼多的路由和導航(如Skobbler),而是更多地集中於具有交互式圖層(地圖頂部的點,線和多邊形)的複雜地圖。一個好處是你可以使用你自己的底圖資源(內部,第三方),而不僅僅是OpenStreetMap SDK本身提供的。

聲明:我是開發者。

0

我使用MapKit的默認地圖和MKTileOverlay的一個子類來保存已下載的圖塊並返回已經緩存的圖塊而不下載它們。

1)從MapKit默認地圖更改源和使用MKTileOverlay的子類(用於 「開放街道地圖」 在這裏)

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    static NSString * const template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png"; 

    VHTileOverlay *overlay = [[VHTileOverlay alloc] initWithURLTemplate:template]; 
    overlay.canReplaceMapContent = YES; 
    [self.mapView addOverlay:overlay level:MKOverlayLevelAboveLabels]; 
} 

2)從MKTileOverlay

@interface VHTileOverlay() // MKTileOverlay subclass 
@property (nonatomic, strong) NSOperationQueue *operationQueue; 
@end 

@implementation VHTileOverlay 

-(instancetype)initWithURLTemplate:(NSString *)URLTemplate{ 

    self = [super initWithURLTemplate:URLTemplate]; 
    if(self){ 
     self.directoryPath = cachePath; 
     self.operationQueue = [NSOperationQueue new]; 
    } 
    return self; 
} 


-(NSURL *)URLForTilePath:(MKTileOverlayPath)path { 
    return [NSURL URLWithString:[NSString stringWithFormat:@"http://tile.openstreetmap.org/%ld/%ld/%ld.png", (long)path.z, (long)path.x, (long)path.y]]; 
} 

-(void)loadTileAtPath:(MKTileOverlayPath)path 
       result:(void (^)(NSData *data, NSError *error))result 
{ 
    if (!result) { 
     return; 
    } 

    NSString *pathToFilfe = [[self URLForTilePath:path] absoluteString]; 
    pathToFilfe = [pathToFilfe stringByReplacingOccurrencesOfString:@"/" withString:@"|"]; 
    // @"/" - those are not approriate for file's url... 

    NSData *cachedData = [self loadFileWithName:pathToFilfe]; 
    if (cachedData) { 
     result(cachedData, nil); 
    } else { 
     NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]]; 
     __block VHTileOverlay *weakSelf = self; 
     [NSURLConnection sendAsynchronousRequest:request 
              queue:self.operationQueue 
           completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
            NSLog(@"%@",[weakSelf URLForTilePath:path]); 

            if(data){ 
             [self saveFileWithName:[[weakSelf URLForTilePath:path] absoluteString] imageData:data]; 
            } 
            result(data, connectionError); 
     }]; 
    } 
} 

-(NSString *)pathToImageWithName:(NSString *)fileName 
{ 
    NSString *imageFilePath = [[OfflineMapCache sharedObject].cachePath stringByAppendingPathComponent:fileName]; 
    return imageFilePath; 
} 

- (NSData *)loadFileWithName:(NSString *)fileName 
{ 
    NSString *imagePath = [self pathToImageWithName:fileName]; 
    NSData *data = [[NSData alloc] initWithContentsOfFile:imagePath]; 
    return data; 
} 

- (void)saveFileWithName:(NSString *)fileName imageData:(NSData *)imageData 
{ 
// fileName = [fileName stringByReplacingOccurrencesOfString:@"/" withString:@"|"]; 
// NSString *imagePath = [self pathToImageWithName:fileName]; 
// [imageData writeToFile:imagePath atomically:YES]; 
} 

取消註釋子「 saveFileWithName「並在模擬器上運行它。你也可以添加NSLog(fileName)來知道從哪裏獲取所需的所有圖塊。 (模擬器緩存中的用戶/你/庫/開發商/ CoreSimulator /設備/ ... 和圖書館是一個隱藏目錄)

後,您緩存,你只需要把你的應用程序的包都(就像任何一個其他圖像,如果你想從盒子緩存的地圖)。 並告訴你從包

- (void)loadTileAtPath:(MKTileOverlayPath)path 
       result:(void (^)(NSData *data, NSError *error))result 

得到瓷磚。

所以,現在我可以安裝我的應用程序,關閉Wi-Fi,我會得到這些地圖。

相關問題