LocationCoder 地图经纬度解析
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 地图经纬度解析的更多相关文章
- 谷歌地图地理解析和反解析geocode.geocoder详解
地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...
- 谷歌地图地理解析和反解析geocode.geocoder详解(转)
谷歌地图地理解析和反解析geocode.geocoder详解 谷歌Geocoder服务 实例代码 地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. ...
- 地图经纬度坐标与屏幕坐标的转换(android版)
我们在开发GIS系统的时候,首先要解决的就是地图的可视化问题,这个问题的关键就在于如何把地图的坐标转换成屏幕坐标,然后才到渲染着色.标注等.以下以wgs84经纬度坐标为基准,介绍一下地图经纬度坐标与屏 ...
- java 基于百度地图API GPS经纬度解析地址
首先这是百度地图api 的接口地址,基于接口的参数,不过多介绍,其中都提供相应的介绍: http://lbsyun.baidu.com/index.php?title=webapi/guide/web ...
- Winform实现用多线程、百度地图API解析某公司的物理地址
前言 作为一个很挫的C#新手总喜欢自己写点儿不着边际的东西,本人是个新手加菜鸟,写B/S的,工作中,任务完成了,空闲下来,总想继续学点儿什么,由此触发了本篇文章了.个人一直认为,.NET中,C/S所要 ...
- Google瓦片地图算法解析
基本概念: 地图瓦片地址:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193& ...
- Java百度地图经纬度纠偏
在国内使用电子地图获取到的经纬度都不是真实的经纬度,而是经过一定的算法在真实的经纬度上添加了一个偏移量,且不同的地图有不同的算法.现在告诉大家在java中怎样对百度地图进行纠偏,主要实现将真实的经纬度 ...
- 百度地图经纬度批量查找功能XGeocoding使用手册
<XGeocoding使用手册> 1.下载XGeocoding V2 http://www.gpsspg.com/xgeocoding/download/ 2.解压XGeocoding_v ...
- 爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址
import requests address = '40.8587960,86.866991' url = 'http://api.map.baidu.com/geocoder?output=jso ...
随机推荐
- 转--log4j.properties 详解与配置步骤
一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...
- freepbx的SIP通话客户端X-lite Yate eyeBeam Linphone
在上一篇文章安装freepbx后创建sip分机里我们已经创建好了SIP分机,接下来我们使用几大客户端进行登陆.我们接下来会使用到的软件有X-lite,Yate client,eyeBeam, Linp ...
- C#对json数据的解析
一,基础知识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类 ...
- XRP节点部署
目录 XRP节点部署 准备 硬软件配置(建议) 安装Rippled服务 一. 以Stock Server模型运行 在何种情况下运行此模式 二 .以 Validator模式运行 在何种情况下运行此模式 ...
- C语言----<另类>神奇的"Hello World!"
先上代码 #include <iostream> using namespace std; void a() { printf("Hello World!"); } v ...
- 使用iTextSharp 解析html生成pdf,xmlworker不支持中文的解决办法
http://www.micmiu.com/opensource/expdoc/itext-xml-worker-cn/ 参考上面的文章,虽然是java的,但是和.net是对应的. 下载 html ...
- Angular2入门教程-2 实现TodoList App
最近在学习<Angular从零到一>(机械工业出版社) 遇到一些问题,书中讲的不明白,在网上找了一些,资源很多,也有很多前人的经验 https://blog.csdn.net/ztguan ...
- iOS--支付宝环境集成
1.下载支付宝SDK以及Demo https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType= ...
- Algorithm——两个排序数组的中位数
ps:城际的网速还是不错的-
- 1415. [NOIP2001]数的计数
☆ 输入文件:nums.in 输出文件:nums.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先 ...