zoukankan      html  css  js  c++  java
  • 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)注意:搜索的所有结果都是在中国境内的,因为苹果在中国的地图服务商是高德地图。

  • 相关阅读:
    韩式英语
    Daily dictation 听课笔记
    words with same pronunciation
    you will need to restart eclipse for the changes to take effect. would you like to restart now?
    glottal stop(britain fountain mountain)
    education 的发音
    第一次用Matlab 的lamada语句
    SVN的switch命令
    String的split
    SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
  • 原文地址:https://www.cnblogs.com/seth-chen/p/4398429.html
Copyright © 2011-2022 走看看