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 ...
随机推荐
- LogStash启动报错:<Redis::CommandError: ERR unknown command 'script'>与batch_count 的 配置
环境条件: 系统版本:centos 6.8 logstash版本:6.3.2 redis版本:2.4 logstash input配置: input { redis { host => &qu ...
- Ethereum 源码分析之 accounts
一.Account // Account represents an Ethereum account located at a specific location defined // by the ...
- 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题
前言 本文介绍本人的一次使用Windbg分析dump文件找出死锁的过程,并重点介绍如何确定线程所等待的锁及判断是否出现了死锁. 对于如何安装及设置Windbg请参考:<使用Windbg和SoS扩 ...
- 从Qt到PyQt
Hello World PyQt与Qt具有极其相似的类族和API,而且不再使用qmake系统和Q_OBJECT宏使得PyQt在没有编译链接时频繁的错误而且代码更加友好. from PyQt4 impo ...
- JBoss 实战(2)
转自:https://www.cnblogs.com/aiwz/p/6154591.html JBOSS HTTP的Thread Group概念 JBOSS是一个企业级的J2EE APP Contai ...
- UA 用户代理
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等.被广泛用来标识 ...
- HTML5的audio在手机网页上无法自动加载/播放音乐,能否实现该功能?
在IOS中第一次调用play方法播放音频会被阻止,必须得等用户有交互动作,比如touchstart,click后才能正常调用,在微信中可以通过监听WeixinJSBridgeReady事件来提前播放一 ...
- 深入理解java虚拟机---java内存区域与内存溢出异常---1内存结构
本文来源于翁舒航的博客,点击即可跳转原文观看!!!(被转载或者拷贝走的内容可能缺失图片.视频等原文的内容) 若网站将链接屏蔽,可直接拷贝原文链接到地址栏跳转观看,原文链接:https://www.cn ...
- HDU 1576 A/B 暴力也能过。扩展欧几里得
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- SpringCloud学习指南【更新】
一. 推荐学习博客主页[更新] Spring Cloud 系列文章(纯洁的微笑,强烈推荐系列文章) Spring Cloud系列教程 (周立大大,强烈推荐) Spring Cloud入门到实战系列教程 ...