iOS CLGeocoder(地图解析)~demo

来源:互联网 发布:windows aero 用不了 编辑:程序博客网 时间:2024/06/06 07:51

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄

/**

注意点: 1.看 GIF 效果图.

       2.看连线视图的效果图.

       3.看实现代码(直接复制实现效果).

*/

一、GIF 效果图:


二、连线视图的效果图:

图1:



三、实现代码:

=========================

===================================================

==========================

/**

注意点:  在视图上面输入经纬度-->不能超出一下范围

       1.纬度为 南纬90-0-北纬90

       2.经度为 西经180-本出子午线(0度)-东经180

     3.高德地图存在偏差,解析的经纬度不准确

     4.UIAlertView(提示框)不能高于 iOS9.0,否则报黄


*/

控制器1:

//

//  ViewController.m

//  AddressResolution(地址解析)

//

//  Created by 石虎 on 2017/7/5.

//  Copyright © 2017 shihu. All rights reserved.

//


#import "ViewController.h"

#import <CoreLocation/CoreLocation.h>


@interface ViewController ()


//地址输入框

@property (weak,nonatomic)IBOutletUITextField *addrField;

//经度

@property (weak,nonatomic)IBOutletUITextField *longitudeField;

//纬度

@property (weak,nonatomic)IBOutletUITextField *latitudeField;

//显示内容框

@property (weak,nonatomic)IBOutletUITextView *resultView;

//解析地址

- (IBAction)encodeTapped:(UIButton *)sender;

//反方向解析

- (IBAction)reverseTapped:(UIButton *)sender;

//地理编码

@property (strong,nonatomic)CLGeocoder *geocoder;

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];


    // 创建地址解析器

    self.geocoder = [[CLGeocoderalloc]init];


}

#pragma mark -解析地址

- (IBAction)encodeTapped:(UIButton *)sender

{

    //获取用户输入的地址字符串

    NSString *addr =self.addrField.text;

    if(addr !=nil && addr.length >0)

    {

        [self.geocodergeocodeAddressString:@"北京八维研修学院"

         completionHandler: ^(NSArray *placemarks,NSError *error)

         {

            //如果解析结果的集合元素的个数大于1,表明解析得到了经度、纬度信息

             if (placemarks.count >0)

             {

                //只处理第一个解析结果,实际项目中可使用列表让用户选择

                 CLPlacemark *placemark = placemarks[0];

                 CLLocation* location = placemark.location;

                 self.resultView.text = [NSStringstringWithFormat:

                                         @"%@的经度为:%g,纬度为:%g" , addr ,

                                         location.coordinate.longitude ,

                                         location.coordinate.latitude ];

             }else//没有得到解析结果。

             {

                 // 使用UIAlertView提醒用户

                 [[[UIAlertViewalloc]initWithTitle:@"提醒"message:@"您输入的地址无法解析"delegate:nilcancelButtonTitle:@"确定"otherButtonTitles:nil]

                  show];

             }

         }];

    }

}


#pragma mark -反方向解析

- (IBAction)reverseTapped:(UIButton *)sender

{

    NSString* longitudeStr =self.longitudeField.text;

    NSString* latitudeStr =self.latitudeField.text;

    

    if(longitudeStr !=nil && longitudeStr.length >0

       && latitudeStr != nil && latitudeStr.length >0)

    {

        // 将用户输入的经度、纬度封装成CLLocation对象

        CLLocation* location = [[CLLocationalloc]

                                initWithLatitude:[latitudeStrfloatValue]

                                longitude:[longitudeStrfloatValue]];

        

        [self.geocoderreverseGeocodeLocation:locationcompletionHandler:

         ^(NSArray *placemarks,NSError *error)

         {

            //如果解析结果的集合元素的个数大于1,表明解析得到了经度、纬度信息

             if (placemarks.count >0)

             {

                //只处理第一个解析结果,实际项目可使用列表让用户选择

                 CLPlacemark* placemark = placemarks[0];

                 // 获取详细地址信息

                 NSArray* addrArray = [placemark.addressDictionary

                                       objectForKey:@"FormattedAddressLines"];

                 // 将详细地址拼接成一个字符串

                 NSMutableString* addr = [[NSMutableStringalloc]init];

                 for(int i =0 ; i < addrArray.count ; i ++)

                 {

                     [addr appendString:addrArray[i]];

                 }

                 self.resultView.text = [NSStringstringWithFormat:

                                         @"经度:%g,纬度:%g的地址为:%@" ,

                                         location.coordinate.longitude ,

                                         location.coordinate.latitude , addr];

             }else{//没有得到解析结果。

                 // 使用UIAlertView提醒用户

                 [[[UIAlertViewalloc]initWithTitle:@"提醒"message:@"您输入的地址无法解析"delegate:nilcancelButtonTitle:@"确定"otherButtonTitles:nil]

                  show];

             }

         }];

    }

}


@end



谢谢!!!



原创粉丝点击