如何用高德LBS开放平台开发全英文iOS 地图应用

imig 2015-01-08 04:57:00
很多开发者都希望开发出全英文的地图应用,实现地图数据的英文展示以及英文搜索功能。然而苹果自家的MapKit中POI数据不够丰富,搜索方式单一,并且没有输入提示功能。高德地图LBS开放平台中的iOS SDK数据倒是丰富,而且支持多种搜索方式,但是没有英文地图底图, 检索出来的英文结果只能在中文地图上展示。于是机智的开发者想出了一个混搭的方案:用高德地图LBS开放平台中的iOS SDK来实现搜索相关的功能,并将搜索结果展示在通过MapKit开发出来的英文地图上。
前提: 运行英文的地图app时,需将手机语言设置成English;高德iOS SDK的版本需要为V2.4.2版本以上
全英文的地图应用(英文地图+英文搜索)效果图如下:

实现步骤如下:

第一步:申请Key,用于搜索SDK。申请方法看这里:
http://lbs.amap.com/api/ios-sdk/guide/verify/
提示:MapKit是不需要Key的,该key仅用于高德的iOS SDK搜索功能。
第二步:初始化MKMapView ,并添加到Subview。同时,进行定位,设置定位模式,在地图上显示定位点。
注意:
(1)MapKit中的定位(showUserLocation= YES),在回调中获取的坐标不用进行坐标偏转;若使用CLLocationManager方法进行定位,需要进行坐标偏转(参考附加内容)。
(2)MapKit没有申请定位权限,需在代码中申请一下定位权限。
申请方法:在 info.plist中追加NSLocationWhenInUseUsageDescription或NSLocationAlwaysUsageDescription字段。其中:
NSLocationWhenInUseUsageDescription表示应用在前台的时候可以搜到更新的位置信息。
NSLocationAlwaysUsageDescription表示应用在前台和后台(suspend或terminated)都可以获取到更新的位置数据。
 //申请定位权限
- (void) initLocation
{
if(nil == _locationManager)
{
_locationManager = [[CLLocationManager alloc] init];

}

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[_locationManager requestAlwaysAuthorization];
}
}

//初始化MapView
- (void) initMapView{

//构造MKMapView
_mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 21, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds))];
_mapView.delegate = self;

_mapView.showsUserLocation = YES;//显示定位图标

[_mapView setUserTrackingMode:MKUserTrackingModeFollow];//设置定位模式

//将mapview添加到Subview中
[self.view addSubview:_mapView];

}

第三步:初始化主搜索对象AMapSearchAPI
构造AMapSearchAPI对象,并设置搜索结果语言。(支持英文结果的搜索功能包括:POI搜索、逆地理编码和地理编码、输入提示,能够满足基本的搜索功能)
//初始化AMapSearchAPI
- (void)initSearch
{
//构造AMapSearchAPI
_search = [[AMapSearchAPI alloc] initWithSearchKey:APIKey Delegate:self];
_search.language = AMapSearchLanguage_en;//设置语言
}

第四步:构造搜索对象,设置搜索参数,发起查询,在相应的回调中进行结果展示(如:POI查询结果以大头针标注等等)。
以Demo中的POI查询为例,以选择的输入提示语为关键字
/* POI 搜索. */
- (void)searchPOIWithKey:(NSString *)key adcode:(NSString *)adcode
{
if (key.length == 0)
{
return;
}
//构造POI搜索对象AMapPlaceSearchRequest
AMapPlaceSearchRequest *place = [[AMapPlaceSearchRequest alloc] init];
//设置关键字、
place.keywords = key;
place.requireExtension = YES;//设置成YES,返回信息详细,较费流量
if (adcode.length > 0)
{
place.city = @[adcode];
}
//发起查询
[_search AMapPlaceSearch:place];
}

//回调中显示结果
- (void)onPlaceSearchDone:(AMapPlaceSearchRequest *)request response:(AMapPlaceSearchResponse *)respons
{
if (respons.pois.count == 0)
{
return;
}

NSMutableArray *poiAnnotations = [NSMutableArray arrayWithCapacity:respons.pois.count];

[respons.pois enumerateObjectsUsingBlock:^(AMapPOI *obj, NSUInteger idx, BOOL *stop) {

[poiAnnotations addObject:[[POIAnnotation alloc] initWithPOI:obj]];

}];

/* 将结果以annotation的形式加载到地图上. */
[_mapView addAnnotations:poiAnnotations];

/* 如果只有一个结果,设置其为中心点. */
if (poiAnnotations.count == 1)
{
_mapView.centerCoordinate = [poiAnnotations[0] coordinate];
}
/* 如果有多个结果, 设置地图使所有的annotation都可见. */
else
{
[_mapView showAnnotations:poiAnnotations animated:NO];
}
}

附:如何实现非高德坐标转高德坐标的偏转?
由于高德LBS开放平台与MapKit采用了不同的坐标系,因此需要将MapKit的地图进行坐标转换。在此附上非高德坐标转高德坐标偏转的代码(代码中_currentLocation是用cllocationmanager定位返回的坐标,_convertLocation是偏转后的坐标)。
标偏转是发起json请求,需要申请restapi的key,方法可参考第一步,只是平台选择rest api。
详见:
http://lbsbbs.amap.com/forum.php?mod=viewthread&tid=724&extra=page%3D1
/* 非高德转坐标转高德坐标 */
- (void) convert
{

NSError *error;

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://restapi.amap.com/v3/assistant/coordinate/convert?key=897210d6f68d6a63cfc84f86d96ec5e3&coordsys=gps&locations=%f,%f",_currentLocation.coordinate.longitude,_currentLocation.coordinate.latitude]]];


NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

NSDictionary *coordinate = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];

NSString *status = [coordinate objectForKey:@"status"];
NSString *locations = [coordinate objectForKey:@"locations"];


if([status isEqualToString:@"1"]&&![locations isEqualToString:@""])
{
NSArray *array = [locations componentsSeparatedByString:@","];

_convertLocation = [[CLLocation alloc] initWithLatitude:[array[1] doubleValue] longitude:[array[0] doubleValue]];

}
}

该英文地图应用的详尽代码请参见附件:
http://download.csdn.net/detail/u011793198/8343415
...全文
5511 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

791

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 其他移动相关
社区管理员
  • 移动开发其他问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧