日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS_基于百度地图的开发

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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開發指南做就行,那些內容已經在201310月份更新過了,照著里面做就能順利通過編譯。


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+MD5AdditionUIDevice+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 viewview的狀態變化

-(void)mapView:(BMKMapView*)mapView annotationView:(BMKAnnotationView *)view didChangeDragState:(BMKAnnotationViewDragState)newStatefromOldState:(BMKAnnotationViewDragState)oldState

{

? ? NSLog(@"annotation viewview的狀態變化");

}

//標注呈綠色樣式大頭釘

((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 AUIView B均有BMKMapView(可以為不同或同一個對象),在UIView AUIVIew B之間進行切換時,記錄下各自當前BMKMapViewFrame,然后在顯示的時候再通過設置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_基于百度地图的开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。