iOS中的离线地图

时间:2016-08-09 16:22:21

标签: ios mkmapview mapkit offline-caching mktileoverlay

我非常需要为我的应用做离线地图,因为它主要是为泰国制作的,因为泰国通常很难连接互联网。我现在正在为我的MKTileOverlay使用OpenStreetMap,但是在实现它以供离线使用时遇到了问题。我找到了一个教程,说明要继承MKTileOverlay。所以,在我的ViewController中我有地图:

 -(void) viewWillAppear:(BOOL)animated {
CLLocationCoordinate2D coord = {.latitude =  15.8700320, .longitude =  100.9925410};
MKCoordinateSpan span = {.latitudeDelta =  3, .longitudeDelta =  3};
MKCoordinateRegion region = {coord, span};
[mapView setRegion:region];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"Map";
    NSString *template = @"http://tile.openstreetmap.org/{z}/{x}/{y}.png";
    self.overlay = [[XXTileOverlay alloc] initWithURLTemplate:template];
    self.overlay.canReplaceMapContent = YES;
    [mapView addOverlay:self.overlay level:MKOverlayLevelAboveLabels];


}
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id)overlay {

        return [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];

}

在我的MKTileOverlay子类中,我有:

- (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;
    }
    NSData *cachedData = [self.cache objectForKey:[self URLForTilePath:path]];
    if (cachedData) {
        result(cachedData, nil);
    } else {
        NSURLRequest *request = [NSURLRequest requestWithURL:[self URLForTilePath:path]];
        [NSURLConnection sendAsynchronousRequest:request queue:self.operationQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
            result(data, connectionError);
        }];
    }
}

问题是NOTHING完全被加载,除非我注释掉子类中的代码。我搞砸了哪里?

2 个答案:

答案 0 :(得分:2)

我也有兴趣在离线模式下加载地图。

  1. 首先,我在 gmapcatcher 的帮助下将磁贴下载到我的本地系统(计算机)。

    您可以获得有关gmapcatcher here的一些信息。你可以download this application here

    如果您想下载文件离线检查,还有很多方法可以保存文件。对于此方案,请在设置窗口中选择 OSM (位于左侧,您将在设置窗口中指定要下载的路径)

  2. 只需将创建的图块文件夹添加到项目中即可。

  3. 而且我不知道objective-c所以我在swift中实现并且我只发布了该代码。

  4. 这是代码

    {{1}}

    我将简要介绍一下代码。

    viewDidLoad 委托方法中,我通过给出tiles文件夹的路径来创建 MKTileOverlay 。由于我已经放入了项目,因此它将在捆绑中。

    rendererForOverlay 委托方法中,我将返回 MKTileOverlayRenderer

答案 1 :(得分:1)

您需要一台能够使用图片回复http://<domain>/{z}/{x}/{y}/image.png的服务器,或者您必须使用路径/tiles/{z}/{x}/{y}/image.png将切片保存在应用包中。