关于ios使用切片地图及其下载

本文介绍了在iOS应用中使用切片地图的方法,包括Google瓦片地址的使用和自定义`MKTileOverlay`类。在`viewDidLoad`中设置`MKMapView`并添加覆盖层,通过`rendererForOverlay`方法计算缩放等级,获取屏幕内瓦片的X、Y坐标,从而下载存储地图瓦片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于ios使用切片地图及其下载

1)准备工作

google 瓦片地址:http://mt2.google.cn/maps/vt?lyrs=m&gl=cn&x={x}&y={y}&z={z}
x: 切片的x坐标
y: 切片的y坐标
z: 切片的缩放大小

重写MKTileOverlay类 用于自定义 瓦片覆盖

2)MKmapView

声明

@property (weak, nonatomic) IBOutlet MKMapView *mapView;
@property (strong, nonatomic) MKTileOverlay *gridOverlay;


- (void)viewDidLoad
{
[super viewDidLoad];
self.gridOverlay = [[GridTileOverlay alloc] init];
self.gridOverlay.canReplaceMapContent=NO;
[self.mapView addOverlay:self.gridOverlay level:MKOverlayLevelAboveLabels];
}

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

if([overlay isKindOfClass:[MKTileOverlay class]]) {
    MKTileOverlay *tileOverlay = (MKTileOverlay *)overlay;
    MKTileOverlayRenderer *renderer = nil;
    if([tileOverlay isKindOfClass:[GridTileOverlay class]]) 
    {
        if(self.overlayType==CustomMapTileOverlayTypeGoogle) {
            renderer = [[WatermarkTileOverlayRenderer alloc] initWithTileOverlay:tileOverlay];
        } else {
            renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:tileOverlay];                
        }
    return renderer;
    }
return nil;
}
这样就可以看见谷歌地图的切片了

/**
计算缩放等级

@param mapView MKMapView
@return 缩放等级
*/
- (double)zoomLever:(MKMapView *)mapView
{
double z = 22-round(log2(mapView.region.span.longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapView.bounds.size.width)));
return z;
}

```
**
 计算下载地图所需的数目

 @param num 显示地图的瓦片数目
 @param max 最大缩放等级[3-18]取3
 @param min 最小缩放等级[3-18]取18
 @return 下载数目
 */
- (NSInteger) returnNumberWithMapTilePngNum:(NSInteger)num zMax:(NSInteger)max zmin:(NSInteger)min{
    return num*pow(4, min-max);
}

/**
 lonlat坐标系转换为tile坐标系坐标系

 @param zoom 缩放等级
 @param lon 经度
 @param lat 维度
 @return MKTileOverlayPath 坐标
 */
-(MKTileOverlayPath ) transformWorldCoordinateToTilePathForZoom:(double)zoom fromLon:(double) lon  fromLat:(double) lat
{
    double n = pow(2, zoom);
    double tileX = ((lon+180)/360)*n;
    double tileY = (1 - ( log(tan(lat * M_PI/180.0) + (1 / cos(lat * M_PI/180.0))) / M_PI)) / 2 * n;
//    int tileX = (int)(floor((lon + 180.0) / 360.0 * pow(2.0, zoom)));
//    int tileY = (int)(floor((1.0 - log( tan(lat * M_PI/180.0) + 1.0 / cos(lat * M_PI/180.0)) / M_PI) / 2.0 * pow(2.0, zoom)));
    MKTileOverlayPath path;
    path.x = tileX;
    path.y = tileY;
    path.z = zoom;

    NSLog(@"%@",[NSString stringWithFormat:@"\nX=%d\nY=%d\nZ=%d",path.x,path.y,path.z]);
    return path;
}
/**
 当前瓦片地图信息

 @param num 包含瓦片数量
 @param max 最大缩放等级[3-18]取3
 @param min 最小缩放等级[3-18]取18
 @param star 开始tilePath
 @param end 结束tilePath
 @return 瓦片地图信息信息字典
 */
- (NSDictionary *)returnMapFileSizeNum:(NSInteger)num zMax:(NSInteger)max zMin:(NSInteger)min StarPath:(MKTileOverlayPath)star endPath:(MKTileOverlayPath)end{
    NSMutableDictionary *mapInfo =[[NSMutableDictionary alloc]init];
    double size = pow(4, min-max);
    size = num*size*8/1024;
    [mapInfo setObject:[NSNumber numberWithDouble:size] forKey:@"size"];
    [mapInfo setObject:[NSNumber numberWithInteger:max] forKey:@"zMax"];
    [mapInfo setObject:[NSNumber numberWithInteger:min] forKey:@"zMin"];
    for (double i = max; i<= min; i++) {
        [mapInfo setObject:[self returnZoomNumberStarPath:star endPath:end AndZoom:i] forKey:[NSString stringWithFormat:@"%ld",(long)i]];
        star.x = star.x*2;
        star.y = star.y*2;
        end.x = end.x*2+1;
        end.y = end.y*2+1;
    }
/**
 返回当前缩放等级下的所有瓦片tile坐标系

 @param star 开始titlPath
 @param end 结束titlPath
 @param zoom 缩放等级
 @return path数组
 */
- (NSArray *)returnZoomNumberStarPath:(MKTileOverlayPath)star endPath:(MKTileOverlayPath)end AndZoom:(double)zoom{
    double i ;
    double j ;
    NSMutableArray *numArry = [NSMutableArray arrayWithCapacity:0];
    for (i = star.x; i <= end.x; i++) {
        for (j = star.y; j <=end.y; j++) {
            MKTileOverlayPath path;
            path.x = i;
            path.y = j;
            path.z = zoom;
            NSValue *pathValue = [NSValue valueWithBytes:&path objCType:@encode(MKTileOverlayPath)];
            [numArry addObject:pathValue];
        }
    }
    return [NSArray arrayWithArray:numArry];
}

MKTileOverlayPath 用了系统自己定义的 当然你可以自己定义一个类来存储
这样你就知道了所有在当前屏幕下的不同缩放大小下的瓦片X,Y。然后根据X,Y,Z就可以通过循环拼接 得到所有的瓦片URL 下载存储就可以使用了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值