2013-06-19 4 views
7

в моем приложении Я хочу использовать автономные карты и с помощью этих карт использовать файлы gpx, чтобы иметь маршрут. Я нашел openstreetmap, чтобы сделать это, но есть ли некоторые более качественные услуги? (лучшее решение с кривыми уровня) спасибоIOS: использовать офлайн-карты

+0

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

ответ

9

Офлайновые карты требуют немного опыта работы в iOS, так как там не так много проектов и примеров. Однако у вас есть один проект под названием Route-Me, который может дать вам отправную точку. Мы использовали его для разработки Metro Valencia Offline, который успешно добрался до магазина приложений. Я написал small tutorial о том, как добавить Route-Me в ваш проект.

В основном вы можете использовать любой канал, который может понадобиться (OpenStreetMaps - это один из них, а также тот, который мы использовали). Что вы должны сделать, это:

  1. скачать карту плитки (https://metacpan.org/pod/Geo::OSM::Tiles)
  2. Поместите их в базу данных SQLite (http://shikii.net/blog/downloads/map2sqlite-bin.zip)
  3. Изменить Route-Me для плитки должна быть подана из базы данных вместо того, чтобы с сайта OpenStreetMaps
+0

Можете ли вы объяснить мне это исключение? «SimpleMap [1020: 907] *** Завершение приложения из-за неперехваченного исключения« NSInternalInconsistencyException », причина:« Графика и память слишком облагаются налогом, если [содержимое minZoom] больше 1,5 меньше [tileSource minZoom] » – CrazyDev

+3

То есть фактически NSAssert, брошенный Маршрутом-Me, который я никогда не понимал полностью. Я прокомментировал это и никогда не испытывал никаких проблем. NSAssert можно найти в 'RMMapContents.m' внутри метода' setTileSource: 'PS. В 'setMinZoom: есть еще один, но я оставил это последнее, как есть. –

+0

wow фантастический, теперь он работает !! спасибо ... могу ли я написать здесь, если у меня есть другие вопросы? – CrazyDev

2

Вы можете проверить также: Skobbler в/Telenav: http://developer.skobbler.com/support#download он основан на OpenStreetMap и они получили полные возможности в автономном режиме (GPX треков навигации, карта рендеринга, маршрутизации & г erouting)

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 (имя_файла), чтобы узнать, где получить все необходимые вам плитки. (Simulator кэш в пользователях/YOU/Library/Developer/CoreSimulator/Devices/... и библиотека скрытый каталог)

После кэшировать все, что вам нужно просто положить в корешке вашего приложения (точно так же как любой другое изображение, если вы хотите из коробки кешированной карты). И скажите своим

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

, чтобы получить плитки из пучка.

Итак, теперь я могу установить приложение, отключить Wi-Fi, и все равно получаю эти карты.

Смежные вопросы