2013-06-19 15 views
7

私のアプリではオフラインマップを使用したいが、このマップではgpxファイルを使用してルートを作成する。私はそれを行うopenstreetmapを見つけましたが、いくつかのより良いサービスがありますか? (レベルカーブのベストソリューション) ありがとうIOS:オフラインマップを使用する

+0

http://www.mapbox.com? – Wain

答えて

9

オフラインマップは、そこに多くのプロジェクトや例がないため、iOSでの経験が少し必要です。 しかし、Route-Meと呼ばれる1つのプロジェクトがあります。これはあなたに出発点を与えることができます。 Metro Valencia Offlineを開発してApp Storeに成功させました。 プロジェクトにRoute-Meを追加する方法については、small tutorialと書いてあります。

基本的には、任意のマップフィードを使用することができます(OpenStreetMapsは、それらの1つであり、これも使用しています)。何をする必要がありますすることです:マップタイルを

  1. ダウンロード(https://metacpan.org/pod/Geo::OSM::Tiles
  2. のSQLiteデータベース(http://shikii.net/blog/downloads/map2sqlite-bin.zip)に入れて
  3. 修正ルートミーデータベースから供給されるタイルGPXは& Rをルーティング、ナビゲーション、地図レンダリングを追跡する(それはOpenStreetMapのに基づいているhttp://developer.skobbler.com/support#download、彼らは完全なオフライン機能を持って:skobblerさん/ Telenavを:代わりに、オープンストリートマップのウェブサイト
+0

この例外について私に説明できますか?"SimpleMap [1020:907] ***キャッチされていない例外 'NSInternalInconsistencyException'のためアプリを終了しています、理由:[contents minZoom]が[tileSource minZoom]よりも1.5より小さい場合、グラフィックスとメモリに過度の課税が発生します" – CrazyDev

+3

実際に私が完全に理解したことのないRoute-Meによって投げられたNSAssertです。私はそれをコメントし、何の問題もなかった。 NSAssertは 'setTileSource:' PSメソッドの中の 'RMMapContents.m'にあります。 'setMinZoom:'には別のものがありますが、最後のものをそのまま残しました。 –

+0

うわふわ、今それは働く!おかげさま...私は他の質問がある場合私はここに書くことができますか? – CrazyDev

2

からのあなたもテストすることができますeruting)

1

Nutiteq Maps SDK:http://developer.nutiteq.com、iOSとAndroidのオフラインマップ、Xamarin IDE(C#)およびネイティブ言語(Java、ObjectiveC、Swift)をサポートしています。ルーティングやナビゲーション(Skobblerなど)はそれほど多くはありませんが、インタラクティブなレイヤー(マップの上にある点、線、ポリゴン)を持つ複雑なマップに焦点を当てています。 1つの利点は、OpenStreetMapだけでなく、SDK自身が提供する独自のベースマップソース(社内、サードパーティ)を使用できることです。

免責事項:私はそれを開発しています。

0

MapKitのデフォルトマップとMKTileOverlayのサブクラスを使用して、ダウンロードしたタイルを保存して、キャッシュされていないタイルをダウンロードせずに返すことができました。

1)の変更MapKitからデフォルトのマップのソースとMKTileOverlayのサブクラスを使用します(ここでは "オープンストリートマップ")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]; 
} 

コメントを解除から

- (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)サブクラス "を使用していますsaveFileWithName "を実行し、シミュレータで実行します。 NSLog(fileName)を追加して、必要なすべてのタイルを取得する場所を知ることもできます。 (シミュレータキャッシュがユーザーにある/ YOU /ライブラリ/開発/ CoreSimulator /デバイス/ ... とライブラリが隠しディレクトリである)

あなたはただ単にどのように(あなたのアプリケーションのバンドルに置く必要があるすべてのキャッシュされた後、他の画像、あなたが箱のキャッシュされた地図から望むなら)。 そして、バンドルからタイルを得るためにあなたの

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

を教えてください。

これで私のアプリをインストールしてwi-fiをオフにして、それらのマップを取得します。

関連する問題