高德云图 iOS SDK 使用总结

APP开发需求:加载地图,定位到用户当前的位置,并标注附近的坐标点(上图中的蓝色标注点)。坐标数据由业务人员提供。同时还需要将用户地理位置(城市)上传到服务端。地图sdk选择高德家的,高德地图对开发者比较友好。首先,注册高德开发者账号,注册之后登录帐号,申请用户Key

开发环境配置

高德提供CocoaPods安装方式,这点比百度地图做的好。自动安装比手动安装方便太多了。在Podfile中添加下面两行

pod 'AMap2DMap'
pod 'AMapSearch' #搜索服务SDK

运行命令pod install 安装高德sdk。更详细的步骤移步高德开发者配置文档

地图功能

首先,引入头文件

#import <AMapSearchKit/AMapSearchKit.h>
#import <MAMapKit/MAMapKit.h>

初始化mapview

self.mapView = [[MAMapView alloc] initWithFrame:self.view.bounds];
self.mapView.delegate = self;
self.mapView.showsUserLocation = YES;   //YES 为打开定位,NO为关闭定位
self.mapView.showsCompass = NO;
self.mapView.showsScale = NO;
self.mapView.userTrackingMode = MAUserTrackingModeFollow; // 追踪用户地理位置更新
self.mapView.zoomLevel = 16.1;
self.mapView.alpha = 0.8;

实现 MAMapViewDelegate,获取用户当前经纬坐标:

#pragma mark - MAMapViewDelegate
-(void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:(BOOL)updatingLocation{
    if(updatingLocation){
        //取出当前位置的坐标
        self.currentCoordinate = userLocation.coordinate;
    }
}

- (void)mapView:(MAMapView *)mapView didFailToLocateUserWithError:(NSError *)error {
    DLog(@"%@",error);
}

当用户手动滑动地图后,可点击界面上的定位按钮,将地图中心定位到用户当前位置

-(void)locationButtonClicked {
    if (self.currentCoordinate.latitude > 0) { 
        CLLocationCoordinate2D myCoordinate = self.currentCoordinate;
        MACoordinateRegion theRegion = MACoordinateRegionMake(myCoordinate, MACoordinateSpanMake(0.2, 0.2)); 
        [self.mapView setScrollEnabled:YES];
        [self.mapView setRegion:theRegion animated:YES];
        [self.mapView setZoomLevel:16.1 animated:NO];
    }
}

通过地理位置经纬坐标获取城市名称,即逆地理编码

逆地理编码,又称地址解析服务,是指从已知的经纬度坐标到对应的地址描述(如行政区划、街区、楼层、房间等)的转换。常用于根据定位的坐标来获取该地点的位置详细信息,与定位功能是黄金搭档。

进行逆地编码时,请求参数类为 AMapReGeocodeSearchRequest,location为必设参数。

- (void)searchLocationWithCoordinate2D:(CLLocationCoordinate2D )coordinate {
    //构造AMapReGeocodeSearchRequest对象
    AMapReGeocodeSearchRequest *regeo = [[AMapReGeocodeSearchRequest alloc] init];
    regeo.location = [AMapGeoPoint locationWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    regeo.radius = 10000;
    regeo.requireExtension = YES;
    
    //发起逆地理编码
    [self.searchAPI AMapReGoecodeSearch: regeo];
}

实现逆地理编码的回调函数

#pragma mark - AMapSearchDelegate
- (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response
{
    if(response.regeocode != nil)
    {
        //通过AMapReGeocodeSearchResponse对象处理搜索结果
        NSString *city = response.regeocode.addressComponent.city;
        if (!city || [city length] == 0) {
            city = response.regeocode.addressComponent.province; // 直辖市时获取此字段
        }

        self.city = city;
    }
}

云检索

开发检索自有数据的步骤:

第一步,数据存储。开发者需要将待检索数据存入云图,并对要检索的字段建立索引管理。

第二步,检索。利用SDK为开发者提供的接口检索自己的数据。

第三步,展示。开发者可根据自己的实际需求以多种形式(如结果列表、地图模式等)展现自己的数据。

1.数据存储

由于要导入的数据量比较多,可以调用云图API批量上传数据。利用API创建云图表,需先申请Web服务APIkey,此key和ios端的key是两个独立的key,这个key用于webapi调用。创建表:

 > $apikey=xxxxxxxx;
 > curl -d "key=$apikey&name=test" http://yuntuapi.amap.com/datamanage/table/create

status=1表明创建成功,同时返回的还有tableid,根据这个tableid就可以做数据导入

{"info":"OK","status":1,"tableid":"565c0fa8e4b0dce2a8eabc81"}%

批量上传数据只能以文件的形式:

向指定tableid的数据表中通过上传文件的方式创建多条数据。该接口为异步接口,请求后立即返回后台进程batchid,通过批量创建数据进度查询接口查看任务执行进度和结果。

文件格式和大小有限制:

  • csv文件的二进制流,使用UTF8、GBK编码
  • 数据量不超过10000条且文件大小不超过10M
  • 字段总数不超过40个。
  • 字段命名规则:以英文字母开头,仅由英文字母、数字、下划线组成,总长度不超过20位

文件内容如下,name,address,longitude,latitude这四个字段是必须的,可以自定义其他字段。

name,address,longitude,latitude
543691,北京市东城区故宫博物院,116.312361,39.843083
543692,北京海淀区中关村大街1号海龙大厦,116.365686,40.034993

上传脚本:

#!/bin/bash

key=xxxxxxx
tableid=565c0fa8e4b0dce2a8eabc81
uploadDir=/User/upload

for i in `cat uploadfile.txt`  #uploadfile.txt包含了所有要上传的文件名称
do
echo -n "$i "
curl -F "file=@$uploadDir/$i" http://yuntuapi.amap.com/datamanage/data/batchcreate\\\\?key\\\\=$key\\\\&tableid\\\\=$tableid\\\\&_name\\\\=name\\\\&loctype\\\\=2\\\\&_address\\\\=address\\\\&longitude\\\\=longitude\\\\&latitude\\\\=latitude
echo " "
sleep 60
done

注意sleep 60,没有这个的话,可能无法上传成功,至少我没加sleep就全部请求返回失败。

2.客户端检索和展示:

这里需要实现的是周边检索,周边检索的请求参数对象为 AMapCloudPOIAroundSearchRequest ,其中:center 参数为必填参数。

- (void)searchCloudMapWithCenterLocationCoordinate2D:(CLLocationCoordinate2D )coordinate {
    
    NSString *tableID = self.tableID  // 云图的tableID
       
    AMapCloudPOIAroundSearchRequest *request = [[AMapCloudPOIAroundSearchRequest alloc] init];
    request.tableID = tableID;
    request.center = [AMapGeoPoint locationWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    request.radius = 100000;
    request.offset = 100;  // 最多只能获取100条数据
    request.page = 1;  // 第一页
    
    [self.searchAPI AMapCloudPOIAroundSearch:request];      
}

//实现云检索对应的回调函数,添加标注Annotation
#pragma mark - AMapSearchDelegate
- (void)onCloudSearchDone:(AMapCloudSearchBaseRequest *)request response:(AMapCloudPOISearchResponse *)response {

    NSMutableArray *annotations = [[NSMutableArray alloc] init];
    for (AMapCloudPOI *poi in response.POIs) {
        AMapGeoPoint *point = poi.location;
        MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];
        annotation.coordinate = CLLocationCoordinate2DMake(point.latitude, point.longitude);
        [annotations addObject:a1];
    }
   
    [self.mapView addAnnotations:[annotations copy]];
    [self.mapView showAnnotations:annotations animated:YES];
}

实现 MAMapViewDelegate 协议中的 mapView:viewForAnnotation:回调函数,设置标注样式。

- (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.image = [UIImage imageNamed:@"location_annotation"];
        }
       
        return annotationView;
    }
    return nil;
}

地图定位加标注的功能就完成了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容