适用于iOS离线MapKit解决方案(Offline MapKit solution for iOS

2019-06-24 06:51发布

你快速的问题。 我有我的工作,这将需要使用地图的应用程序,但不会有网络连接。 我看到别人问这问类似的问题,但我的要求是微微有点不同的,所以我想发布一个新的问题。

这里是我的应用需求。

  1. 允许有可定义的注释地图的捏/变焦
  2. 地图必须是可用的脱机
  3. 地图应该被限制在一定的地理区域
  4. 应用程序没有通过苹果的检查。 这是一个企业应用程序,将作为一个信息亭。

那么,有没有缓存地图瓦片的任何框架或方法任何人都可以建议?

在此先感谢出去。

Answer 1:

我用默认的地图从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(文件名)知道在哪里可以得到你所需要的所有瓷砖。 (模拟器缓存中的用户/你/库/开发商/ CoreSimulator /设备/ ...和图书馆是一个隐藏目录)

您缓存毕竟你只需要把你的应用程序的包(就像一个其他任何图像,如果你从箱子缓存地图需要)。 并告诉你

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

从束获得的瓷砖。

所以,现在我可以安装我的应用程序,打开Wi-Fi了,我会得到这些地图呢。



Answer 2:

尝试使用http://mapbox.com/其同时具有的iOS SDK,并构建离线地图应用程序。



Answer 3:

检查第10.3 谷歌地图服务条款 ,你会发现,你不能存储任何谷歌地图的内容。 这意味着,你需要提供的不仅仅是自己的地图,而且更换方便MapKit功能。 你真的不能使用MapKit在所有的离线应用,据我可以告诉。



Answer 4:

不幸的是MapKit框架不支持离线地图访问。 你应该更喜欢MapBox的iOS SDK(iOS版MapBox SDK是构建支持离线缓存策略的地图应用程序,变焦范围,视网膜显示的行为,起点坐标和地图视图拖动减速等工具集....

找到实例链接

快乐编码



Answer 5:

见skobbler /泰为SDK -它是基于OpenStreetMap的是(几乎)全栈更换,以mapkit(地图渲染,路由和由转向导航)与离线地图的集成支持



文章来源: Offline MapKit solution for iOS