浏览器版本低!无法浏览完整内容,建议升级或更换浏览器。

iOS 地图SDK

百度地图SDK是一套应用程序接口, 通过调用地图SDK接口,开发者可以轻松访问百度地图的服务和数据,构建功能丰富、交互性强的地图类应用程序。


本章节将对批量操作Overlay、图片图层(图片覆盖物)、瓦片图层、热力图等做进一步的说明。

批量操作Overlay

批量添加Overlay

/**
 *向地图窗口添加一组Overlay,需要实现BMKMapViewDelegate的-mapView:viewForOverlay:函数来生成标注对应的View
 *@param overlays 要添加的overlay数组
 */
- (void)addOverlays:(NSArray *)overlays;

批量删除Overlay

/**
 *移除一组Overlay
 *@param overlays 要移除的overlay数组
 */
- (void)removeOverlays:(NSArray *)overlays;
自定义图片图层(图片覆盖物)

图片图层(GroundOverlay)又称为图片覆盖物,此功能支持在地图的指定位置上添加一张大小合适的图片。图片可随地图的平移、缩放、旋转等操作做相应的变换。 图片图层是一种特殊的Overlay, 它位于底图和底图标注层之间(即图片图层不会遮挡地图标注信息), 此外,图片图层的添加顺序不会影响其他图层(例如:POI搜索图层、我的位置图层等)的叠加关系。

图片图层对象初始化的方法有两种:(1)根据指定经纬度坐标生成 (2)根据指定区域生成。

下面举例分步说明添加图片图层的步骤:

1修改您的ViewController.h文件,添加以下代码,使您的ViewController实现BMKMapViewDelegate协议:
@interface AnnotationDemoViewController : UIViewController<BMKMapViewDelegate>{  
         IBOutlet BMKMapView* _mapView;  
   }  
end
2修改您的ViewController.m文件,在viewDidLoad添加图片图层对象:
- (void)viewDidLoad {  
        [super viewDidLoad];  
        //添加图片图层覆盖物(第一种:根据指定经纬度坐标生成)  
        CLLocationCoordinate2D coors; 
        coors.latitude = 39.800;
        coors.longitude = 116.404;
        BMKGroundOverlay* ground = [BMKGroundOverlay groundOverlayWithPosition:coors
        zoomLevel:11 anchor:CGPointMake(0.0f,0.0f)
        icon:[UIImage imageWithName:@"test.png"]];
        [_mapView addOverlay:ground];
 
        //添加图片图层覆盖物(第二种:根据指定区域生成) 
        CLLocationCoordinate2Dcoords[2] = {0};
        coords[0].latitude = 39.815;
        coords[0].longitude = 116.404;
        coords[1].latitude = 39.915;
        coords[1].longitude = 116.504;
        BMKCoordinateBounds bound;
        bound.southWest = coords[0];
        bound.northEast = coords[1];
        BMKGroundOverlay* ground2 = [BMKGroundOverlay groundOverlayWithBounds: bound
        icon:[UIImage imageWithName:@"test.png"]];
        [_mapView addOverlay:ground2]; 
 
}
3修改您的ViewController.m文件,实现BMKMapViewDelegate的_mapView:viewForOverlay:函数:
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id<BMKOverlay>)overlay{  
        if ([overlay isKindOfClass:[BMKGroundOverlay class]]){  
            BMKGroundOverlayView* groundView = [[BMKGroundOverlayView alloc] initWithOverlay:overlay];  
            return groundView;  
        }  
        return nil;  
}

运行效果如下图所示:

ios_map_draw_8.png

自定义瓦片图层

自v2.9.0起,新增瓦片图层(TileOverlay), 该图层支持开发者添加自有瓦片数据。 该图层可随地图的平移、缩放、旋转等操作做相应的变换,它仅位于底图之上(即瓦片图层将会遮挡底图,不遮挡其他图层),瓦片图层的添加顺序不会影响其他图层(例如:POI搜索图层、我的位置图层等)的叠加关系,适用于开发者拥有某一区域的地图,并希望使用此区域地图覆盖相应位置的百度地图。

通过瓦片图层可对基础底层地图添加额外的特性,如:某个商场的室内信息、某个景区的详情等等。自定义图层类是MBKTileOverlay,它定义了能添加到基础底层地图的图片集合。

瓦片划分规则

添加瓦片图层的前提是使用球面墨卡托投影生成了相应的瓦片,并按照生成的格式部署在您的服务器上。 百度地图SDK根据不同的比例尺将地图划分成若干个瓦片,并且以中心点经纬度(0,0)开始计算瓦片,当地图显示缩放级别增大时,每一个瓦片被划分成4 个瓦片。如: 地图级别为0时,只有1张瓦片 地图级别为1时,会分成 1 * 4 = 4 张瓦片。

依次类推, 地图级别为n时,总共划分的瓦片为:4的n次方 为了保证瓦片的显示效果,第n级的瓦片显示的地图level范围为[n - 0.5, n + 0.5)

{{bluepoint}}瓦片图层,有本地加载和离线加载两种绘制方式

本地加载

将图片打包于应用内,适用于图片较小且不需要频繁变更,通过继承BMKSyncTileLayer实现,具体请参考demo,效果如下:

ios_map_draw_9.JPG

在线加载

使用在线下载,将图片存放于开发者提供的服务中,提供给SDK一个URL模板,适用于图片需要随时变更,下面举例说明添加在线瓦片图层的步骤:

1根据URL模版(即指向相关图层图片的URL)创建BMKURLTileLayer对象。
BMKURLTileLayer *urlTileLayer = [[BMKURLTileLayer alloc] initWithURLTemplate:@"http://api0.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&udt=20150601&customid=light"];
2设置BMKURLTileLayer的可见最大/最小Zoom值。
urlTileLayer.maxZoom = 18;
urlTileLayer.minZoom = 16;
3设定BMKURLTileLayer的可渲染区域。
urlTileLayer.visibleMapRect = BMKMapRectMake(32994258, 35853667, 3122, 5541);
4将BMKURLTileLayer对象添加到BMKMapView中
[_mapView addOverlay:urlTileLayer];
5实现BMKMapViewDelegate回调,核心代码如下
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay {
    if ([overlay isKindOfClass:[BMKTileLayer class]]) {
        BMKTileLayerView *view = [[BMKTileLayerView alloc] initWithTileLayer:overlay];
        return view;
    }
    return nil;
}
6运行效果如下:

ios_map_draw_10.png

自定义热力图

热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,百度地图SDK将绘制热力图的能力为广大开发者开放,帮助开发者利用自有数据,构建属于自己的热力图,提供丰富的展示效果。

注意:此处的“热力图功能”不同于“百度城市热力图”。百度城市热力图通过简单的接口调用,开发者可展示百度数据的热力图层。而此处的热力图功能,需要开发者传入自己的位置数据(坐标),然后SDK会根据热力图绘制规则,为开发者做本地的热力图渲染绘制。

{{bluepoint}}热力图生成的原理:大量自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。

本例仅以json中取坐标数据做说明,开发者可以将坐标数据放在数组中。

利用热力图功能构建自有数据热力图的方式如下:

//添加热力图
-(void)addHeatMap{
    
    //创建热力图数据类
    BMKHeatMap* heatMap = [[BMKHeatMap alloc]init];
    //创建热力图数据数组
    NSMutableArray* data = [NSMutableArray array];
    
    //读取数据
    NSData *jsonData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"locations" ofType:@"json"]];
    if (jsonData) {
        NSArray *array = [jsonData objectFromJSONData];
        for (NSDictionary *dic in array) {
            //创建BMKHeatMapNode
            BMKHeatMapNode* heapmapnode_test = [[BMKHeatMapNode alloc]init];
            CLLocationCoordinate2D coor;
            coor.latitude = [dic[@"lat"] doubleValue];
            coor.longitude = [dic[@"lng"] doubleValue];
            heapmapnode_test.pt = coor;
            //随机生成点强度
            heapmapnode_test.intensity = arc4random()*900;
            //添加BMKHeatMapNode到数组
            [data addObject:heapmapnode_test];
        }
    }
    //将点数据赋值到热力图数据类
    heatMap.mData = data;
    //调用mapView中的方法根据热力图数据添加热力图
    [mapView addHeatMap:heatMap];
}
//删除热力图
-(void)removeHeatMap{
    [_mapView removeHeatMap];
}

注意:

自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。如拥有的数据是某一坐标上有一个数值(如密度值、趋势值),生成热力图时,可以理解为在某一坐标打点“密度值次”、“趋势值次”,地图即可呈现热力图。

但密度值、趋势值可能为小数,需要对数据做一下处理,比如整体密度值、趋势值扩大1000倍取整。 读取坐标数据时,某个坐标读取“1000倍密度值次”,那么坐标点的密度,就会通过热力呈现出来了。