广

IOS开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-05 08:32:49 次阅读 稿源:互联网
    零七广告

    一、简介

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

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告