iOS關於高德SDK詳解和簡單使用

 根據如今項目需求,地圖,定位成了如今app的很經常使用的一個技術點,如今國內大衆化的地圖框架我的總結一下,不是很全面,可是大體知足你們的需求。git

  1,系統自帶mapkit框架,這個框架維護性比較高,可是封裝起來比較繁雜。api

  2,第三發SDK,咱們通常選擇高德或者百度。app

 

 

下面我來總結一下我用高德SDK的心得,下面來看看使用流程框架

  1,咱們先申請一個appkey,申請appkey必須註冊高德開發者動畫

    

  2,高德SDK的下載,如今SDK分別有三個庫,根據你的app 裏面的集成需求,能夠選擇性的下載添加到本身的工程裏,他們分別是 2D地圖庫,3D地圖庫,還有搜索庫;ui

  3,添加SDK進本身的項目(工程)裏,添加的時候注意路徑問題,添加完高德SDK以後,咱們還須要添加一些系統自帶庫,有了這些才能支持高德SDK的運行,他們分別以下圖編碼

  

  4,運行環境的配置,在TARGETS->Build Settings->Other Linker Flaggs 中添加-ObjC。spa

或者你們有熟悉CocoaPods的同窗想省去配置環境和路徑的問題,那麼咱們就能夠採用pods來配置他,分別搜索AMap3DMap,AMap2DMap,AmapSearch,你們一看大體就知道這三個的用途了,若是不知道怎麼用pods來管理的話,我會在下一篇博客裏面講解CocoaPods的使用。code

  5,接下來你們最關心的地方來了,那就是怎麼實現顯示地圖的代碼,下面咱們就來看看裏面的核心類,orm

  首先咱們要現實地圖,MAMapView這是實現地圖的關鍵類,下面看怎麼來展現地圖在咱們的項目裏面,咱們這裏先說說2D的實現吧,

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    
    [MAMapServices sharedServices].apiKey = @"a2e716827857a145e86e99ea08cfe15f";
    
    _mapView = [[MAMapView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    _mapView.mapType = MAMapTypeSatellite;//設置地圖樣式,衛星
    _mapView.showTraffic = YES; //打開實時交通路況
    _mapView.delegate = self;
    _mapView.logoCenter = CGPointMake(CGRectGetWidth(self.view.bounds)-55, 450);//設置地圖logo的中心點
    _mapView.showsCompass= YES; // 設置成 NO 表示關閉指南針;YES 表示顯示指南針
    
    _mapView.showsScale = YES; //設置成 NO 表示不顯示比例尺;YES 表示顯示比例尺
    _mapView.scaleOrigin= CGPointMake(_mapView.scaleOrigin.x, 22); //設置比例尺位置
    _mapView.compassOrigin= CGPointMake(_mapView.compassOrigin.x, 22); //設置指南針位置

    _mapView.showsUserLocation = YES; //開啓地圖定位
    
    
    [_mapView setUserTrackingMode:MAUserTrackingModeFollow animated:YES]; //設置用戶根宗模式
    
    
    [self.view addSubview:_mapView];
    
    MAPointAnnotation *pointAnnotation = [[MAPointAnnotation alloc] init];//初始化標註
    pointAnnotation.coordinate = CLLocationCoordinate2DMake(39.989631, 116.481018); //設置標註地理座標
    pointAnnotation.title = @"方恆國際";//設置標註標題
    pointAnnotation.subtitle = @"阜通東大街 6 號";//設置標註子標題
    [_mapView addAnnotation:pointAnnotation];//添加標註
    
}
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id<MAAnnotation>)annotation
{
        if ([annotation isKindOfClass:[MAPointAnnotation class]]) {
            static NSString *pointReuseIndetifier = @"pointReuseIndetifier";
            MAPinAnnotationView*annotationView = (MAPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:pointReuseIndetifier];
            if (annotationView == nil) {
                annotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pointReuseIndetifier];
            }
            annotationView.canShowCallout= YES; //設置氣泡能夠彈出,默認爲 NO
        
            annotationView.animatesDrop = YES; //設置標註動畫顯示,默認爲 NO

            annotationView.draggable = YES; //設置標註能夠拖動,默認爲 NO annotationView.pinColor = MAPinAnnotationColorPurple;
            return annotationView;
        }
        return nil;
    
        
}


- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation{
//    NSLog("latitude : %f,longitude: %f",userLocation.coordinate.latitude,userLocation.coordinate.l ongitude);
    NSLog(@"latitude : %f,longitude: %f", userLocation.coordinate.latitude,userLocation.coordinate.longitude);
    
}

咱們注意看看ViewWillApper裏面,這些代碼,這裏都是設置地圖的一些屬性的,顯示地圖看起來是否是很簡單,定位也是一個簡單技術點,可是在這裏咱們再來看看重點,咱們一半的應用都是輸入一個地址,獲得一個標註,或者根據定位獲得地址,

  根據地址插入地圖上面一個標註,標註初始化的時候咱們傳入了一個經緯度,

  定位獲得地址,定位能夠獲得經緯度,標註在地圖上面,可是目的是輸出地址,

 那麼這兩個都涉及到了一個共同的問題,一個是將經緯度轉出地址,一個是根據地址轉出經緯度,那麼這兩個是一個逆向過程,咱們下面咱們看看怎麼實現這個過程的,在地圖開發中,這個就是咱們所謂的地理編碼和反編碼。

如今咱們今天講的是高德SDK,那麼用的編碼過程也是

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _search = [[AMapSearchAPI alloc] initWithSearchKey:@"a2e716827857a145e86e99ea08cfe15f" Delegate:self];  //初始化搜索
    AMapGeocodeSearchRequest *georequest = [[AMapGeocodeSearchRequest alloc] init]; //構造一個request對象
    georequest.searchType = AMapSearchType_Geocode; //設置爲地理編碼樣式
    georequest.address = @"北大"; //地址
    georequest.city = @[@"北京"];//所在城市
    [_search AMapGeocodeSearch:georequest]; //發起地理編碼
    
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark 地理編碼成功的回調
- (void)onGeocodeSearchDone:(AMapGeocodeSearchRequest *)request response:(AMapGeocodeSearchResponse *)response
{

    if (response.count == 0) {
        return;
    }
    NSString *string = [NSString stringWithFormat:@"%ld", response.count];
    for (AMapTip *tip in response.geocodes) {//response.geocodes全部跟地址匹配的地點
        NSLog(@"%@", [NSString stringWithFormat:@"%@", tip.description]);
    }
    
}

 

反向地理編碼跟正向基本一致下面是代碼

    _search = [[AMapSearchAPI alloc] initWithSearchKey:@"a2e716827857a145e86e99ea08cfe15f" Delegate:self];  //初始化搜索
    AMapReGeocodeSearchRequest *georequest = [[AMapReGeocodeSearchRequest alloc] init]; //構造一個request對象
    georequest.searchType = AMapSearchType_ReGeocode; //設置爲反地理編碼樣式
    georequest.location = [AMapGeoPoint locationWithLatitude:39.000 longitude:116.00];//設置所在地裏位置的經緯度
    georequest.radius = 1000;//搜索半徑
    georequest.requireExtension = YES;// 是否返回擴展信息,默認爲 NO
    [_search AMapGeocodeSearch:georequest]; //發起反地理編碼
#pragma mark 反地理編碼成功
- (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
{
    if (response.regeocode != nil) {
        //處理搜索結果
        NSString *result = [NSString stringWithFormat:@"%@", response.regeocode];
    }
}

 

在對今天的技術點作一個總結,

  1,實現地圖的展現,

  2,插入標註,插入的時候要給經緯度

  3,定位服務,定位服務獲取的是經緯度,

  4,地理編碼和反編碼

  5,定位,標註這兩個點要注意,通常咱們都是給定一個地址想獲得標註在地圖上面,那麼咱們必須對其進行地理編碼,定位獲取的經緯度,咱們須要看到的是地址,那麼咱們要將經緯度反地理編碼成地址

 

今天高德SDK的簡單實用就到這裏了,若是想實現自定義圖層,搜索路徑,這些請參看高德SDK官方文檔。

相關文章
相關標籤/搜索