基礎(chǔ)地圖
開發(fā)者可利用SDK提供的接口,使用百度提供的基礎(chǔ)地圖數(shù)據(jù)。目前百度地圖SDK所提供的地圖等級(jí)為19級(jí),所包含的信息有建筑物、道路、河流、學(xué)校、公園等內(nèi)容。
百度地圖支持多點(diǎn)觸摸、雙擊放大、多點(diǎn)單擊縮小、旋轉(zhuǎn)等手勢(shì)操作,此外自2.2.0版本起,支持相應(yīng)的控制接口來(lái)開啟/關(guān)閉這些手勢(shì)操作;此外,在該版本地圖對(duì)象實(shí)現(xiàn)了多實(shí)例特性,即開發(fā)者可以在一個(gè)頁(yè)面中建立多個(gè)地圖對(duì)象,并且針對(duì)這些對(duì)象分別操作且不會(huì)產(chǎn)生相互干擾。具體使用方法請(qǐng)參考MultiMapViewDemo的介紹。
地圖上自定義的標(biāo)注點(diǎn)和覆蓋物我們統(tǒng)稱為地圖覆蓋物。您可以通過(guò)定制BMKAnnotation和BMKOverlay來(lái)添加對(duì)應(yīng)的標(biāo)注點(diǎn)和覆蓋物。地圖覆蓋物的設(shè)計(jì)遵循數(shù)據(jù)與View分離的原則,BMKAnnotation和BMKOverlay系列的類主要用來(lái)存放覆蓋物相關(guān)的數(shù)據(jù),BMKAnnotaionView和BMKOverlayView系列類為覆蓋物對(duì)應(yīng)的View。
SDK支持畫點(diǎn)、折線、圓、多邊形(包括凹凸兩種)、圖片圖層和自定義覆蓋物。從2.0.0開始矢量地圖采用OpenGL繪制,新增支持OpenGL繪制的基本線繪制、面繪制接口。詳見AnnotationDemo,SDK內(nèi)置的BMKPolylineOverlay、BMKPolygonOverlay,BMKCircleOverlay均采用OpenGL繪制。
1. 衛(wèi)星圖
//切換為衛(wèi)星圖
[_mapView setMapType:BMKMapTypeSatellite];
運(yùn)行后效果如下:
2. 由衛(wèi)星圖切換為普通矢量圖的核心代碼如下:
//切換為普通地圖
[_mapView setMapType:BMKMapTypeStandard];
3. 實(shí)時(shí)交通圖
利用地圖SDK所提供的接口,開發(fā)者可顯示當(dāng)前地圖城市內(nèi)的實(shí)時(shí)路況信息(點(diǎn)擊查看支持實(shí)時(shí)路況的城市)。此外,自2.0.0版本起,SDK還支持城際(城市之間,如高速)路況。
開啟實(shí)時(shí)路況的核心代碼如下:
//打開實(shí)時(shí)路況圖層
[_mapView setTrafficEnabled:YES];
運(yùn)行后效果如下:
關(guān)閉實(shí)時(shí)路況的核心代碼如下:
//關(guān)閉實(shí)時(shí)路況圖層
[_mapView setTrafficEnabled:NO];
4. 百度城市熱力圖
百度地圖SDK繼為廣大開發(fā)者開放熱力圖本地繪制能力之后,再次進(jìn)一步開放百度自有數(shù)據(jù)的城市熱力圖層,幫助開發(fā)者構(gòu)建形式更加多樣的移動(dòng)端應(yīng)用。
百度城市熱力圖的性質(zhì)及使用與實(shí)時(shí)交通圖類似,只需要簡(jiǎn)單的接口調(diào)用,即可在地圖上展現(xiàn)樣式豐富的百度城市熱力圖。
在地圖上使用百度城市熱力圖的核心代碼如下:
//打開百度城市熱力圖圖層(百度自有數(shù)據(jù))
[_mapView setBaiduHeatMapEnabled:YES];
運(yùn)行后效果如下:
//關(guān)閉百度城市熱力圖圖層(百度自有數(shù)據(jù))
[_mapView setBaiduHeatMapEnabled:NO];
5. 地圖標(biāo)注
1). 標(biāo)注
BMKAnnotation為標(biāo)注對(duì)應(yīng)的protocal,您可以自定義標(biāo)注類實(shí)現(xiàn)該protocal。百度地圖SDK也預(yù)置了基本的標(biāo)注點(diǎn)(BMKPointAnnotation)和一個(gè)大頭針標(biāo)注View(BMKPinAnnotationView),您可以直接使用來(lái)顯示標(biāo)注。方法如下:
第一步,ViewController 遵守 BMKMapViewDelegate 協(xié)議:
第二步,修改ViewController.m文件,實(shí)現(xiàn)BMKMapViewDelegate的_mapView:viewForAnnotation:函數(shù),并在viewDidAppear添加標(biāo)注數(shù)據(jù)對(duì)象,核心代碼如下:
運(yùn)行后,會(huì)在地圖顯示對(duì)應(yīng)的標(biāo)注點(diǎn),點(diǎn)擊會(huì)彈出氣泡,效果如圖:
通過(guò)以上幾步簡(jiǎn)單的操作,您就可以實(shí)現(xiàn)在地圖上添加標(biāo)注了,相應(yīng)的刪除標(biāo)注方法如下:
2). 點(diǎn)聚合功能
自v2.9.0版本起,新增點(diǎn)聚合功能,可通過(guò)縮小地圖層級(jí),將定義范圍內(nèi)的多個(gè)標(biāo)注點(diǎn),聚合顯示成一個(gè)標(biāo)注點(diǎn),解決加載大量點(diǎn)要素到地圖上產(chǎn)生覆蓋現(xiàn)象的問(wèn)題,并提高性能。此次在Demo中開放源碼,方便開發(fā)者自行修改。
添加點(diǎn)聚合的方法:
I. 聲明點(diǎn)聚合管理類為全局變量,并初始化,核心代碼如下:
BMKClusterManager*_clusterManager;//點(diǎn)聚合管理類
//初始化點(diǎn)聚合管理類
_clusterManager = [[BMKClusterManager alloc]init];
II. 向點(diǎn)聚合管理類中添加點(diǎn),核心代碼如下
CLLocationCoordinate2D coor = CLLocationCoordinate2DMake(39.915,116.404);
//向點(diǎn)聚合管理類中添加標(biāo)注
for(NSInteger i=0;i<20;i++){
double lat=(arc4random()%100)*0.001f;
double lon=(arc4random()%100)*0.001f;
BMKClusterItem *clusterItem = [[BMKClusterItem alloc]init];
clusterItem.coor = CLLocationCoordinate2DMake(coor.latitude+lat,coor.longitude+lon);[_clusterManager addClusterItem:clusterItem];
}
III. 獲取聚合后的點(diǎn),并添加到地圖中,核心代碼如下
///獲取聚合后的標(biāo)注
NSArray *array = [_clusterManager getClusters:_clusterZoom];
NSMutableArray *clusters = [NSMutableArray array];
for(BMKCluster *iteminarray) {
ClusterAnnotation *annotation = [[ClusterAnnotation alloc]init];
annotation.coordinate = item.coordinate;
annotation.size = item.size;
annotation.title = [NSString stringWithFormat:@"我是%ld個(gè)",item.size];
[clusters addObject:annotation];
}
[_mapView removeAnnotations:_mapView.annotations];
[_mapView addAnnotations:clusters];
具體源碼請(qǐng)?jiān)贑lusterDemo中查看。
3). 底圖標(biāo)注
自v2.9.0版本起,SDK給BMKMapView提供了控制底圖標(biāo)注的showMapPoi方法,默認(rèn)顯示底圖標(biāo)注。利用此方法可得到僅顯示道路信息的地圖。
將底圖標(biāo)注設(shè)置為隱藏,方法如下:
//設(shè)置隱藏地圖標(biāo)注
[_mapView setShowMapPoi:NO];
運(yùn)行后,底圖標(biāo)注被隱藏,效果如圖:
4). 幾何圖形
百度地圖SDK支持的幾何圖形有:折線、弧線、多邊形和圓,折線、弧線及其他幾何圖形的邊框自v2.6.0版本起支持使用虛線或者紋理圖片進(jìn)行繪制(具體使用方法請(qǐng)參考官方Demo,覆蓋物章節(jié)的介紹)。我們可利用相應(yīng)的接口,在地圖上快速繪制這些圖形,滿足相應(yīng)的業(yè)務(wù)需求。
I. 折線
在地圖上添加折線的方法如下:
運(yùn)行后效果如下:
iOS地圖SDK自v2.8.0版本起,新增了折線多段顏色繪制能力,實(shí)現(xiàn)的核心代碼如下:
運(yùn)行效果如下:
自v2.9.0版本起,新增了折線分段顏色繪制能力
實(shí)現(xiàn)的核心代碼如下:
第一步,添加折線分段顏色繪制覆蓋物,核心代碼如下:
CLLocationCoordinate2D coords[5]={0};
coords[0].latitude=39.965;
coords[0].longitude=116.404;
coords[1].latitude=39.925;
coords[1].longitude=116.454;
coords[2].latitude=39.955;
coords[2].longitudev = 116.494;
coords[3].latitudev=39.905;
coords[3].longitude =116.554;
coords[4].latitude = 39.965;
coords[4].longitude = 116.604;
//構(gòu)建分段顏色索引數(shù)組
NSArray*colorIndexs = [NSArray arrayWithObjects:[NSNumber numberWithInt:2],
[NSNumber numberWithInt:0],
[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],nil];
//構(gòu)建BMKPolyline,使用分段顏色索引,其對(duì)應(yīng)的BMKPolylineView必須設(shè)置colors屬性.
BMKPolyline*colorfulPolyline=[BMKPolyline polylineWithCoordinates:coords count:5 textureIndex:colorIndexs];
[_mapView addOverlay:colorfulPolyline];
第二步,實(shí)現(xiàn)BMKMapViewDelegate回調(diào),核心代碼如下:
//根據(jù)overlay生成對(duì)應(yīng)的View
- (BMKOverlayView*)mapView:(BMKMapView*)mapView viewForOverlay:(id)overlay {
if([overlay isKindOfClass:[BMKPolylineclass]]) {
BMKPolylineView *polylineView = [[BMKPolylineView alloc]initWithOverlay:overlay];
polylineView.lineWidth=5;
/// 使用分段顏色繪制時(shí),必須設(shè)置(內(nèi)容必須為UIColor)
polylineView.colors = [NSArray arrayWithObjects:[UIColor greenColor],
[UIColor redColor],
[UIColor yellowColor],nil];
returnpolylineView;
}
returnnil;
}
運(yùn)行效果如下:
?II. 弧線
百度地圖iOS SDK自v2.1.1版本起,新增了繪制弧線的方法。可以根據(jù)三個(gè)有序點(diǎn)唯一確定一條弧線。首先,修改.m文件,實(shí)現(xiàn)BMKMapViewDelegate的_mapView:viewForOverlay:方法,并在viewDidLoad添加弧線數(shù)據(jù)對(duì)象,核心代碼如下:
運(yùn)行效果如下:
III. 多邊形
修改ViewController.h文件,使其實(shí)現(xiàn)BMKMapViewDelegate;同時(shí)修改ViewController.m文件,實(shí)現(xiàn)BMKMapViewDelegate的_mapView:viewForOverlay:函數(shù),并在viewDidLoad添加多邊形數(shù)據(jù)對(duì)象。核心代碼如下:
運(yùn)行效果如下:
IV. 圓
與多邊形實(shí)現(xiàn)的方式類似,首先要修改ViewController.h文件,實(shí)現(xiàn)BMKMapViewDelegate協(xié)議;然后修改ViewController.m文件,實(shí)現(xiàn)BMKMapViewDelegate的_mapView:viewForOverlay:函數(shù),并在viewDidLoad添加圓數(shù)據(jù)對(duì)象。核心代碼如下:
運(yùn)行效果如下:
V. 地形圖圖層
自V2.1.0開始,新增圖片圖層,開發(fā)者可在地圖的指定位置上添加圖片。該圖片可隨地圖的平移、縮放、旋轉(zhuǎn)等操作做相應(yīng)的變換。圖片圖層是一種特殊的Overlay, 它位于底圖和底圖標(biāo)注層之間(即圖片圖層不會(huì)遮擋地圖標(biāo)注信息), 此外,圖片圖層的添加順序不會(huì)影響其他圖層(例如:POI搜索圖層、我的位置圖層等)的疊加關(guān)系。
圖片圖層對(duì)象初始化的方法有兩種:(1)根據(jù)指定經(jīng)緯度坐標(biāo)生成 (2)根據(jù)指定區(qū)域生成。下面舉例分步說(shuō)明添加圖片圖層的步驟:
運(yùn)行效果如下圖:
VI. 熱力圖功能
熱力圖是用不同顏色的區(qū)塊疊加在地圖上描述人群分布、密度和變化趨勢(shì)的一個(gè)產(chǎn)品,百度地圖SDK將繪制熱力圖的能力為廣大開發(fā)者開放,幫助開發(fā)者利用自有數(shù)據(jù),構(gòu)建屬于自己的熱力圖,提供豐富的展示效果。
注意:此處的“熱力圖功能”不同于“百度城市熱力圖”。百度城市熱力圖通過(guò)簡(jiǎn)單的接口調(diào)用,開發(fā)者可展示百度數(shù)據(jù)的熱力圖層。而此處的熱力圖功能,需要開發(fā)者傳入自己的位置數(shù)據(jù),然后SDK會(huì)根據(jù)熱力圖繪制規(guī)則為開發(fā)者做本地的熱力圖渲染繪制。
利用熱力圖功能構(gòu)建自有數(shù)據(jù)熱力圖的方式如下:
運(yùn)行結(jié)果如下:
VII. 自定義覆蓋物
從v2.0.0開始,地圖渲染采用OpenGL方式實(shí)現(xiàn),因此覆蓋物基類BMKOverlayView新增glRender接口,以及繪制基本線renderLinesWithPoints、面renderRegionWithPoints的接口來(lái)實(shí)現(xiàn)對(duì)覆蓋物的OpenGL渲染。繪制自定義overlay時(shí),繼承BMKOverlayView的子類需實(shí)現(xiàn)glRender接口,在glRender中通過(guò)調(diào)用renderLinesWithPoints、renderRegionWithPoints來(lái)組合自己想要實(shí)現(xiàn)的圖形。
CustomOverlayView繼承BMKOverlayPathView,在CustomOverlayView中實(shí)現(xiàn)glRender。核心代碼如下所示:
從2.0.0開始,地圖渲染采用OpenGL方式實(shí)現(xiàn),因此覆蓋物基類BMKOverlayView新增glRender接口,以及繪制基本線renderLinesWithPoints、面renderRegionWithPoints的接口來(lái)實(shí)現(xiàn)對(duì)覆蓋物的OpenGL渲染。繪制自定義overlay時(shí),繼承BMKOverlayView的子類需實(shí)現(xiàn)glRender接口,在glRender中通過(guò)調(diào)用renderLinesWithPoints、renderRegionWithPoints來(lái)組合自己想要實(shí)現(xiàn)的圖形。
CustomOverlayView繼承BMKOverlayPathView,在CustomOverlayView中實(shí)現(xiàn)glRender。核心代碼如下所示:
-(void)glRender{
//自定義overlay繪制
CustomOverlay *customOverlay = [self customOverlay];
if(customOverlay.pointCount>=3)?{
[self renderRegionWithPoints:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?customOverlay.pointspointCount:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?customOverlay.pointCountfillColor:self.fillColorusingTriangleFan:YES];
//繪制多邊形
}else{
[self renderLinesWithPoints:
customOverlay.pointspointCount:
? ? ? ? ? ? ? ? ? ? ? ? customOverlay.pointCountstrokeColor:
? ? ? ? ? ? ? ? ? ? ? ? self.strokeColorlineWidth:
self.lineWidthlooped:NO];
//繪制線
}
}
如果不實(shí)現(xiàn)glRender,則需實(shí)現(xiàn)drawMapRect默認(rèn)使用系統(tǒng)GDI繪制,GDI繪制方式在overlayView尺寸較大時(shí)可能有效率問(wèn)題,因此建議使用glRender來(lái)實(shí)現(xiàn)自定義overlay繪制。
針對(duì)已添加的自定義覆蓋物,您可以通過(guò)一下方式進(jìn)行刪除操作:
if(overlay!=nil){
[_mapView removeOverlay:overlay];
}
VIII. OpenGL繪制功能
自v2.6.0起,iOS地圖SDK為廣大開發(fā)者開放了OpenGL繪制功能,開發(fā)者可利用OpenGL的繪制來(lái)實(shí)現(xiàn)更多復(fù)雜的覆蓋物繪制。
v2.6.0新增BMKMapViewDelegate中新增-mapView:onDrawMapFrame:,地圖渲染每一幀畫面過(guò)程中,以及每次需要重繪地圖時(shí)(例如添加覆蓋物)都會(huì)調(diào)用此接口。開發(fā)者可以在這個(gè)接口中進(jìn)行opengl的繪制。不需要用戶自己創(chuàng)建context和buffer,步驟如下(具體代碼請(qǐng)參考BaiduMap_IOSSDK_SampleOpenGL繪制功能 部分):
1、轉(zhuǎn)換坐標(biāo)(坐標(biāo)系原點(diǎn)為地圖中心點(diǎn));
2、根據(jù)地圖的狀態(tài),設(shè)置旋轉(zhuǎn)和縮放比例;
3、繪制;
IX. 瓦片圖層
iOS地圖SDK自v2.9.0起,新增瓦片圖層(tileOverlay), 該圖層支持開發(fā)者添加自有瓦片數(shù)據(jù),包括本地加載和在線下載兩種方式。
該圖層可隨地圖的平移、縮放、旋轉(zhuǎn)等操作做相應(yīng)的變換,它僅位于底圖之上(即瓦片圖層將會(huì)遮擋底圖,不遮擋其他圖層),瓦片圖層的添加順序不會(huì)影響其他圖層(例如:POI搜索圖層、我的位置圖層等)的疊加關(guān)系,適用于開發(fā)者擁有某一區(qū)域的地圖,并希望使用此區(qū)域地圖覆蓋相應(yīng)位置的百度地圖。
一、瓦片劃分規(guī)則:
百度地圖SDK會(huì)根據(jù)不同的比例尺將地圖劃分成若干個(gè)瓦片,并且以中心點(diǎn)經(jīng)緯度(0,0)開始計(jì)算瓦片,當(dāng)?shù)貓D顯示縮放級(jí)別增大時(shí),每一個(gè)瓦片被劃分成4 個(gè)瓦片。如:
地圖級(jí)別為0時(shí),只有1張瓦片
地圖級(jí)別為1時(shí),會(huì)分成 1 * 4 = 4 張瓦片
依次類推,
地圖級(jí)別為n時(shí),總共劃分的瓦片為:4的n次方
為了保證瓦片的顯示效果,第n級(jí)的瓦片顯示的地圖level范圍為[n - 0.5, n + 0.5)
二、瓦片圖層分為本地加載和在線下載兩種繪制方式。
1. 本地加載,將圖片打包于應(yīng)用內(nèi),適用于圖片較小且不需要頻繁變更,通過(guò)繼承BMKSyncTileLayer實(shí)現(xiàn),具體請(qǐng)參考demo,效果如下:
2. 在線下載,將圖片存放于開發(fā)者提供的服務(wù)中,提供給SDK一個(gè)URL模板,適用于圖片需要隨時(shí)變更,下面舉例說(shuō)明添加在線瓦片圖層的步驟:
I. 根據(jù)URL模版(即指向相關(guān)圖層圖片的URL)創(chuàng)建BMKURLTileLayer對(duì)象。
BMKURLTileLayer *urlTileLayer = [[BMKURLTileLayer alloc] initWithURLTemplate:@"http://api0.map.bdimg.com/customimage/tile?&x={x}&y={y}&z={z}&udt=20150601&customid=light"];
II. 設(shè)置BMKURLTileLayer的可見最大/最小Zoom值。
urlTileLayer.maxZoom=18;
urlTileLayer.minZoom=16;
III. 設(shè)定BMKURLTileLayer的可渲染區(qū)域。
urlTileLayer.visibleMapRect = BMKMapRectMake(32994258,35853667,3122,5541);?
IV. 將BMKURLTileLayer對(duì)象添加到BMKMapView中
[_mapView addOverlay:urlTileLayer];
V. 實(shí)現(xiàn)BMKMapViewDelegate回調(diào),核心代碼如下
- (BMKOverlayView*)mapView:(BMKMapView*)mapView viewForOverlay:(id)overlay{
if([overlay isKindOfClass:[BMKTileLayerclass]]){
BMKTileLayerView *view = [[BMKTileLayerView alloc] initWithTileLayer:overlay];
return view;
}?return?nil;?}
運(yùn)行結(jié)果如下: