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


本文向大家介绍iOS开发中使用CoreLocation框架处理地理编码的方法,包括了iOS开发中使用CoreLocation框架处理地理编码的方法的使用技巧和注意事项,需要的朋友参考一下

一、简介

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)导入框架

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

(2)导入主头文件

  

#import <CoreLocation/CoreLocation.h>

2.CoreLocation框架使用须知

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

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

 

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

1.示意图

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)部分城市的经纬度

四、模拟位置

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

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

打印输出:

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

(3)注意:调整键盘

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

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

声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#yiidian.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。