源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-09-01 00:20 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:iOS开发中使用CoreLocation框架处理地理编码的方法
[b]一、简介[/b] 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(索罗门) [b]二、CoreLocation框架的使用[/b] 1.CoreLocation框架使用前提 (1)导入框架 [img]http://files.jb51.net/file_images/article/201512/20151225101427747.png?20151125101435[/img] 说明:在Xcode5以后,不再需要我们手动导入 (2)导入主头文件   
[u]复制代码[/u] 代码如下:
#import <CoreLocation/CoreLocation.h>
2.CoreLocation框架使用须知 CoreLocation框架中所有数据类型的前缀都是CL CoreLocation中使用CLLocationManager对象来做用户定位   [b]三、经纬度等地理信息扫盲[/b] 1.示意图 [img]http://files.jb51.net/file_images/article/201512/20151225101444971.png?20151125101456[/img] 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)部分城市的经纬度 [img]http://files.jb51.net/file_images/article/201512/20151225101510968.png?20151125101520[/img] [b]四、模拟位置[/b] 说明:在对程序进行测试的时候,设置手机模拟器的模拟位置(经纬度) [img]http://files.jb51.net/file_images/article/201512/20151225101650044.png?20151125101659[/img] [img]http://files.jb51.net/file_images/article/201512/20151225101708140.png?20151125101718[/img] [b]CoreLocation地理编码 一、简单说明[/b] CLGeocoder:地理编码器,其中Geo是地理的英文单词Geography的简写。 1.使用CLGeocoder可以完成“地理编码”和“反地理编码” 地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等) 反地理编码:根据给定的经纬度,获得具体的位置信息 (1)地理编码方法
[u]复制代码[/u] 代码如下:
  - (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;
(2)反地理编码方法
[u]复制代码[/u] 代码如下:
  - (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;
  2.CLGeocodeCompletionHandler   当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler [img]http://files.jb51.net/file_images/article/201512/20151225101730528.png?20151125101738[/img] 这个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; [b]二、代码示例:[/b] 在storyboard中搭建界面如下: [img]http://files.jb51.net/file_images/article/201512/20151225101747444.png?20151125101754[/img] 实现代码:
[u]复制代码[/u] 代码如下:
  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
[u]复制代码[/u] 代码如下:
@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)地理编码:(地名->经纬度坐标) [img]http://files.jb51.net/file_images/article/201512/20151225101817256.png?20151125101826[/img] 打印输出: [img]http://files.jb51.net/file_images/article/201512/20151225101928782.png?20151125101936[/img] (2)反地理编码:(经纬度—>地名) [img]http://files.jb51.net/file_images/article/201512/20151225101945462.png?20151125101953[/img] (3)注意:调整键盘 [img]http://files.jb51.net/file_images/article/201512/20151225102000450.png?2015112510208[/img] 点击经纬度textField进行输入的时候,弹出的键盘如下 [img]http://files.jb51.net/file_images/article/201512/20151225102021300.png?20151125102032[/img] (4)注意:搜索的所有结果都是在中国境内的,因为苹果在中国的地图服务商是高德地图。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部