iOS地图解析经纬度过程

2017-09-01  本文已影响0人  往日的时光

最近学习iOS地图比较多,所以做笔记记录一下,作为总结

对于地图和定位,苹果公司提供给了两个框架:
MapKit:用于地图展示
Core Location :用于地理定位

首先我们把用于地理定位的系统库导入工程:

地理定位系统库

然后导入头文件:

#import <CoreLocation/CoreLocation.h>

CoreLocation框架使用须知
CoreLocation框架中所有数据类型的前缀都是CL
CoreLocation中使用CLLocationManager对象来做用户定位

然后使用拖拽控件方式:

解析和反解析控件

CLGeocoder (地理编码,反地理编码)

使用CLGeocoder可以完成“地理编码”和“反地理编码”
地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)
反地理编码:根据给定的经纬度,获得具体的位置信息

地理编码方法
- (void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
反地理编码方法
- (void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler

代码如下:

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *DiZhiTF;
@property (weak, nonatomic) IBOutlet UITextField *JingDUTF;
@property (weak, nonatomic) IBOutlet UITextField *WeiDu;
@property (weak, nonatomic) IBOutlet UITextView *ZhanShi;
//地理编码
@property(strong,nonatomic)CLGeocoder *geocoder;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    //创建地址解析器
    self.geocoder= [[CLGeocoder alloc]init];
}

- (IBAction)KSJieXi:(id)sender
{
    // 获取用户输入的地址字符串
    NSString *Dz = self.DiZhiTF.text;
    if(Dz != nil && Dz.length > 0)
    {
        [self.geocoder geocodeAddressString:Dz
                          completionHandler: ^(NSArray *placemarks, NSError *error)
         {
             // 如果解析结果的集合元素的个数大于1,表明解析得到了经度、纬度信息
             if (placemarks.count > 0)
             {
                 // 只处理第一个解析结果,实际项目中可使用列表让用户选择
                 CLPlacemark *placemark = placemarks[0];
                 CLLocation *location = placemark.location;
                 self.ZhanShi.text = [NSString stringWithFormat:
                                         @"%@的经度为:%g,纬度为:%g",Dz,
                                         location.coordinate.longitude,
                                         location.coordinate.latitude];
             }
             else
             {
                 NSLog(@"您输入的地址不正确");
             }
         }];
    }
    
}



    


- (IBAction)KSFanXiang:(id)sender
{
    NSString *longitudeStr = self.JingDUTF.text;
    NSString *latitudeStr = self.WeiDu.text;
    if(longitudeStr != nil && longitudeStr.length > 0
       && latitudeStr != nil && latitudeStr.length > 0)
    {
        // 将用户输入的经度、纬度封装成CLLocation对象
        CLLocation* location = [[CLLocation alloc]initWithLatitude:[latitudeStr floatValue]
                                longitude:[longitudeStr floatValue]];
        
        [self.geocoder reverseGeocodeLocation:location completionHandler:
         ^(NSArray *placemarks, NSError *error)
         {
             // 如果解析结果的集合元素的个数大于1,表明解析得到了经度、纬度信息
             if (placemarks.count > 0)
             {
                 // 只处理第一个解析结果,实际项目可使用列表让用户选择
                 CLPlacemark* placemark = placemarks[0];
                 // 获取详细地址信息
                 NSArray* addrArray = [placemark.addressDictionary
                                       objectForKey:@"FormattedAddressLines"];
                 // 将详细地址拼接成一个字符串
                 NSMutableString *Dz = [[NSMutableString alloc] init];
                 for(int i = 0 ; i < addrArray.count; i ++)
                 {
                     [Dz appendString:addrArray[i]];
                 }
                 self.ZhanShi.text = [NSString stringWithFormat:
                                         @"经度:%g,纬度:%g的地址为:%@",
                                         location.coordinate.latitude,
                                         location.coordinate.longitude,Dz];
             }
             // 没有得到解析结果。
             else
             {
                 NSLog(@"您输入的地址无法解析");
             }
         }];
    }

}


@end

实现效果如下:

实现解析效果
上一篇下一篇

猜你喜欢

热点阅读