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 ...
随机推荐
- 阿里云域名ssl证书导入aws负载均衡使用
一 .原因 由于公司战略需求,需要将阿里云的服务器迁移到aws,在迁移过程中,我们需要使用的是aws的负载均衡,可以在EC2的控制台 负载平衡位找到负载均衡.根据业务需求我们使用的是应用程序负载均衡器 ...
- fail2ban的使用以及防暴力破解与邮件预警
fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员! fail2ban运行机制:简单来说其功能就 ...
- HTTP状态码列表
经常用的http状态码 1xx消息——请求已被服务器接收,继续处理2xx成功——请求已成功被服务器接收.理解.并接受3xx重定向——需要后续操作才能完成这一请求4xx请求错误——请求含有词法错误或者无 ...
- lucene基本原理
1.术语 lucene 在存储它的全文索引结构时,是有层次结构的,这涉及到5个层次:索引(Index):段(Segment):文档(Document):域(Field):词(Term),他们的关系如下 ...
- onkeydown事件
<img src="images/hot.jpg" alt="" id="imgId" class="img1"/ ...
- https在电子邮件安全解决方案
电子邮件安全解决方案 电子邮件已经成为现代人最重要和最不可缺少的个人生活和工作的通信工具之一,特别是企业应用.但是,您也许不知道,所有电子邮件系统都是明文传输,也就是说:您的每一个重要邮件都是在以“明 ...
- MVC 基架不支持 Entity Framework 6 或更高版本 即 NuGet的几个小技巧
MVC 基架不支持 Entity Framework 6 或更高版本.有关详细信息,请访问 http://go.microsoft.com/fwlink/?LinkId=276833. 原因:mvc版 ...
- ionic组件清单
整理时间:2017-5-22 官网版本:v3.2.0 / 2017-05-10 / MIT Licensed / Release Notes
- Asp.Net 天气 WebService 使用
本文使用Asp.Net (C#)调用互联网上公开的WebServices(http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)来实 ...
- select SCOPE_IDENTITY()用法
select SCOPE_IDENTITY() 返回上面操作的数据表最后row的IDENTITY 列的值: 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域 ...