百度地图

用百度地图

发表:2013-05-08 16:08:31

当前很多第三方地图提供商都提供了第三方SDK,我们利用这些SDK就可以方便地在IOS中开发地图应用。国内比较好用的有搜狗、百度以及Google。接下来我们就以百度地图为例,介绍IOS中的第三方地图应用的开发。开发地图应用主要分为两大步骤:获取地理位置信息;将地理位置信息赋给地图。对于获取地理位置信息,IOS SDK已经进行了高度封装,在操作上变得非常容易。下面分别介绍。


一、获取地理位置信息

地理位置信息是电子地图的一种数据信息,主要包括纬度(latitude)以及经度(longitude)。由于现在的智能手机都已经内置了GPS、AGPS,所以这一获取步骤是由手机操作系统完成的,我们需要做的就是获取结果即可。在IOS中,这一步骤由CLLocationManager类完成,该类位于CoreLocation.framewok框架(包)下,所以在使用CLLocationManager类前首先需要导入CoreLocation.framewok框架。

1
2
3
4
5
6
7
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
@interface ViewController1 : UIViewController{
     CLLocationManager *_locationManage;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
}
@end

在M文件中,直接声明一个CLLocationManager对象即可。


1
2
3
4
5
//载入位置信息
_locationManage=[[CLLocationManager alloc] init];
_locationManage.delegate =self;
_locationManage.desiredAccuracy=kCLLocationAccuracyBest;
_locationManage.distanceFilter=1000.0f;


一旦成功启动CLLocationManager后,开发人员可以通过didUpdateToLocation委托方法得到相应的地理位置信息。

1
2
3
4
5
- ( void )locationManager:(CLLocationManager *)manager
     didUpdateToLocation:(CLLocation *)newLocation
            fromLocation:(CLLocation *)oldLocation{
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
}


得到了地理位置信息后,我们就可以用这些地理位置信息去定位,获取搜索信息了。

二、应用地理位置信息


获得的地理位置信息是操作系统根据需求,自动返回的(有可能来自于GPS或AGPS、WiFi等),获取过程及果我们不需要关心,只需要关心我们拿到这些数据能够做什么。地理位置信息能够应用于多情场合,最典型的就算地图应用以及地理位置转码了(即将地理位置信息转成容易理解的地址名称)。下面分别介绍。


1、地图定位

接下来我们将会使用第三方的百度地图框架,利用前面获取到的地理位置信息,实现地图定位。百度地图目前只支持Iphone,暂不支持Ipad。这点希望官方迟早完善。下面是详细的部署过程。


1)获取百度开发者应用Key

要调用百度的API,首先你需要成为百度的会员。注册成功并登录后,点击http://developer.baidu.com/map/ios-mobile-apply-key.htm 链接创建您的应用KEY。只有成功获得了开发者应用Key,接下来的实验才能进行(百度目前并不需要审核开发者资料,立即申请立即生效)。


2)下载地图SDK

接下来就可以下载IOS版的百度地图SDK了。

http://developer.baidu.com/map/static/doc/BaiduMapApi_All_iOS_1.2.2.rar

3)在项目中引入SDK

解压百度地图SDK后,将得到inc、libs目录以及mapapi.bundle文件。其中inc存放了SDK可公开的头文件,真正实现的文件存放于libs下的静态库里(.a文件)。其中,inc目录下包含了Release-iphoneos和Release-iphonesimulator目录。顾明思义,前者指的是真实设备,而后者指的就是模拟器。读者可根据实际需要,将相应目录下的libbaidumapapi.a静态库文件拖入当前项目中。然后再拖入inc目录以及mapapi.bundle文件。完成上述操作后,还需要为项目额外添加一个链接标记(Other Linker Flags)。步骤如下。

选中项目,然后切换到"build settings"选项,依次找到inking->Other Linker flags配置项(可搜索),然后添加-all_load配置项。如下图所示(点击可打开)。


完成后,由于百度地图使用到了动画效果,所以还需要添加QuartzCore.framework框架。完成后就可以启动百度地图管理器了。

4)启动百度地图管理器

BMKMapManager类是百度地图的管理器类,只有成功实例化该类,地图才能够成功调用。这里将在AppDelegeate中实例化。

1
2
3
4
5
6
7
8
#import <UIKit/UIKit.h>
#import "ViewController1.h"
#import "BMapKit.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>{
     BMKMapManager *_bmkMapManager;
}
@property (strong, nonatomic) UIWindow *window;
@end

实例化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
     // Override point for customization after application launch.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
     _bmkMapManager = [[BMKMapManager alloc]init];
     if  (![_bmkMapManager start:@ "你申请的KEY"  generalDelegate:nil]) {
         NSLog(@ "密钥不对" );
     }
     self.window.backgroundColor = [UIColor whiteColor];
     ViewController1 *_v1Ctrl=[[ViewController1 alloc] init];
     self.window.rootViewController=_v1Ctrl;
     [_v1Ctrl release];
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
     [self.window makeKeyAndVisible];
     return  YES;
}


5)显示地图

BMKMapView类是一个地图视图类,直接实例化即可获得一个地图。

ViewController1.h

1
2
3
4
5
6
7
8
#import <UIKit/UIKit.h>
#import "BMapKit.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController1 : UIViewController{
     BMKMapView *_bmkMapView;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
}
@end

ViewController1.m

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- ( void )viewDidLoad
{
     [super viewDidLoad];
     // Do any additional setup after loading the view.
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
     _bmkMapView=[[BMKMapView alloc] init];
     _bmkMapView.frame=CGRectMake(0, 0, 320, 480);
     [_bmkMapView setMapType:BMKMapTypeSatellite];
     //[_bmkMapView setShowsUserLocation:YES];
     CLLocationCoordinate2D _location=CLLocationCoordinate2DMake(23.117441, 113.345763);
     //设置中心点
     [_bmkMapView setCenterCoordinate:_location];
     [self.view addSubview:_bmkMapView];
}


如上述代码所示,setShowsUserLocation方法是BMKMapView提供的一个自动获取地理位置信息的方法。我们也可以手动使用CLLocation类进行获取,也可以显式指定(可以在Google地图,或者http://cn.bing.com/maps/取得对应的纬经度)。在实际开发中要灵活应用。关于更多的地图类方法,可以参考百度官方的文档。

http://developer.baidu.com/map/sdkiosdev-2.htm


6)创建Object-C++文件

根据官方的解释,百度的静态库是基于Object-c++创建的,所以我们的项目需要编译方式需要修改为GC++(兼容C),可以在bulid选项中找到配置项,但更简单的方式是在项目中随便创建一个空类文件,然后将.m实现文件后缀名修改为.mm即可。


最终效果如下。



2、地理位置信息转码

我们还可以将得到的地理位置信息直接转换成容易理解的地址信息。IOS SDK本身就提供了CLLocation类,用于转换地理位置信息。同时,百度也提供了一个基于http请求的网址,只需要传递纬度及经度信息,即可得到丰富的地址信息。网址如下。

http://api.map.baidu.com/geocoder?location=纬度,经度&output=json&key=用户Key

支持的数据格式包括Json及XML。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值