目前我們在做IOS開發中絕大多數用的是GoogleMap地圖,IOS本身內建的也是googleMap,但是如果我們希望在地圖上即時顯示路況資訊等部分功能,googlemap則沒有,所以有時候我們可以應用百度地圖做應用程式。下面我簡單介紹一下BMapKit的應用:
一:首先我們有一點與用googlemap開發的不同,需要建立BMKMapManager管理應用程式的map,如果沒有這個類,地圖則不能夠顯示。
下面紅色的字型是自己在百度官方申請的地圖api——key;
BMKMapManager *_mapManager = [[BMKMapManager
alloc] init];
BOOL ret = [_mapManager
start:@"C3252C69EDB6D21A10B3FC9657FD1DDC7E0000**"
generalDelegate:self];
if (!ret) {
NSLog(@"manager start failed!");
}
二:在view中添加BMKMapView,同時設定BMKMapViewDelegate,添加annotation(記錄興趣點,BMKAnnotation),同時每個興趣點可以設定其title(設定annotation的標題),以及subtitle(子標題)。
@interface MapBaiDu :
UIViewController <BMKMapViewDelegate> { }
@property (nonatomic,
strong) BMKMapView *_mapView;
@end
- (void)viewDidLoad {
_mapView = [[BMKMapView
alloc] initWithFrame:CGRectMake(0,
39, 320,
377)]; //建立MKMapView
[self.view
addSubview:_mapView];
[_mapView
release];
_mapView.delegate =
self;
//設定代理
_mapView.showsUserLocation =
YES; //設定為可以顯示使用者位置
CLLocationCoordinate2D coordinate; //設定經緯度
coordinate.latitude =
40.027283; //緯度
coordinate.longitude =
116.313217; //經度
BMKCoordinateRegion viewRegion =
BMKCoordinateRegionMake(coordinate, BMKCoordinateSpanMake(1.0,
1.0));
BMKCoordinateRegion adjustedRegion = [_mapView
regionThatFits:viewRegion];
[_mapView
setRegion:adjustedRegion animated:YES];
}
上面最後一行 :設定當前地圖的經緯度範圍,設定的該範圍可能會被調整為適合地圖視窗顯示的範圍。region是BMKMapView的一個屬性,類型BMKCoordinateRegion ,這行的意思是建立一個以coordinate為中心,上下左右個0.5個經(緯)度。但是這時我們需要注意一個問題就是,建立的地區是一個正方形,並不符合我們所需要的BMKMapView比例;之後用方法regionThatFits調整顯示範圍。
///表示一個經緯度地區
typedef struct {
CLLocationCoordinate2D center;
///< 中心點經緯度座標
BMKCoordinateSpan span;
///< 經緯度範圍
} BMKCoordinateRegion;
///表示一個經緯度範圍
typedef struct {
CLLocationDegrees latitudeDelta;
///< 緯度範圍
CLLocationDegrees longitudeDelta;
///< 經度範圍
} BMKCoordinateSpan;
三:下面我們簡單說一下delegate
1:地圖地區改變時候調用函數:
- (void)mapView:(BMKMapView *)mapView regionWillChangeAnimated:(BOOL)animated;
- (void)mapView:(BMKMapView *)mapView regionDidChangeAnimated:(BOOL)animated;
2:annotation
*根據anntation產生對應的View
- (BMKAnnotationView *)mapView:(BMKMapView *)mapView viewForAnnotation:(id <BMKAnnotation>)annotation;
*當mapView新添加annotation views時,調用此介面
- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views;
*當選中一個annotation views時,調用此介面
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view;
*當取消選中一個annotation views時,調用此介面
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view;
而annotation分為兩部分:BMKAnotation該類為標註點的protocol,提供了標註類的基本資料函數,title和subtitle分別是標題和子標題;同時可以設定標註的左邊,在拖曳時候會被調用setCoordinate;
BMKAnnotationView為標註點顯示視圖類,該類繼承UIView,可以設定此view顯示的映像,可以設定centerOffset(中心的位置,正的位移使view超右下方移動,負的朝右上方移動,單位為像素),還可以設定calloutOffset改變淡出的氣泡位置(正的位移使view超右下方移動,負的朝左上方移動,單位是像素)。還可以設定其觸摸事件,預設情況下為YES,可以選中,也可以是enabled
= NO。其他的屬性還有:selected,canShowCallout,leftCalloutAccessoryView,rightCalloutAccessoryView。等等
四:當地圖view定位時調用函數:
*當取消選中一個annotation views時,調用此介面
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view;
*在地圖View將要啟動定位時,會調用此函數
- (void)mapViewWillStartLocatingUser:(BMKMapView *)mapView;
*在地圖View停止定位後,會調用此函數
- (void)mapViewDidStopLocatingUser:(BMKMapView *)mapView;
*定位失敗後,會調用此函數
- (void)mapView:(BMKMapView *)mapView didFailToLocateUserWithError:(NSError *)error;
*使用者位置更新後,會調用此函數
- (void)mapView:(BMKMapView *)mapView didUpdateUserLocation:(BMKUserLocation *)userLocation;
五:當有overlay(陰影標示某一個地區)產生或者新添加的時候調用此介面
*根據overlay產生對應的View
- (BMKOverlayView *)mapView:(BMKMapView *)mapView viewForOverlay:(id <BMKOverlay>)overlay;
*當mapView新添加overlay views時,調用此介面
- (void)mapView:(BMKMapView *)mapView didAddOverlayViews:(NSArray *)overlayViews;
六:當點擊annotation view彈出的泡泡時,調用此介面
*當點擊annotation view彈出的泡泡時,調用此介面
- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view;
九:annotation view有許多不同的狀態,在不同狀態的時候我們都可以設定不同的操作,拖動annotation view時view的狀態變化
- (void)mapView:(BMKMapView *)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newState
fromOldState:(BMKAnnotationViewDragState)oldState;
enum {
BMKAnnotationViewDragStateNone = 0,
///< 靜止狀態.
BMKAnnotationViewDragStateStarting, ///<
開始拖動
BMKAnnotationViewDragStateDragging, ///<
拖動中
BMKAnnotationViewDragStateCanceling, ///<
取消拖動
BMKAnnotationViewDragStateEnding ///<
拖動結束
};
typedef NSUInteger BMKAnnotationViewDragState;