iOS_基于百度地图的开发
iOS_百度地圖 步驟:
1.申請百度地圖key.? ? http://lbsyun.baidu.com/apiconsole/key
2.下載百度開發包.? ? ? http://api.map.baidu.com/lbsapi/cloud/sdkiosdev-download.htm
3.新建項目.這部分設計添加lib以及資源文件,參考百度的IOS api開發指南做就行,那些內容已經在2013年10月份更新過了,照著里面做就能順利通過編譯。
4.將ViewController的.m改成.mm
5.在委托中.h文件中中加入
#import "BMapKit.h"
并聲明變量
BMKMapManager* _mapManager;
在.m委托中加入
_mapManager = [[BMKMapManager alloc]init];
// 如果要關注網絡及授權驗證事件,請設定 generalDelegate參數
BOOL ret = [_mapManager start:@"3102732B30E0D66EF51415C9E6CE055EC78FF07E" generalDelegate:nil];
if (!ret) {
? ? NSLog(@"manager start failed!");
}
6.注意:
在這里就開始運行程序的話,會出現[UIDevice uniqueGlobalDeviceIdentifier]: unrecognized selector sent to instance0x1ed19370
這么一個bug,解決辦法很多,之一:加入4個文件NSString+MD5Addition,UIDevice+IdentifierAddition,直接加入到項目里面就可以,無需引入頭文件
下載地址 http://www.kuaipan.cn/file/id_30491149655344975.htm
7.在viewController.mm中的viewDidLoad改為如下代碼
- (void)viewDidLoad
{
? ? [superviewDidLoad];
? ? BMKMapView* mapView = [[BMKMapView alloc]initWithFrame:CGRectMake(0,0, 320, 548)];
? ?self.view = mapView;
? ? // Do any additional setup after loading the view, typically from a nib.
}
保存后運行,一個簡單的百度地圖API應用就完成了
源代碼下載http://www.kuaipan.cn/file/id_30491149655344976.htm
擴展:
1.功能五,搜索,用的很廣泛,這個功能很強大,你可以搜索某一坐標點附近的加油站,停車場,賓館,酒店,餐廳,甚至廁所都能搜索到,比如說你想查找5000米內的加油站,以及1000米內的停車場。
flag = [_search? poiSearchNearBy:@"加油站" center:coor1 radius:5000 pageIndex:0];
flag = [_search? poiSearchNearBy:@"停車場" center:coor1 radius:1000 pageIndex:0];
然后用委托
-(void)onGetPoiResult:(NSArray*)poiResultList searchType:(int)type errorCode:(int)error
輸出結果。
2.將百度地圖視角切換到某一坐標點
-(void)Region{
? ? CLLocationCoordinate2D coor;
? ? coor.latitude =self._latitude;
? ? coor.longitude =self._longitude;
? ?NSDictionary *tip =? BMKBaiduCoorForWgs84(coor);
? ? CLLocationCoordinate2D coor1=? BMKCoorDictionaryDecode(tip);
? ? BMKCoordinateRegion viewRegion = BMKCoordinateRegionMake(coor1, BMKCoordinateSpanMake(0.05,0.05));
? ? BMKCoordinateRegion adjustedRegion = [_mapView regionThatFits:viewRegion];
? ? [_mapView setRegion:adjustedRegion animated:YES];
}
3.清除地圖上所有痕跡和路線
-(void)clereOldYJDH{
? ?NSArray* array = [NSArray arrayWithArray:_mapView.annotations];
? ? [_mapView removeAnnotations:array];
? ? array = [NSArray arrayWithArray:_mapView.overlays];
? ? [_mapView removeOverlays:array];
? ? [self Region];
}
//當選中一個annotation views時,調用此接口
- (void)mapView:(BMKMapView *)mapView didSelectAnnotationView:(BMKAnnotationView *)view
{
? ? NSLog(@"選中一個annotation views:%f,%f",view.annotation.coordinate.latitude,view.annotation.coordinate.longitude);
}
//當取消選中一個annotation views時,調用此接口
- (void)mapView:(BMKMapView *)mapView didDeselectAnnotationView:(BMKAnnotationView *)view{
? ? NSLog(@"取消選中一個annotation views");
}
//當mapView新添加annotation views時,調用此接口
- (void)mapView:(BMKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
? ? NSLog(@"mapView新添加annotation views");
}
//當點擊annotation view彈出的泡泡時,調用此接口
- (void)mapView:(BMKMapView *)mapView annotationViewForBubble:(BMKAnnotationView *)view
{
? ? NSLog(@"點擊annotation view彈出的泡泡");
}
//拖動annotation view時view的狀態變化
-(void)mapView:(BMKMapView*)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newStatefromOldState:(BMKAnnotationViewDragState)oldState
{
? ? NSLog(@"動annotation view時view的狀態變化");
}
//標注呈綠色樣式大頭釘
((BMKPinAnnotationView *)annotationView).pinColor = BMKPinAnnotationColorGreen;
//允許用戶拖動
[annotationView setDraggable:YES];
//氣泡框左側顯示的View,可自定義
annotationView.leftCalloutAccessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_location.png"]];
//氣泡框右側顯示的View可自定義
annotationView.rightCalloutAccessoryView =selectButton;
//讓標注在進入界面時就處于彈出氣泡框的狀態
[annotationView setSelected:YES animated:YES];
//整個標注的偏移量
annotationView.centerOffset = CGPointMake(0, -(annotationView.frame.size.height *0.5));
annotationView.annotation = annotation;//綁定對應的標點經緯度
annotationView.canShowCallout =TRUE;//允許點擊彈出氣泡框
4.在地圖上定制標注替代大頭釘,可以將文字圖片所有能加到view中的,都可以以大頭釘的形式顯示出來,需要將view轉換為image主要代碼,最重要的是知道這個原理,然后實現起來就很簡單:
- (BMKAnnotationView *)mapView:(BMKMapView *)view viewForAnnotation:(id <BMKAnnotation>)annotation
在這個委托中實現如下代碼
UIView *viewForImage=[[UIView alloc]initWithFrame:CGRectMake(0,0, 132, 64)];
UIImageView *imageview=[[UIImageViewalloc]initWithFrame:CGRectMake(0,0, 32,64)];
[imageview setImage:[UIImage imageNamed:@"車位置.png"]];
[viewForImage addSubview:imageview];
UILabel *label=[[UILabelalloc]initWithFrame:CGRectMake(32,0, 100,64)];
label.text=@"陳雙超";
label.backgroundColor=[UIColor clearColor];
[viewForImage addSubview:label];
annotationView.image=[self getImageFromView:viewForImage];
-(UIImage *)getImageFromView:(UIView *)view{
? ? UIGraphicsBeginImageContext(view.bounds.size);
? ? [view.layerrenderInContext:UIGraphicsGetCurrentContext()];
? ? UIImage *image =UIGraphicsGetImageFromCurrentImageContext();
? ? UIGraphicsEndImageContext();
? ?return image;
}
在網上發現別人專門建立view來定制氣泡和專門建立文件來定制大頭釘,覺得那方法對代碼管理起來更簡單,可讀性強。
http://www.kuaipan.cn/file/id_30491149655345085.htm
@interface KYBubbleView : UIScrollView { ?//UIView是氣泡view的本質
? ? NSDictionary *_infoDict;
? ? UILabel ? ? ? ? *titleLabel;//標題label
? ? UILabel ? ? ? ? *detailLabel;//副標題label
? ? UILabel ? ? ? ? *contactLabel;? ?//聯系人
? ? UILabel ? ? ? ? *homeAddresslabel; ?//家庭地址
? ? UIButton? ? ? ? *rightButton;
? ? NSUInteger? ? ? index;
}
#import "BMKPointAnnotation.h"
@interface KYPointAnnotation : BMKPointAnnotation {
? ? NSUInteger _tag;
}
@property NSUInteger tag;
@end
擴展: 當前為iOS提供的SKD版本為1.2.1,這里主要講一下這個版本存在的一些問題,以及開發注意事項。
1.? BMKMapView是百度地圖類,當創建多個BMKMapView對象時,這些對象會共享一些數據(沒有仔細研究具體共享哪些數據),因此會產生以下問題:
? ? A. 當對其中一個BMKMapView通過手勢來進行放大、縮小、移動等操作時,其他的BMKMapView對象會自動進行放大、縮小、移動。
? ? B. 啟動應用程序時,首先顯示出來的BMKMapView可以得到用戶的當前位置,其他的BMKMapView可能要等一段時間或者完全無法得到用戶當前的位置。
2.? 為了解決1.B中的問題,可以只使用一個BMKMapView對象,比如在兩個不同的UIView中共享同一個BMKMapView對象。此外,有一個方法可以基本上解決1.A的問題。假設UIView A和UIView B均有BMKMapView(可以為不同或同一個對象),在UIView A和UIVIew B之間進行切換時,記錄下各自當前BMKMapView的Frame,然后在顯示的時候再通過設置Frame來恢復到切換前的狀態。這個方法的缺點是,在切換很快的時候,ViewDidAppear不一定會被調用,ViewWillDisapper的調用順序不確定,不過可以滿足普通操作的要求。
3.? BMKSearch提供了搜索、地址解析等功能。百度通過回調來響應搜索結果,關鍵的問題是,有時回調并不會被調用(個人感覺是BMKSearch之后,百度的SDK無法正確找到回調函數,比如處于不同的線程等等)。為了能讓百度SDK正確找到回調,建議如下:
? ? A. 在沒有得到回調之前,不要釋放BMKSearch對象,最好做成全局對象。(必須)
? ? B. 在搜索路線時,如果起始位置是通過經緯度來表示的,那么節點信息中除了設置經緯度pt信息外,一定要設置name信息(不能為空字符串)。(必須)
? ? C. 不能同時進行多個搜索。(必須)
? ? D. 在每次通過BMKSearch對象進行搜索之前,最好是將其delegate設置為nil,然后進行release,然后再alloc,然后再進行搜索。(強烈建議)
? ? E. 所有的搜索的操作均不要通過委托或其他線程的回調等等來發起,應該是由本對象主動發起,并且本對象作為搜索代理,這樣百度SDK才能正確找到回調函數。(強烈建議)
4.? 有時需要判斷當前用戶經緯度是否是在國內,可以通過BMKSearch的地址反解析之后的回調來判斷,如果返回的錯誤碼為BMKErrorResultNotFound,那么有可能不在國內,因為其他的原因也可能導致返回此錯誤碼。
5.? 其實,最好的解決方法是采用AutoNavi高德地圖api,如果是iOS6,那么直接可以直接使用MKMapView,其采用的就是AutoNavi接口。目前AutoNavi接口不足之處是沒有步行路線,據說還在開發中,相信以后會支持的。
總結
以上是生活随笔為你收集整理的iOS_基于百度地图的开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 静静的分析华为Mate X的部分“亮点”
- 下一篇: 18岁开始学习编程是否来得及?