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:]; // 获取地址字典
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:]; // 获取地址字典
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都能写,通知中心就不用说了:).

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

看看是什么地方....

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

LocationCoder 地图经纬度解析的更多相关文章

  1. 谷歌地图地理解析和反解析geocode.geocoder详解

    地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...

  2. 谷歌地图地理解析和反解析geocode.geocoder详解(转)

    谷歌地图地理解析和反解析geocode.geocoder详解 谷歌Geocoder服务 实例代码 地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. ...

  3. 地图经纬度坐标与屏幕坐标的转换(android版)

    我们在开发GIS系统的时候,首先要解决的就是地图的可视化问题,这个问题的关键就在于如何把地图的坐标转换成屏幕坐标,然后才到渲染着色.标注等.以下以wgs84经纬度坐标为基准,介绍一下地图经纬度坐标与屏 ...

  4. java 基于百度地图API GPS经纬度解析地址

    首先这是百度地图api 的接口地址,基于接口的参数,不过多介绍,其中都提供相应的介绍: http://lbsyun.baidu.com/index.php?title=webapi/guide/web ...

  5. Winform实现用多线程、百度地图API解析某公司的物理地址

    前言 作为一个很挫的C#新手总喜欢自己写点儿不着边际的东西,本人是个新手加菜鸟,写B/S的,工作中,任务完成了,空闲下来,总想继续学点儿什么,由此触发了本篇文章了.个人一直认为,.NET中,C/S所要 ...

  6. Google瓦片地图算法解析

    基本概念: 地图瓦片地址:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193& ...

  7. Java百度地图经纬度纠偏

    在国内使用电子地图获取到的经纬度都不是真实的经纬度,而是经过一定的算法在真实的经纬度上添加了一个偏移量,且不同的地图有不同的算法.现在告诉大家在java中怎样对百度地图进行纠偏,主要实现将真实的经纬度 ...

  8. 百度地图经纬度批量查找功能XGeocoding使用手册

    <XGeocoding使用手册> 1.下载XGeocoding V2 http://www.gpsspg.com/xgeocoding/download/ 2.解压XGeocoding_v ...

  9. 爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址

    import requests address = '40.8587960,86.866991' url = 'http://api.map.baidu.com/geocoder?output=jso ...

随机推荐

  1. python while嵌套循环

    while循环1.输出打印以#组成的长方形,自己定义长和宽.# -*-encoding:utf-8-*-'''This is script for start docker containor!Aut ...

  2. lucene源码分析(6)Query分析

    查询的入口 /** Lower-level search API. * * <p>{@link LeafCollector#collect(int)} is called for ever ...

  3. vue router的浏览器跳转行为

    最近做的项目中,涉及vue router 路由操作,其操作方法不同,产生的行为亦不同.本文通过对比实验,对其行为进行实验对比及总结,避免混淆. vue router的单页跳转的history模式,类似 ...

  4. lua闭包与简易迭代器实现

    1.什么是闭包 闭包,又称闭合函数(closure).通常,如果将一个函数写在另一个函数内,那么这个在内部的函数就可以访问到外部函数中的局部变量,这个特征就是词法域,有些资料上也叫它词法定界.闭包指的 ...

  5. hadoop学习笔记(八):MapReduce

    一.MapReduce编程模型 一种分布式计算框架,解决海量数据的计算问题. MapReduce将整个并行计算过程抽象到两个函数: Map(映射):对一些独立元素组成的列表的每一个元素进行制定的操作, ...

  6. 常用工具说明--mysql数据库安装

    MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果是msi格式的可以直接点击安装,按照它给出的安装提示进行安装(相信大家的英文可以看懂英文提示),一般MySQL将会安装在C:\P ...

  7. WPF备忘录(7)WPF图片资源路径介绍

    在项目中增加两张图片Content.jpg和Resource.jpg,分别将其生成操作属性设置为Content和Resource.     在界面中增加两个Image控件ImgContent和ImgR ...

  8. JavaScript pop()函数弹出数组最后数据

    改变数组中数据的另一种方法是用 .pop() 函数. .pop() 函数用来“抛出”一个数组末尾的值.我们可以把这个“抛出”的值赋给一个变量存储起来. 数组中任何类型的数据条目(数值,字符串,甚至是数 ...

  9. [android] 手机卫士接收打电话广播显示号码归属地

    使用广播接收者接收打电话的意图,显示号码归属地 新建一个类OutCallReceiver继承系统的BroadcastReceiver 重写onReceive()方法 调用getResultData() ...

  10. Q:链表的中间元素

    问题:如何得到一个链表的中间元素?   相信,这个问题对于刚入门编程的人来说,都不会难,最自然而然的想法是先遍历一遍链表,统计链表中的元素的个数,之后,再走一遍链表,所走的步长为链表长度的一半.这样就 ...