iOS开发-地图定位 CoreLocation地理编码

iOS开发拓展篇—CoreLocation地理编码

一、简单说明

CLGeocoder:地理编码器,其中Geo是地理的英文单词Geography的简写。

1.使用CLGeocoder可以完成“地理编码”和“反地理编码”

地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)

反地理编码:根据给定的经纬度,获得具体的位置信息

 

(1)地理编码方法

  - (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler; 

(2)反地理编码方法

  - (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

 

2.CLGeocodeCompletionHandler

  当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler

  

这个block传递2个参数

error :当编码出错时(比如编码不出具体的信息)有值

placemarks :里面装着CLPlacemark对象

 

3.CLPlacemark

说明:CLPlacemark的字面意思是地标,封装详细的地址位置信息

地理位置     @property (nonatomic, readonly) CLLocation *location;  

区域       @property (nonatomic, readonly) CLRegion *region;

详细的地址信息   @property (nonatomic, readonly) NSDictionary *addressDictionary;

地址名称    @property (nonatomic, readonly) NSString *name;

城市      @property (nonatomic, readonly) NSString *locality;

 

二、代码示例:

在storyboard中搭建界面如下:

  

实现代码:

  YYViewController.m文件

复制代码
  1 //
  2 //  YYViewController.m
 3 // 19-地理编码  4 //  5 // Created by apple on 14-8-11.  6 // Copyright (c) 2014年 yangyong. All rights reserved.  7 //  8  9 #import "YYViewController.h"  10 #import <CoreLocation/CoreLocation.h>  11  12 @interface YYViewController ()  13 @property(nonatomic,strong)CLGeocoder *geocoder;  14 #pragma mark-地理编码  15 - (IBAction)geocode;  16 @property (weak, nonatomic) IBOutlet UITextField *addressField;  17 @property (weak, nonatomic) IBOutlet UILabel *longitudeLabel;  18 @property (weak, nonatomic) IBOutlet UILabel *latitudeLabel;  19 @property (weak, nonatomic) IBOutlet UILabel *detailAddressLabel;  20  21 #pragma mark-反地理编码  22  23 - (IBAction)reverseGeocode;  24 @property (weak, nonatomic) IBOutlet UITextField *longitudeField;  25 @property (weak, nonatomic) IBOutlet UITextField *latitudeField;  26 @property (weak, nonatomic) IBOutlet UILabel *reverdeDetailAddressLabel;  27 @end  28  29 @implementation YYViewController  30  31 #pragma mark-懒加载  32 -(CLGeocoder *)geocoder  33 {  34 if (_geocoder==nil) {  35 _geocoder=[[CLGeocoder alloc]init];  36  }  37 return _geocoder;  38 }  39 - (void)viewDidLoad  40 {  41  [super viewDidLoad];  42 }  43 /**  44  * 地理编码:地名—>经纬度坐标  45 */  46 - (IBAction)geocode {  47 //1.获得输入的地址  48 NSString *address=self.addressField.text;  49 if (address.length==0) return;  50  51 //2.开始地理编码  52 //说明:调用下面的方法开始编码,不管编码是成功还是失败都会调用block中的方法  53 [self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {  54 //如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到  55 if (error || placemarks.count==0) {  56 self.detailAddressLabel.text=@"你输入的地址没找到,可能在月球上";  57 }else // 编码成功,找到了具体的位置信息  58  {  59 //打印查看找到的所有的位置信息  60 /*  61  name:名称  62  locality:城市  63  country:国家  64  postalCode:邮政编码  65 */  66 for (CLPlacemark *placemark in placemarks) {  67 NSLog(@"name=%@ locality=%@ country=%@ postalCode=%@",placemark.name,placemark.locality,placemark.country,placemark.postalCode);  68  }  69  70 //取出获取的地理信息数组中的第一个显示在界面上  71 CLPlacemark *firstPlacemark=[placemarks firstObject];  72 //详细地址名称  73 self.detailAddressLabel.text=firstPlacemark.name;  74 //纬度  75 CLLocationDegrees latitude=firstPlacemark.location.coordinate.latitude;  76 //经度  77 CLLocationDegrees longitude=firstPlacemark.location.coordinate.longitude;  78 self.latitudeLabel.text=[NSString stringWithFormat:@"%.2f",latitude];  79 self.longitudeLabel.text=[NSString stringWithFormat:@"%.2f",longitude];  80  }  81 }]; 82 } 83 84 /** 85 * 反地理编码:经纬度坐标—>地名 86 */ 87 - (IBAction)reverseGeocode { 88 //1.获得输入的经纬度 89 NSString *longtitudeText=self.longitudeField.text; 90 NSString *latitudeText=self.latitudeField.text; 91 if (longtitudeText.length==0||latitudeText.length==0) return; 92 93 CLLocationDegrees latitude=[latitudeText doubleValue]; 94 CLLocationDegrees longitude=[longtitudeText doubleValue]; 95 96 CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude]; 97 //2.反地理编码 98 [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { 99 if (error||placemarks.count==0) { 100 self.reverdeDetailAddressLabel.text=@"你输入的地址没找到,可能在月球上"; 101 }else//编码成功 102 { 103 //显示最前面的地标信息 104 CLPlacemark *firstPlacemark=[placemarks firstObject]; 105 self.reverdeDetailAddressLabel.text=firstPlacemark.name; 106 //经纬度 107 CLLocationDegrees latitude=firstPlacemark.location.coordinate.latitude; 108 CLLocationDegrees longitude=firstPlacemark.location.coordinate.longitude; 109 self.latitudeField.text=[NSString stringWithFormat:@"%.2f",latitude]; 110 self.longitudeField.text=[NSString stringWithFormat:@"%.2f",longitude]; 111 } 112 }]; 113 } 114 115 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 116 { 117 [self.view endEditing:YES]; 118 } 119 @end
复制代码

 

实现效果:

(1)地理编码:(地名->经纬度坐标)

  

打印输出:

  

(2)反地理编码:(经纬度—>地名)

   

(3)注意:调整键盘

  

  点击经纬度textField进行输入的时候,弹出的键盘如下

  

(4)注意:搜索的所有结果都是在中国境内的,因为苹果在中国的地图服务商是高德地图。

转载于:https://www.cnblogs.com/dingjianjaja/p/5019421.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值