太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)
本文遵循“署名-非商业用途-保持一致”创作公用协议
可以在定位的过程中,发现那个经常见到的“联网成功”和“授权成功”均不见了,取而代之是2 和 -300.(XCode 的日志输出区会有输出)
后来偶尔切换到公网,查资料,忘切回来了,居然能正常工作了,才意识到这个问题的根源。
特意把小WIFI的WAN口插到公交交换机上,再测试就OK了,断开那根救命线,这边怎么测试都是无法定位,而且两个日志输出区的标识也由数字代替了。
另外,反向地理解析,是一定要有网络连接的,以便从百度服务器获得指定经纬度对应的省、市、区(县)、街、号。。。。。。
定位功能
简介
由于系统原因,iOS不允许使用第三方定位,因此地图SDK中的定位方法,本质上是对原生定位的二次封装。通过封装,开发者可更便捷的使用。此外,地图SDK中还提供了相应的定位图层(支持定位三态效果),帮助开发者显示当前位置信息。
注:自iOS8起,系统定位功能进行了升级,SDK为了实现最新的适配,自v2.5.0起也做了相应的修改,开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述
获取位置信息
定位功能可以和地图功能分离使用,单独的定位功能使用方式如下:
-(void)viewDidLoad { //设置定位精确度,默认:kCLLocationAccuracyBest [BMKLocationServicesetLocationDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; //指定最小距离更新(米),默认:kCLDistanceFilterNone [BMKLocationServicesetLocationDistanceFilter:100.f]; //初始化BMKLocationService _locService = [[BMKLocationService alloc]init]; _locService.delegate = self; //启动LocationService [_locService startUserLocationService]; } //实现相关delegate 处理位置信息更新 //处理方向变更信息 - (void)didUpdateUserHeading:(BMKUserLocation *)userLocation { //NSLog(@"heading is %@",userLocation.heading); } //处理位置坐标更新 - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation { //NSLog(@"didUpdateUserLocation lat %f,long %f",userLocation.location.coordinate.latitude,userLocation.location.coordinate.longitude); }
展示定位信息
展示定位信息的功能位于“地图和覆盖物”这个功能模块,开发者在使用时要注意选择。核心代码如下:(完整信息请参考Demo)
//普通态 //以下_mapView为BMKMapView对象 _mapView.showsUserLocation = YES;//显示定位图层 [_mapView updateLocationData:userLocation];
地理编码
地理编码指的是将地址信息建立空间坐标关系的过程。又可分为正向地图编码和反向地图编码。
正向地理编码指的是由地址信息转换为坐标点的过程。
反向地理编码服务实现了将地球表面的地址坐标转换为标准地址的过程。反向地理编码提供了坐标定位引擎,帮助用户通过地面某个地物的坐标值来反向查询得到该地物所在的行政区划、所处街道、以及最匹配的标准地址信息。通过丰富的标准地址库中的数据,可帮助用户在进行移动端查询、商业分析、规划分析等领域创造无限价值。
正向地理编码和反向地理编码示例如下:
-(void)viewDidLoad { //初始化检索对象 _searcher =[[BMKGeoCodeSearch alloc]init]; _searcher.delegate = self; BMKGeoCodeSearchOption *geoCodeSearchOption = [[BMKGeoCodeSearchOption alloc]init]; geoCodeSearchOption.city= @"北京市"; geocodeSearchOption.address = @"海淀区上地10街10号"; BOOL flag = [_searcher geoCode:geoCodeSearchOption]; [geoCodeSearchOption release]; if(flag) { NSLog(@"geo检索发送成功"); } else { NSLog(@"geo检索发送失败"); } //发起反向地理编码检索 //CLLocationCoordinate2D pt = (CLLocationCoordinate2D){39.915, 116.404}; //BMKReverseGeoCodeOption *reverseGeoCodeSearchOption = [[ //BMKReverseGeoCodeOption alloc]init]; //reverseGeoCodeSearchOption.reverseGeoPoint = pt; //BOOL flag = [_searcher reverseGeoCode:reverseGeoCodeSearchOption]; //[reverseGeoCodeSearchOption release]; //if(flag) //{ // NSLog(@"反geo检索发送成功"); //} //else //{ // NSLog(@"反geo检索发送失败"); //} } //实现Deleage处理回调结果 //接收正向编码结果 - (void)onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error{ if (error == BMK_SEARCH_NO_ERROR) { //在此处理正常结果 } else { NSLog(@"抱歉,未找到结果"); } } //接收反向地理编码结果 //-(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result: //(BMKReverseGeoCodeResult *)result //errorCode:(BMKSearchErrorCode)error{ // if (error == BMK_SEARCH_NO_ERROR) { // 在此处理正常结果 // } // else { // NSLog(@"抱歉,未找到结果"); // } //} //不使用时将delegate设置为 nil -(void)viewWillDisappear:(BOOL)animated { _searcher.delegate = nil; }