服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - iOS开发中使用CoreLocation框架处理地理编码的方法

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

2021-01-01 14:38文顶顶 IOS

这篇文章主要介绍了iOS开发中使用CoreLocation框架处理地理编码的方法,代码基于传统的Objective-C,需要的朋友可以参考下

一、简介

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框架处理地理编码的方法

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

(2)导入主头文件

  

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

2.CoreLocation框架使用须知

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

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

 

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

1.示意图

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

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框架处理地理编码的方法

四、模拟位置

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

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

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

 

 

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框架处理地理编码的方法

这个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框架处理地理编码的方法

实现代码:

复制代码 代码如下:


  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框架处理地理编码的方法

打印输出:

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

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

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

(3)注意:调整键盘

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

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

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

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

延伸 · 阅读

精彩推荐
  • IOS详解iOS中多个网络请求的同步问题总结

    详解iOS中多个网络请求的同步问题总结

    这篇文章主要介绍了详解iOS中多个网络请求的同步问题总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    liang199111302021-03-15
  • IOSiOS开发技巧之状态栏字体颜色的设置方法

    iOS开发技巧之状态栏字体颜色的设置方法

    有时候我们需要根据不同的背景修改状态栏字体的颜色,下面这篇文章主要给大家介绍了关于iOS开发技巧之状态栏字体颜色的设置方法,文中通过示例代码...

    梦想家-mxj8922021-05-10
  • IOSiOS自定义UICollectionViewFlowLayout实现图片浏览效果

    iOS自定义UICollectionViewFlowLayout实现图片浏览效果

    这篇文章主要介绍了iOS自定义UICollectionViewFlowLayout实现图片浏览效果的相关资料,需要的朋友可以参考下...

    jiangamh8882021-01-11
  • IOSiOS中MD5加密算法的介绍和使用

    iOS中MD5加密算法的介绍和使用

    MD5加密是最常用的加密方法之一,是从一段字符串中通过相应特征生成一段32位的数字字母混合码。对输入信息生成唯一的128位散列值(32个字符)。这篇文...

    LYSNote5432021-02-04
  • IOSiOS开发之视图切换

    iOS开发之视图切换

    在iOS开发中视图的切换是很频繁的,独立的视图应用在实际开发过程中并不常见,除非你的应用足够简单。在iOS开发中常用的视图切换有三种,今天我们将...

    执着丶执念5272021-01-16
  • IOSiOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)

    iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和

    这篇文章主要介绍了iOS中滑动控制屏幕亮度和系统音量(附加AVAudioPlayer基本用法和Masonry简单使用)的相关资料,需要的朋友可以参考下...

    CodingFire13652021-02-26
  • IOSiOS中UILabel实现长按复制功能实例代码

    iOS中UILabel实现长按复制功能实例代码

    在iOS开发过程中,有时候会用到UILabel展示的内容,那么就设计到点击UILabel复制它上面展示的内容的功能,也就是Label长按复制功能,下面这篇文章主要给大...

    devilx12792021-04-02
  • IOSiOS实现控制屏幕常亮不变暗的方法示例

    iOS实现控制屏幕常亮不变暗的方法示例

    最近在工作中遇到了要将iOS屏幕保持常亮的需求,所以下面这篇文章主要给大家介绍了关于利用iOS如何实现控制屏幕常亮不变暗的方法,文中给出了详细的...

    随风13332021-04-02