美文网首页iOSiOS地图
iOS 地理编码 / 反地理编码

iOS 地理编码 / 反地理编码

作者: iOS_成才录 | 来源:发表于2015-11-12 19:32 被阅读6969次
一、CLGeocoder 地理编码 与 反地理编码
  • 地理编码
    • 根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)
      // 地理编码方法
      -(void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
    
  • 反地理编码
    • 根据给定的经纬度,获得具体的位置信息

// 反地理编码方法
-(void)reverseGeocodeLocation:(CLLocation*)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;

+ 注意:CLGeocodeCompletionHandler
 - 当地理\反地理编码完成时,就会`调用CLGeocodeCompletionHandler`,可以`获取到CLPlacemark对象`
```objc
// 这个block传递2个参数
// error:当编码出错时(比如编码不出具体的信息)有值
// placemarks:里面装着CLPlacemark对象
typedef void(^CLGeocodeCompletionHandler)
(NSArray*placemarks, NSError*error);
  • CLPlacemark(locality:城市名称 thoroughfare:街道名称 name:全称 CLLocation *location)

二、应用场景

  • 1、与定位结合使用,用于确定当前用户所在的具体地址信息

三、实例

#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>

@interface ViewController ()


/** 地理编码 */
@property (nonatomic, strong) CLGeocoder *geoC;
@property (weak, nonatomic) IBOutlet UITextView *addressTV;

@property (weak, nonatomic) IBOutlet UITextField *latitudeTF;

@property (weak, nonatomic) IBOutlet UITextField *longitudeTF;
@end

@implementation ViewController


#pragma mark -懒加载
-(CLGeocoder *)geoC
{
    if (!_geoC) {
        _geoC = [[CLGeocoder alloc] init];
    }
    return _geoC;
}


-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //
    [self.view endEditing:YES];
}

/**
 *  地理编码(地址转经纬度)
 */
- (IBAction)geoCoder {
    
    NSString *address = self.addressTV.text;
    
    // 容错
    if([address length] == 0)
        return;
    
    [self.geoC geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        
        // CLPlacemark : 地标
        // location : 位置对象
        // addressDictionary : 地址字典
        // name : 地址详情
        // locality : 城市
        
        if(error == nil)
        {
            CLPlacemark *pl = [placemarks firstObject];
            self.addressTV.text = pl.name;
            self.latitudeTF.text = @(pl.location.coordinate.latitude).stringValue;
            self.longitudeTF.text = @(pl.location.coordinate.longitude).stringValue;
        }else
        {
            NSLog(@"错误");
        }
    }];
}
- (IBAction)reverseGeoCoder {
    
    // 获取用户输入的经纬度
    double latitude = [self.latitudeTF.text doubleValue];
    double longitude = [self.longitudeTF.text doubleValue];
    
    CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
    
    // 反地理编码(经纬度---地址)
    [self.geoC reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
        if(error == nil)
        {
            CLPlacemark *pl = [placemarks firstObject];
            self.addressTV.text = pl.name;
            self.latitudeTF.text = @(pl.location.coordinate.latitude).stringValue;
            self.longitudeTF.text = @(pl.location.coordinate.longitude).stringValue;
        }else
        {
            NSLog(@"错误");
        }
    }];
}
@end

相关文章

  • CLGeocoder

    CLGeocoder(地理编码) 使用CLGeocoder可以完成“地理编码”和“反地理编码”地理编码:根据给定的...

  • iOS 地理编码 / 反地理编码

    一、CLGeocoder 地理编码 与 反地理编码 地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址...

  • 地理编码

    地理编码和反地理编码都使用CLGeocoder类来实现. 地理编码使用 geocodeAddressString:...

  • 地图和定位(三)

    一、地理编码和反地理编码 地理编码:把地址转为经纬度反地理编码:把经纬度转为地址 二、获取当前城市名称(定位+反地...

  • iOS - 定位、地理编码、反地理编码

    #pragma mark---*定位: 一、介绍 1、定位使用CoreLocation框架 2、功能:(1)基础定...

  • iOS 地理编码反编码

    本文目录 地理编码地名 -> 经纬度 等具体位置数据信息。根据给定的位置(通常是地名)确定地理坐标(经、纬度)。 ...

  • 基于CLGeocoder - 反地理编码

    iOS中CoreLocatio框架中的CLGeocoder 类不但为我们提供了地理编码方法,而且还提供了反地理编码...

  • 基于百度API的 - 反地理编码

    iOS中CoreLocatio框架中的CLGeocoder 类不但为我们提供了地理编码方法,而且还提供了反地理编码...

  • 高德地图问题

    1:定位的时候获取用户的省市区位置,通过反地理编码 地理编码与反地理编码 地理编码:根据地址获得相应的经纬度以及详...

  • iOS开发之CoreLocaiton框架使用(地理编码,反地理编

    什么是地理编码和反地理编码? 地理编码 地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)。...

网友评论

  • 7c1702fdd5d6:你好,我用地理反编码的时候,一直报错 Error Domain=kCLErrorDomain Code=2 "(null)"
    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    if (!error) {
    NSLog(@"sucesss");
    }else{
    NSLog(@"%@",error);
    }
    做ios开发的小姑娘:@lanhao 请问解决了嘛
    ZYSam:@lanhao 大神 弄好了么
    87e912b47ff4:请问你解决了吗? 我也是一直报错Error Domain=kCLErrorDomain Code=8 "(null)" 地理名称转经纬度就没问题
  • 提点九路节度使:地址反编码, 显示的结果, 城市名什么都是 拼音 显示, 怎么显示汉语啊?
    Ps:在忽视手机默认语言的情况下,及时 手机语言是英语, 都显示汉语,
    提点九路节度使:@ba298f771579 我之前用的是系统的逆地理解析,存在我说的问题. 因为我app中用的是高德地图, 后来我换成 高德地图的 逆地理 解析方法, 然后 实现两个 代理的方法
    /**
    * 逆地理解析
    */
    - (void)searchReGeocodeWithCoordinate:(CLLocationCoordinate2D)coordinate
    {
    NSLog(@"开始逆地理解析");
    AMapReGeocodeSearchRequest *regeo = [[AMapReGeocodeSearchRequest alloc] init];

    regeo.location = [AMapGeoPoint locationWithLatitude:coordinate.latitude
    longitude:coordinate.longitude];
    regeo.requireExtension = YES;

    [self.search AMapReGoecodeSearch:regeo];

    NSLog(@"逆地理解析结束");

    }

    #pragma mark - AMapSearchDelegate
    // 请求错误时, 调用此代理方法
    - (void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error {
    NSLog(@"%s: searchRequest = %@, errInfo= %@", __func__, [request class], error);
    NSLog(@"逆地理解析错误时回调");

    if ([request isKindOfClass:[AMapReGeocodeSearchRequest class]])
    {
    NSLog(@"位置解析失败");
    // [self showMessage:@"位置解析失败"];

    RecordAdd1Cell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]];

    cell.descLabel.text = @"未能有效获取当前位置信息";

    }

    }

    // 逆地理编码回调方法
    - (void)onReGeocodeSearchDone:(AMapReGeocodeSearchRequest *)request response:(AMapReGeocodeSearchResponse *)response {
    NSLog(@"逆地理解析回调方法");
    if (response.regeocode != nil)
    {
    NSLog(@"逆地理编码");

    NSString *dizhi = response.regeocode.formattedAddress;

    NSLog(@"dizhi:%@", dizhi);

    NSString *localString = @"未能有效获取当前位置信息";
    if (dizhi.length == 0) {
    dizhi = localString;
    }

    RecordAdd1Cell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]];
    cell.descLabel.text = dizhi;


    }


    }
    ba298f771579:@提点九路节度使 你解决了吗?
    ba298f771579:@提点九路节度使 为什么是汉语拼音啊,我也是汉语拼音,我想要汉字怎么弄呀
  • 魔黎:大神,问个问题 :sob:

    如何获取到跟android定位sdk里面一样的citycode?



    String s1 = location.getCityCode();



    那么iOS的呢

本文标题:iOS 地理编码 / 反地理编码

本文链接:https://www.haomeiwen.com/subject/mpvhhttx.html