关于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 下载存储就可以使用了。