LocationCoder 地图经纬度解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介:

LocationCoder 地图经纬度解析

 

其实,在地图里面将地图解析成有意义的地址,或者把地址转换成有意义的经纬度都是很容易的事情,只是我将其封装了支持KVO,通知中心,block取结果,代理取结果而已.

能通过组合的方式来封装对象扩展功能就绝对不会用继承的方式来扩展功能,只有当组合解决不了问题时才会使用继承:).

源码:

LocationCoder.h + LocationCoder.m

//
//  LocationCoder.h
//
//  http://home.cnblogs.com/u/YouXianMing/
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@class LocationCoder;

#pragma mark - block
typedef void(^resultBlock_t)(NSArray *placemarks, NSError *error, LocationCoder *locationCoder);

#pragma mark - 代理
@protocol LocationCoderDelegate <NSObject>
@optional
- (void)resultForPlacemarks:(NSArray *)placemarks
                      error:(NSError *)error
              locationCoder:(LocationCoder *)locationCoder;
@end


@interface LocationCoder : NSObject

// 初始化时设定的值
@property (nonatomic, strong, readwrite) CLLocation    *location;            // 经纬度地址
@property (nonatomic, strong, readwrite) NSString      *addressString;       // 文字描述地址

// block方式取结果
@property (nonatomic, copy)              resultBlock_t  resultBlock;         // 结果的block

// 代理方式取结果
@property (nonatomic, assign)            id<LocationCoderDelegate> delegate; // 结果代理

// KVO方式取结果
@property (nonatomic, strong, readonly)  NSString      *changeFlag;          // 用于KVO
@property (nonatomic, strong, readonly)  NSArray       *placemarks;          // 结果

// 单个的结果
@property (nonatomic, assign, readonly)  CLLocationCoordinate2D  coordinate2D;      // 经纬度
@property (nonatomic, strong, readonly)  NSString               *addressLines;      // 完整的地址
@property (nonatomic, strong, readonly)  NSDictionary           *addressDictionary; // 地址字典

// 初始化
- (instancetype)initWithLocation:(CLLocation *)location;
- (instancetype)initWithAddressString:(NSString *)string;

// 开始分析
- (void)startAnalyseLocation;       // 分析经纬度地址
- (void)startAnalyseAddressString;  // 分析文字描述地址

@end


//
//  LocationCoder.m
//
//  http://home.cnblogs.com/u/YouXianMing/
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "LocationCoder.h"

@interface LocationCoder ()

@property (nonatomic, strong) CLGeocoder *geocoder;     // 解析器
@property (nonatomic, strong) NSArray    *placemarks;
@property (nonatomic, strong) NSString   *changeFlag;   // 用于KVO

@property (nonatomic, strong) NSString                *addressLines;      // 完整的地址
@property (nonatomic, assign) CLLocationCoordinate2D   coordinate2D;      // 经纬度
@property (nonatomic, strong) NSDictionary            *addressDictionary; // 地址字典

@end

@implementation LocationCoder

- (instancetype)init
{
    return [self initWithLocation:nil];
}

- (instancetype)initWithLocation:(CLLocation *)location
{
    self = [super init];
    if (self)
    {
        _location   = location;
        _geocoder   = [[CLGeocoder alloc] init];
        _changeFlag = @"YES";
    }
    
    return self;
}

- (instancetype)initWithAddressString:(NSString *)string
{
    self = [super init];
    if (self)
    {
        _addressString = string;
        _geocoder      = [[CLGeocoder alloc] init];
        _changeFlag    = @"YES";
    }
    
    return self;
}

- (void)startAnalyseLocation
{
    if (_location)
    {
        [_geocoder reverseGeocodeLocation:_location
                        completionHandler:^(NSArray *placemarks, NSError *error)
         {
             // KVO(只有使用了setter方法才能够通知KVO)
             if (error == nil)
             {
                 self.placemarks = placemarks;
                 
                 CLPlacemark *placemark = [placemarks objectAtIndex:0];
                 
                 // 获取地址字典
                 self.addressDictionary = placemark.addressDictionary;
                 
                 // 获取详细地址
                 self.addressLines = \
                 [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                 
                 // 获取2D坐标信息
                 self.coordinate2D = placemark.location.coordinate;
                 
                 // 通知KVO
                 self.changeFlag = @"RIGHT DATA";
             }
             else
             {
                 self.placemarks = nil;
                 self.changeFlag = @"ERROR DATA";
             }
             
             // block
             if (_resultBlock)
             {
                 _resultBlock(placemarks, error, self);
             }
             
             // 代理
             if (_delegate)
             {
                 [_delegate resultForPlacemarks:placemarks
                                          error:error
                                  locationCoder:self];
             }
         }];
    }
}

- (void)startAnalyseAddressString
{
    if (_addressString)
    {
        [_geocoder geocodeAddressString:_addressString
                      completionHandler:^(NSArray *placemarks, NSError *error) {
                          // KVO(只有使用了setter方法才能够通知KVO)
                          if (error == nil)
                          {
                              self.placemarks = placemarks;
                              
                              CLPlacemark *placemark = [placemarks objectAtIndex:0];
                              
                              // 获取地址字典
                              self.addressDictionary = placemark.addressDictionary;
                              
                              // 获取详细地址
                              self.addressLines = \
                              [[placemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "];
                              
                              // 获取2D坐标信息
                              self.coordinate2D = placemark.location.coordinate;
                              
                              // 通知KVO
                              self.changeFlag = @"RIGHT DATA";
                          }
                          else
                          {
                              self.placemarks = nil;
                              self.changeFlag = @"ERROR DATA";
                          }
                          
                          // block
                          if (_resultBlock)
                          {
                              _resultBlock(placemarks, error, self);
                          }
                          
                          // 代理
                          if (_delegate)
                          {
                              [_delegate resultForPlacemarks:placemarks
                                                       error:error
                                               locationCoder:self];
                          }
                      }];
    }
}

@end

block方式解析地址

代理方式解析地址

KVO方式解析

2014-05-26 08:57:29.808 MoreMapInfo[5911:60b] latitude = 39.906031

KVO都能写,通知中心就不用说了:).

 

试试将经纬度解析成地址信息-

看看是什么地方....

其实,本人写的经纬度地址是"中国国家博物馆",囧......

 

 

目录
相关文章
|
数据可视化 搜索推荐 JavaScript
数据可视化大屏百度地图区域掩膜MapMask实现地图指定区域非省市县行政区显示的实战案例解析(JavaScript API GL、个性化地图定制、指定区域经纬度拾取转化)
数据可视化大屏百度地图区域掩膜MapMask实现地图指定区域非省市县行政区显示的实战案例解析(JavaScript API GL、个性化地图定制、指定区域经纬度拾取转化)
939 0
|
4月前
|
数据可视化 定位技术 API
云解析地图作业问题之通过saveEffect实现组件联动如何解决
云解析地图作业问题之通过saveEffect实现组件联动如何解决
50 14
|
4月前
|
JavaScript 前端开发 定位技术
云解析地图作业问题之在搭建页面中简化数据筛选的过程如何解决
云解析地图作业问题之在搭建页面中简化数据筛选的过程如何解决
32 0
|
4月前
|
定位技术
Cesium案例解析(九)——Rotatable2DMap旋转2D地图
Cesium案例解析(九)——Rotatable2DMap旋转2D地图
101 0
|
4月前
|
编解码 定位技术
Cesium案例解析(七)——Layers在线地图服务
Cesium案例解析(七)——Layers在线地图服务
50 0
|
搜索推荐 数据可视化 JavaScript
数据可视化大屏百度地图绘制行政区域标注实战案例解析(个性化地图、标注、视频、控件、定位、检索)
数据可视化大屏百度地图绘制行政区域标注实战案例解析(个性化地图、标注、视频、控件、定位、检索)
214 1
|
移动开发 定位技术 API
手机端H5地图调起开发实战案例解析(百度高德腾讯地图调起、底部弹出层、提示安装地图导航APP)
手机端H5地图调起开发实战案例解析(百度高德腾讯地图调起、底部弹出层、提示安装地图导航APP)
562 0
|
搜索推荐 JavaScript 数据可视化
数据可视化大屏高德地图javascript webAPI开发的智慧治安物联网管理系统实战解析(web GIS、3D视图、个性化地图、标注、涟漪动画、自定义弹窗、3D控件)
数据可视化大屏高德地图javascript webAPI开发的智慧治安物联网管理系统实战解析(web GIS、3D视图、个性化地图、标注、涟漪动画、自定义弹窗、3D控件)
520 0
|
JavaScript 前端开发 定位技术
Vue 集成腾讯地图基础api Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)
Vue 集成腾讯地图基础api Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)
960 0
Vue 集成腾讯地图基础api  Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)
|
12天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
42 2

推荐镜像

更多
下一篇
无影云桌面