iOS开发中使用CoreLocation框架处理地理编码的方法
iOS开发中使用CoreLocation框架处理地理编码的方法
发布时间:2016-12-28 来源:查字典编辑
摘要:一、简介1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如(1)导航:去任意陌生的地方(2)周边:找餐馆、找酒店、找银行、找电影...

一、简介

1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如

(1)导航:去任意陌生的地方

(2)周边:找餐馆、找酒店、找银行、找电影院

2.在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发

(1)Map Kit :用于地图展示

(2)Core Location :用于地理定位

3.两个热门专业术语

(1)LBS :Location Based Service(基于定位的服务)

(2)SoLoMo :Social Local Mobile(索罗门)

二、CoreLocation框架的使用

1.CoreLocation框架使用前提

(1)导入框架

iOS开发中使用CoreLocation框架处理地理编码的方法1

说明:在Xcode5以后,不再需要我们手动导入

(2)导入主头文件

复制代码 代码如下:#import <CoreLocation/CoreLocation.h>

2.CoreLocation框架使用须知

CoreLocation框架中所有数据类型的前缀都是CL

CoreLocation中使用CLLocationManager对象来做用户定位

三、经纬度等地理信息扫盲

1.示意图

iOS开发中使用CoreLocation框架处理地理编码的方法2

2.本初子午线:穿过英国伦敦格林文治天文台

往东边(右边)走,是东经(E)

往西边(左边)走,是西经(W)

东西经各180°,总共360°

3.赤道:零度维度

往北边(上边)走,是北纬(N)

往南边(下边)走,是南纬(S)

南北纬各90°,总共180°

提示:横跨经度纬度越大(1° ≈ 111km),表示的范围就越大,在地图上看到的东西就越小

4.我国的经纬度:

(1)中国的经纬度范围

纬度范围:N 3°51′ ~ N 53°33′

经度范围:E 73°33′ ~ E 135°05′

(2)部分城市的经纬度

iOS开发中使用CoreLocation框架处理地理编码的方法3

四、模拟位置

说明:在对程序进行测试的时候,设置手机模拟器的模拟位置(经纬度)

iOS开发中使用CoreLocation框架处理地理编码的方法4

iOS开发中使用CoreLocation框架处理地理编码的方法5

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

iOS开发中使用CoreLocation框架处理地理编码的方法6

这个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中搭建界面如下:

iOS开发中使用CoreLocation框架处理地理编码的方法7

实现代码:

复制代码 代码如下:

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==0) return;

//2.开始地理编码

//说明:调用下面的方法开始编码,不管编码是成功还是失败都会调用block中的方法

[self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {

//如果有错误信息,或者是数组中获取的地名元素数量为0,那么说明没有找到

if (error || placemarks.count==0) {

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==0||latitudeText.length==0) 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==0) {

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)地理编码:(地名->经纬度坐标)

iOS开发中使用CoreLocation框架处理地理编码的方法8

打印输出:

iOS开发中使用CoreLocation框架处理地理编码的方法9

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

iOS开发中使用CoreLocation框架处理地理编码的方法10

(3)注意:调整键盘

iOS开发中使用CoreLocation框架处理地理编码的方法11

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

iOS开发中使用CoreLocation框架处理地理编码的方法12

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

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新IOS开发学习
热门IOS开发学习
编程开发子分类