地理反编码的实现

一:效果

输入经纬度,可以得到相应的地名

二:思路

跟地里编码差不多

1.获取用户输入的经纬度

2.根据用户输入的经纬度创建CLLocation对象

3.根据CLLocation对象获取对应的地标信息

三:代码

<code class="hljs objectivec has-numbering"><span class="hljs-preprocessor">#import <span class="hljs-title">"ViewController.h"</span></span>
<span class="hljs-preprocessor">#import <span class="hljs-title"><CoreLocation/CoreLocation.h></span></span>

<span class="hljs-class"><span class="hljs-keyword">@interface</span> <span class="hljs-title">ViewController</span> ()</span>
<span class="hljs-comment">/**
 *  地理编码对象
 */</span>
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span> ,<span class="hljs-keyword">strong</span>) CLGeocoder *geocoder;

<span class="hljs-preprocessor">#pragma mark - 反地理编码</span>
- (<span class="hljs-keyword">IBAction</span>)reverseGeocode;

<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">weak</span>, <span class="hljs-keyword">nonatomic</span>) <span class="hljs-keyword">IBOutlet</span> UITextField *longtitudeField;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">weak</span>, <span class="hljs-keyword">nonatomic</span>) <span class="hljs-keyword">IBOutlet</span> UITextField *latitudeField;
<span class="hljs-keyword">@property</span> (<span class="hljs-keyword">weak</span>, <span class="hljs-keyword">nonatomic</span>) <span class="hljs-keyword">IBOutlet</span> <span class="hljs-built_in">UILabel</span> *reverseDetailAddressLabel;

<span class="hljs-keyword">@end</span>

<span class="hljs-class"><span class="hljs-keyword">@implementation</span> <span class="hljs-title">ViewController</span></span>

- (<span class="hljs-keyword">void</span>)reverseGeocode
{
    <span class="hljs-comment">// 1.获取用户输入的经纬度</span>
    <span class="hljs-built_in">NSString</span> *longtitude = <span class="hljs-keyword">self</span><span class="hljs-variable">.longtitudeField</span><span class="hljs-variable">.text</span>;
    <span class="hljs-built_in">NSString</span> *latitude = <span class="hljs-keyword">self</span><span class="hljs-variable">.latitudeField</span><span class="hljs-variable">.text</span>;
    <span class="hljs-keyword">if</span> (longtitude<span class="hljs-variable">.length</span> == <span class="hljs-number">0</span> ||
        longtitude == <span class="hljs-literal">nil</span> ||
        latitude<span class="hljs-variable">.length</span> == <span class="hljs-number">0</span> ||
        latitude == <span class="hljs-literal">nil</span>) {
        <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"请输入经纬度"</span>);
        <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-comment">// 2.根据用户输入的经纬度创建CLLocation对象</span>
    CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude doubleValue]  longitude:[longtitude doubleValue]];

    <span class="hljs-comment">// 3.根据CLLocation对象获取对应的地标信息</span>
    [<span class="hljs-keyword">self</span><span class="hljs-variable">.geocoder</span> reverseGeocodeLocation:location completionHandler:^(<span class="hljs-built_in">NSArray</span> *placemarks, <span class="hljs-built_in">NSError</span> *error) {

        <span class="hljs-keyword">for</span> (CLPlacemark *placemark in placemarks) {
            <span class="hljs-built_in">NSLog</span>(@<span class="hljs-string">"%@ %@ %f %f"</span>, placemark<span class="hljs-variable">.name</span>, placemark<span class="hljs-variable">.addressDictionary</span>, placemark<span class="hljs-variable">.location</span><span class="hljs-variable">.coordinate</span><span class="hljs-variable">.latitude</span>, placemark<span class="hljs-variable">.location</span><span class="hljs-variable">.coordinate</span><span class="hljs-variable">.longitude</span>);
            <span class="hljs-keyword">self</span><span class="hljs-variable">.reverseDetailAddressLabel</span><span class="hljs-variable">.text</span> = placemark<span class="hljs-variable">.locality</span>;
        }
    }];
}

<span class="hljs-preprocessor">#pragma mark - 懒加载</span>
- (CLGeocoder *)geocoder
{
    <span class="hljs-keyword">if</span> (!_geocoder) {
        _geocoder = [[CLGeocoder alloc] init];
    }
    <span class="hljs-keyword">return</span> _geocoder;
}

<span class="hljs-keyword">@end</span></code>

四:知识扩充CLGeocoder

使用CLGeocoder可以完成“地理编码”和“反地理编码”

地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)

反地理编码:根据给定的经纬度,获得具体的位置信息

>地理编码方法

<code class="hljs erlang has-numbering"><span class="hljs-pp">- <span class="hljs-params">(void)</span>geocodeAddressString:<span class="hljs-params">(<span class="hljs-variable">NSString</span> *)</span>addressString completionHandler:<span class="hljs-params">(<span class="hljs-variable">CLGeocodeCompletionHandler</span>)</span>completionHandler;</span></code>

>反地理编码方法

<code class="hljs erlang has-numbering"><span class="hljs-pp">- <span class="hljs-params">(void)</span>reverseGeocodeLocation:<span class="hljs-params">(<span class="hljs-variable">CLLocation</span> *)</span>location completionHandler:<span class="hljs-params">(<span class="hljs-variable">CLGeocodeCompletionHandler</span>)</span>completionHandler;</span></code>

CLGeocodeCompletionHandler

当地理\反地理编码完成时,就会调用

<code class="hljs objectivec has-numbering">CLGeocodeCompletionHandler <span class="hljs-keyword">typedef</span> <span class="hljs-keyword">void</span> (^CLGeocodeCompletionHandler)(<span class="hljs-built_in">NSArray</span> *placemarks, <span class="hljs-built_in">NSError</span> *error);</code>

这个block传递2个参数

error :当编码出错时(比如编码不出具体的信息)有值

placemarks :里面装着CLPlacemark对象

CLPlacemark

CLPlacemark的字面意思是地标,封装详细的地址位置信息

地理位置

<code class="hljs objectivec has-numbering"><span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">readonly</span>) CLLocation *location;</code>

区域

<code class="hljs objectivec has-numbering"><span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">readonly</span>) CLRegion *region;</code>

详细的地址信息

<code class="hljs objectivec has-numbering"><span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">readonly</span>) <span class="hljs-built_in">NSDictionary</span> *addressDictionary;</code>

地址名称

<code class="hljs objectivec has-numbering"><span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">readonly</span>) <span class="hljs-built_in">NSString</span> *name;</code>

城市

<code class="hljs objectivec has-numbering"><span class="hljs-keyword">@property</span> (<span class="hljs-keyword">nonatomic</span>, <span class="hljs-keyword">readonly</span>) <span class="hljs-built_in">NSString</span> *locality;</code>

结构图

时间: 2024-10-19 07:48:44

地理反编码的实现的相关文章

objective-c开发——地图定位之地理编码和地理反编码

我们平时做地图定位,主要是靠经纬度来准确定位某个位置. 但是,我们是人啊,我们不是卫星啊. 用户在地图上查一个地方,我们总不能告诉他,这个地方是东经多少度,北纬多少度吧. 咱们好歹得告诉人家个地名不是? 这就是我们今天说的地理编码和地理反编码. 地理编码:你说个地名,比如“西湖”,我们给你返回它的经纬度,然后你通过查出来的这个经纬度去定位 反地理编码:我告诉你一个经纬度,你通过经度纬度返回地名.最好在插个大头针在地图上就更好了,啥叫大头针,咱们以后再说. 首先,我的界面是这个样纸的,就是两个按钮

地理编码和地理反编码

#import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController : UIViewController<CLLocationManagerDelegate> { CLLocationManager *_locationManager; CLGeocoder *_geocoder; } @property (strong, nonatomic) IBOutlet

iOS 定位于地理反编码

- (void)viewDidLoad { [self startLocation]; } //开始定位 -(void)startLocation{ self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; [self.locationManager requestWhenInUseAuthorization]; if ([[[UIDevice currentDev

iOS地理反地理编码--CoreLocation

.sidebar{float:left;width:220px;} .container-fluid>.content{margin-left:240px;} a{color:#0069d6;text-decoration:none;line-height:inherit;font-weight:inherit;}a:hover{color:#00438a;text-decoration:underline;} .pull-right{float:right;} .pull-left{float

ios地理信息反编码

通过定位我们可以获得经度和纬度,通过地理信息反编码可以通过地理坐标返回某个地点的相关文字描述.这些描述封装在CLPlacemark类中,它的属性为:1)addressDictionary,地理信息字典2)ISOcountryCode,ISO国家代号3)Country,国家信息4)postalCode,邮政编码5)adminisrativeArea,行政区域信息6)locality,指定城市信息个人认为,字典中存储的值 跟 CLPlacemark中其它的属性的值是相同的. 地理信息反编码使用CLG

定位- CLGeoencoder - 反编码

#import "ViewController.h" #import "MBProgressHUD+MJ.h" #import <CoreLocation/CoreLocation.h> @interface ViewController () @property (nonatomic, strong) CLGeocoder *geocoder; // 编码对象 @property (weak, nonatomic) IBOutlet UILabel *

iOS定位服务与地图开发(2)---地理信息反编码

上节我们通过定位获取了经度和纬度数值,但是一般人很难看懂这些数字. 地理信息反编码:就是根据这些经纬数字返回地点的相关文字描述信息,这些文字描述信息被封装在CLPlacemark类中,我们称这个类为"地标"类. 地理信息反编码使用CLGeocoder类实现,这个类能够实现在地理坐标与地理文字描述信息之间的转换. CLGeocoder类中进行地理信息反编码的方法是:reverseGeocodeLocation: completionHandler: location:是要定位的地理位置对

地图定位CoreLocation框架,地理位置编码与反编码

在现代互联网时代,越来越多的应用,都用到了地图定位功能,在iOS开发中,想要加入这种功能,必须基于两个框架进行开发: 1.Map Kit:用于显示地图, 2.CoreLocation:用于显示地理位置 这里我们简单了解一下CoreLocation,用于显示地理位置,坐标信息. 一.相关类介绍 CLLocationManager.用于定位服务管理类,它能够给我们提供位置信息和高度信息,也可以监控设备进入或离开某个区域,还可以获得设备的运行方向. CLLocation.封装了位置和高度信息. CLL

iOS学习_地图_定位和编码与反编码

定位: 引入头文件  #import <CoreLocation/CoreLocation.h>声明管理器属性:@property(nonatomic,strong)CLLocationManager *manager;第一步:初始化管理器self.manager = [[CLLocationManager alloc] init];第二步:进行隐私的判断并授权 //进行隐私的判断 if (![CLLocationManager locationServicesEnabled]) { NSLo