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 ...
随机推荐
- Global Embedding 理解
1.Attention-based seq2seq e(t,i):求上一时刻的输出和这一时刻编码器的输出的相似度 a(t,i):求这个词在整个文本中占多大的比重,每个时刻都存在着一个值,这个只是求一个 ...
- Lucene系列-facet--转
https://blog.csdn.net/whuqin/article/details/42524825 1.facet的直观认识 facet:面.切面.方面.个人理解就是维度,在满足query的前 ...
- rails image_tag生成图片标签
image_tag(source, options={}) Link Returns an HTML image tag for thesource. The source can be a full ...
- activiti 临时笔记mark
public class TenMinuteTutorial { public static void main(String[] args) { // Create Activiti process ...
- 任务四十二:UI组件之日历组件(三)
任务四十二:UI组件之日历组件(三) 面向人群: 有一定基础的同学 难度: 困难 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及 ...
- 求两个Linux文本文件的交集、差集、并集
一.交集 sort a.txt b.txt | uniq -d 二.并集 sort a.txt b.txt | uniq 三.差集 a.txt-b.txt: sort a.txt b.txt b.tx ...
- C#中解决Response.AddHeader("Content-Disposition", "attachment; filename=" + filename)下载文件时文件名乱码的问题
问题:下载文件时文件名乱码怎么解决? 在C#写后台代码过程中,经常遇到下载文件出现文件名乱码的问题,在网上找了很多方法,总是存在浏览器不兼容的问题,当IE浏览器不乱码时,火狐浏览器就会乱码,后来经过反 ...
- PowerDesigner最基础的使用方法入门学习(转载)
来源:http://www.cnblogs.com/biehongli/p/6025954.html 1:入门级使用PowerDesigner软件创建数据库(直接上图怎么创建,其他的概念知识可自行学习 ...
- oracle中scott用户的创建
原创作品,转载请在文章开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10046716.html 今天,接着上次的学习进度继续前进,在此过程中,使用 ...
- 湘潭校赛 Bob's Problem
Bob's Problem Accepted : 18 Submit : 115 Time Limit : 1000 MS Memory Limit : 65536 KB 题目描述 Bob今 ...