百度地图使用地理编码与反地址编码


1、地理编码指的是将地址位置(中文地址)转换成经纬度,反地址编码指的是将经纬度转换成地址位置;

2、在百度地图中需要用到三个关键性的类:BMKGeoCodeSearch、BMKGeoCodeSearchOption、BMKReverseGeoCodeOption;

3、BMKGeoCodeSearch:地理编码主类,用来查询、返回结果信息(地址位置或经纬度);

4、BMKGeoCodeSearchOption:地理编码选项,即地理编码的数据模型,地址是通过该类传递进去的;

5、BMKReverseGeoCodeOption:反地理编码选项,即反地理编码的数据模型,经纬度就是通过该类传递进去的;

6、有了以上基本信息,开始做一个简单的示例:从手机页面上输入经纬度通过按钮事件将对应的地理位置输出到手机屏幕,反之亦然;

7、基本UI视图如下所示:
 

8、关键代码:
//
//  SAViewController.m
//  MapDemo
//
//  Created by Sian on 14/11/13.
//  Copyright (c) 2014年 Sian. All rights reserved.
//
 
#import "SAViewController.h"
#import "BMapKit.h"
 
@interface SAViewController () <BMKGeoCodeSearchDelegate>
 
@property ( nonatomic , strong) BMKGeoCodeSearch *geoCode;        // 地理编码
 
@property (weak, nonatomic ) IBOutlet UITextField *longitude;    // 经度输入
@property (weak, nonatomic ) IBOutlet UITextField *latitude;     // 纬度输入
@property (weak, nonatomic ) IBOutlet UILabel *address;          // 位置输出
 
@property (weak, nonatomic ) IBOutlet UITextField *inputAddress; // 地址输入
@property (weak, nonatomic ) IBOutlet UILabel *location;         // 经纬输出
 
// 地址输出事件
- ( IBAction )outputAdd;
// 经纬度输出事件
- ( IBAction )outputLocation;
@end
 
@implementation SAViewController
 
- ( void )viewDidLoad
{
     [ super viewDidLoad];
}
 
#pragma mark geoCode的Get方法,实现延时加载
- (BMKGeoCodeSearch *)geoCode
{
     if (!_geoCode) {
         _geoCode = [[BMKGeoCodeSearch alloc] init];
         _geoCode.delegate = self ;
     }
     return _geoCode;
}
 
#pragma mark 点击空白处隐藏键盘
- ( void )touchesBegan:( NSSet *)touches withEvent:(UIEvent *)event
{
     [ self .view endEditing: YES ];
}
 
#pragma mark 获取地理位置按钮事件
- ( IBAction )outputAdd
{
     // 初始化反地址编码选项(数据模型)
     BMKReverseGeoCodeOption *option = [[BMKReverseGeoCodeOption alloc] init];
     // 将TextField中的数据传到反地址编码模型
     option.reverseGeoPoint = CLLocationCoordinate2DMake([ self .latitude.text floatValue], [ self .longitude.text floatValue]);
     NSLog ( @"%f - %f" , option.reverseGeoPoint.latitude, option.reverseGeoPoint.longitude);
     // 调用反地址编码方法,让其在代理方法中输出
     [ self .geoCode reverseGeoCode:option];
}
 
#pragma mark 获取经纬度按钮事件
- ( IBAction )outputLocation
{
     // 初始化地址编码选项(数据模型)
     BMKGeoCodeSearchOption *option = [[BMKGeoCodeSearchOption alloc] init];
     // 将TextField中的数据传到地址编码模型
     option.address = self .inputAddress.text;
     NSLog ( @"%@" , option.address);
     // 调用地址编码方法,让其在代理方法中输出
     [ self .geoCode geoCode:option];
}
 
#pragma mark 代理方法返回反地理编码结果
- ( void )onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
     if (result) {
         self .address.text = [ NSString stringWithFormat: @"%@" , result.address];
         NSLog ( @"%@ - %@" , result.address, result.addressDetail.streetNumber);
     } else {
         self .address.text = @"找不到相对应的位置信息" ;
     }
}
 
#pragma mark 代理方法返回地理编码结果
- ( void )onGetGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKGeoCodeResult *)result errorCode:(BMKSearchErrorCode)error
{
     if (result) {
         self .location.text = [ NSString stringWithFormat: @"经度为:%.2f   纬度为:%.2f" , result.location.longitude, result.location.latitude];
         NSLog ( @"%@" , result.address);
     } else {
         self .location.text = @"找不到相对应的位置" ;
     }
}
@end

猜你喜欢

转载自blog.csdn.net/yidu_blog/article/details/51452994