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:0];

                 // 获取地址字典
                 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:0];

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

 

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

看看是什么地方....

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

 

 

时间: 2024-09-28 04:03:10

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

地图 经纬度-关于地图经纬度的问题。

问题描述 关于地图经纬度的问题. 数据库里存有商家(经纬度坐标),前台传来当前经纬度获取附近的商家,还计算当前相距大约多少米.求大神解决办法,公式等. 解决方案 http://bbs.csdn.net/topics/370122306

SQLSERVER 根据地图经纬度计算距离差示例_MsSql

SQL SERVER 根据地图经纬度计算距离的公式 复制代码 代码如下: go --创建经纬度距离计算函数 CREATEFUNCTION [dbo].[fnGetDistance] --LatBegin 开始经度 --LngBegin 开始维度 (@LatBegin REAL, @LngBegin REAL, @LatEnd REAL, @LngEnd REAL) RETURNSFLOAT AS BEGIN --距离(千米) DECLARE @Distance REAL DECLARE @EAR

谷歌地图 经纬度-谷歌地图---怎么通过输入的地址获取其经纬度

问题描述 谷歌地图---怎么通过输入的地址获取其经纬度 是谷歌地图不是百度地图 知道地址获取其经纬度,求教啊. 解决方案 官方有相应的api吧 解决方案二: 谷歌有地址解码google.maps.Geocoder,自己看这个:https://developers.google.com/maps/documentation/javascript/geocoding?hl=zh-CN 解决方案三: 如果有打过点的地址,就可以解码出经纬度.如果没有打过点,不行.

把获取的百度地图经纬度使用高德地图进行接收定位,显示

问题描述 因为功能问题开发问题,使用高德地图开发比较方便,想要把聊天界面获取到的位置经纬度,使用高德地图进行显示定位,可以知识下demo里面的具体的需要使用到那些activity和apter和task.和db包里面的谢谢类吗

php 读取 google 地图经纬度

参考了网上部分资料,自己改写了一个方便的获取经纬度信息的类Geo,其中Latitude和Longtitude分别是纬度和经度.其中最重要的构造函数就是传入地名,通过Webrequest从Google Map获得经纬度值,在含有地理位置信息的项目里可以很方便的调用,即Geo g = new Geo("北京师范大学");然后g.Latitude和g.Longtitude就是北京师范大学的纬度和经度了,它们分别是39.9614580,116.3692820.Geo的实现如下: using S

sql server中根据地图经纬度算距离

从别的地方烤过来的,自己试了一下,可以计算 出来,不过正确不正确的就不太懂了.   USE [niaoren]GO/****** Object:  UserDefinedFunction [dbo].[fnGetDistance]    Script Date: 2017/7/28 星期五 12:17:56 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO  --计算地球上两个坐标点(经度,纬度)之间距离sql函数      --作者:lo

LOL召唤师答疑 新地图画面细节解析

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;       [科技讯]6月13日信息,拳头设计师Riot CaptainLx和Riot Nome分别代表美术团队和游戏设定团队向大家介绍召唤师峡谷地图更新内容: 以下为大家整理问答要点和讨论内容: 综合: 双方团队(现在只有红蓝队) 将有各自的主题色彩.....[查看详情]

百度地图输入经纬度产生地图

问题描述 百度地图输入经纬度产生地图 function serachlocal() { var map = new BMap.Map("map"); var point = new BMap.Point("serachx","searchy"); map.centerAndZoom(point, 15); } 这是我定义的div 问题是点了之后不能产生地图,有新的实例覆盖原来的默认地图,但是是空白的,请大神指导 解决方案 var point =

百度地图 获取中心点经纬度

问题描述 百度地图 获取中心点经纬度 我想实现的是 每次拖动地图之后 重新获取到当前画面内中心点的经纬度 有木有大神给提示一下 解决方案 获取百度地图经纬度 解决方案二: 你做地图开发,用的什么sdk呢,一般有对应的转换方法的 解决方案三: jssdk还是android sdk什么的?自己看api jssdk用 map.getCenter() 返回中心点经纬度 http://lbsyun.baidu.com/