用百度地图
发表: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。