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文件
//
// YYViewController.m
// 19-地理编码
//
// Created by apple on 14-8-11.
// Copyright (c) 2014年 yangyong. All rights reserved.
// #import "YYViewController.h"
#import <CoreLocation/CoreLocation.h> @interface YYViewController ()
@property(nonatomic,strong)CLGeocoder *geocoder;
#pragma mark-地理编码
- (IBAction)geocode;
@property (weak, nonatomic) IBOutlet UITextField *addressField;
@property (weak, nonatomic) IBOutlet UILabel *longitudeLabel;
@property (weak, nonatomic) IBOutlet UILabel *latitudeLabel;
@property (weak, nonatomic) IBOutlet UILabel *detailAddressLabel; #pragma mark-反地理编码 - (IBAction)reverseGeocode;
@property (weak, nonatomic) IBOutlet UITextField *longitudeField;
@property (weak, nonatomic) IBOutlet UITextField *latitudeField;
@property (weak, nonatomic) IBOutlet UILabel *reverdeDetailAddressLabel;
@end @implementation YYViewController #pragma mark-懒加载
-(CLGeocoder *)geocoder
{
if (_geocoder==nil) {
_geocoder=[[CLGeocoder alloc]init];
}
return _geocoder;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
/**
* 地理编码:地名—>经纬度坐标
*/
- (IBAction)geocode {
//1.获得输入的地址
NSString *address=self.addressField.text;
if (address.length==) return; //2.开始地理编码
//说明:调用下面的方法开始编码,不管编码是成功还是失败都会调用block中的方法
[self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
//如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到
if (error || placemarks.count==) {
self.detailAddressLabel.text=@"你输入的地址没找到,可能在月球上";
}else // 编码成功,找到了具体的位置信息
{
//打印查看找到的所有的位置信息
/*
name:名称
locality:城市
country:国家
postalCode:邮政编码
*/
for (CLPlacemark *placemark in placemarks) {
NSLog(@"name=%@ locality=%@ country=%@ postalCode=%@",placemark.name,placemark.locality,placemark.country,placemark.postalCode);
} //取出获取的地理信息数组中的第一个显示在界面上
CLPlacemark *firstPlacemark=[placemarks firstObject];
//详细地址名称
self.detailAddressLabel.text=firstPlacemark.name;
//纬度
CLLocationDegrees latitude=firstPlacemark.location.coordinate.latitude;
//经度
CLLocationDegrees longitude=firstPlacemark.location.coordinate.longitude;
self.latitudeLabel.text=[NSString stringWithFormat:@"%.2f",latitude];
self.longitudeLabel.text=[NSString stringWithFormat:@"%.2f",longitude];
}
}];
} /**
* 反地理编码:经纬度坐标—>地名
*/
- (IBAction)reverseGeocode {
//1.获得输入的经纬度
NSString *longtitudeText=self.longitudeField.text;
NSString *latitudeText=self.latitudeField.text;
if (longtitudeText.length==||latitudeText.length==) return; CLLocationDegrees latitude=[latitudeText doubleValue];
CLLocationDegrees longitude=[longtitudeText doubleValue]; CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
//2.反地理编码
[self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
if (error||placemarks.count==) {
self.reverdeDetailAddressLabel.text=@"你输入的地址没找到,可能在月球上";
}else//编码成功
{
//显示最前面的地标信息
CLPlacemark *firstPlacemark=[placemarks firstObject];
self.reverdeDetailAddressLabel.text=firstPlacemark.name;
//经纬度
CLLocationDegrees latitude=firstPlacemark.location.coordinate.latitude;
CLLocationDegrees longitude=firstPlacemark.location.coordinate.longitude;
self.latitudeField.text=[NSString stringWithFormat:@"%.2f",latitude];
self.longitudeField.text=[NSString stringWithFormat:@"%.2f",longitude];
}
}];
} -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.view endEditing:YES];
}
@end
实现效果:
(1)地理编码:(地名->经纬度坐标)

打印输出:

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

(3)注意:调整键盘

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

(4)注意:搜索的所有结果都是在中国境内的,因为苹果在中国的地图服务商是高德地图。
iOS开发拓展篇—CoreLocation地理编码的更多相关文章
- iOS开发拓展篇—CoreLocation简单介绍
iOS开发拓展篇—CoreLocation简单介绍 一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 ...
- iOS开发拓展篇—CoreLocation定位服务
iOS开发拓展篇—CoreLocation定位服务 一.简单说明 1.CLLocationManager CLLocationManager的常用操作和属性 开始用户定位- (void)startUp ...
- iOS开发拓展篇—静态库
iOS开发拓展篇—静态库 一.简单介绍 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的分类 根据源代码的公开情况,库可以分为2种类型 (1)开源库 公开源代码,能看到具体实现 ...
- iOS开发拓展篇—UIDynamic(简单介绍)
iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能模拟 ...
- iOS开发拓展篇—UIDynamic(重力行为+碰撞检测)
iOS开发拓展篇—UIDynamic(重力行为+碰撞检测) 一.重力行为 说明:给定重力方向.加速度,让物体朝着重力方向掉落 1.方法 (1)UIGravityBehavior的初始化 - (inst ...
- iOS开发拓展篇—UIDynamic(捕捉行为)
iOS开发拓展篇—UIDynamic(捕捉行为) 一.简介 可以让物体迅速冲到某个位置(捕捉位置),捕捉到位置之后会带有一定的震动 UISnapBehavior的初始化 - (instancetype ...
- iOS开发拓展篇—音效的播放
iOS开发拓展篇—音效的播放 一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中 ...
- iOS开发拓展篇—音乐的播放
iOS开发拓展篇—音乐的播放 一.简单说明 音乐播放用到一个叫做AVAudioPlayer的类,这个类可以用于播放手机本地的音乐文件. 注意: (1)该类(AVAudioPlayer)只能用于播放本地 ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
随机推荐
- Groovy学习笔记(二)
在上一篇文章中我们主要学习了如何搭建Groovy开发环境,为我们的Groovy之旅做好了准备工作,不知道你是否准备好了?接下来我们就一起看看Groovy与我们熟悉的Java有什么异同. Groovy是 ...
- js子窗体、父窗体方法互调
var childWindow = $("#editFrame")[0].contentWindow;//获取子窗体的window对象. childWindow.subForm() ...
- s3c2440 移值u-boot-2016.03 第5篇 支持dm9000 识别
1, 通过查看 /drivers/net/Makefile 发现想要编译上,需要添加宏 /include/configs/smdk2440.h 中添加 #define CONFIG_DRIVER_DM ...
- android获取状态栏高度
获取android屏幕上状态栏的高度方法网上很多这里不再敖述,只举一个例子 Rect rect = new Rect();getWindow().getDecorView().getWindowVis ...
- 回传数据startActivityForResult()
1.调用者Activity01开启新的界面选用startActivityForResult(intent,requestCode);在Activity01中Intent intent=new Inte ...
- (原创) cocos2dx使用Curl连接网络(客户端)
0. 环境: winxpsp3, vs2010, cocos2dx@2.1.4 1. 新建一个Helloworld工程 2. HelloworldScene.h里面重写virtual bool ccT ...
- 使用GIt向github上传代码
github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.这对于一般人来说公共仓库就已经足够了. 1.注册账户以及创建仓库 要想 ...
- python time模块
time模块 (有效时间1970-2038) (1)本地时间 (2)时间戳 (3)延时 time.localtime([secs]) #struct_time time.time() #timesta ...
- Django migrations 重命名
1:如果migrations文件中想要重命名文件,重命名后有一次修改models文件,再次执行python makegirations ******,再次执行migrate的时候发现报错了,在我往后的 ...
- 手机号码归属地查询api接口
淘宝网 API地址: http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443 参数: tel:手机号码 返回:JSON ...