zoukankan      html  css  js  c++  java
  • Map3: 通过一个有意义的地址得到一组经纬度数据 通过一组经纬度数据得到一个地点名称

    问题一: 通过一个有意义的地址得到一组经纬度数据 

    方案:通过 GLGeocoder 这个类的 geocodeAddressString:completionHandler 这个方法来实现。 

    讨论:

    反向地理编码是通过一组经纬度数据得到一个实在的地理位置名称。同样我们可以使用地理编码通过一个地理名称得到一组经纬度数据。地理编码和反向地理编码的功能都被封装 在 Core Location 框架中的 CLGeocoder 类中。 
     
    我们通过给 CLGeocoder 类的 geocodeAddressString:completionHandler 这个方法传递一个 String 类型的地理位置名称来进行地理编码。这个方法的 completionHandler 参数接收一个 block 对象,这个 block 对象不返回任何内容,但是接收两个参数: 
    1、一个地标数组(NSArray 类型),这将被设置为与地址相匹配的位置。 
    2、一个 error(NSError 类型),如果地理编码失败了,将会设置一个错误码。 
     
    例子:
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSString *oreillyAddress = @"1005 Gravenstein Highway North, Sebastopol, CA 95472, USA";
        _myGeocoder = [[CLGeocoder alloc]init];
        [_myGeocoder geocodeAddressString:oreillyAddress completionHandler:^(NSArray *placemarks, NSError *error) {
            if ([placemarks count] > 0 && error == nil) {
                NSLog(@"Found %lu placemark(s).", (unsigned long)[placemarks count]);
                CLPlacemark *firstPlacemark = [placemarks objectAtIndex:0];
                NSLog(@"Longitude = %f", firstPlacemark.location.coordinate.longitude);
                NSLog(@"Latitude = %f", firstPlacemark.location.coordinate.latitude);
            }
            else if ([placemarks count] == 0 && error == nil){
                NSLog(@"Found no placemarks");
            }
            else if (error != nil){
                NSLog(@"An error occurred : %@",error);
            }
        }];
    }

    控制台打印:

    Found 1 placemark(s).

    Longitude = 93.174470

    Latitude = 38.983891

    问题二:通过一组经纬度数据得到一个地点名称

    通过一组经纬度数据得到一个实在的地理位置数据,我们通常称之为逆向地理编码。

    创建一个 CLGeocoder 的实例对象,然后提供一个块对象,这个对象必须要没有返回值,而且要接收两个参数。

    一个 NSArray 类型的地点标记参数,这个参数将会用来保存你讲需要查询的地理位置。

    一个 NSerror 类型的参数,这个参数将会返回一些地理位置编码信息是否正确的校验信息。 

    当介绍了 GLGeocoder 用法之后,我们需要使用 erverseGeocodeLocation:completionHandler 这个方法来进行反向地理位置编码。 
     
    - (void)reverseGeocode{
        //反向地理编码 经纬度->地点名称
        CLLocation *location = [[CLLocation alloc]initWithLatitude:38.983891 longitude:93.174470];
        [_myGeocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            
            if (error == nil &&
                [placemarks count] > 0){
                CLPlacemark *placemark = [placemarks objectAtIndex:0];
                /* We received the results */
                NSLog(@"Country = %@", placemark.country);
                NSLog(@"Postal Code = %@", placemark.postalCode);
                NSLog(@"Locality = %@", placemark.locality);
            }
            else if (error == nil && [placemarks count] == 0){
                NSLog(@"No results were returned.");
            }
            else if (error != nil){
                NSLog(@"An error occurred = %@", error);
            }
        }];
    }

    打印结果为:

    Country = China

    Postal Code = (null)

    Locality = Haixi

     

  • 相关阅读:
    ES elasticsearch 段合并
    xtrabackup VS clone plugin
    MySQL排序揭秘
    PostgreSQL体系结构和基本操作
    ES elasticsearch refresh和flush的区别
    MySQLMGR(一)
    redis一键创建脚本
    vs2010 安装无法打开deffactory.dat解决办法
    FeatureLayer,FeatureDataset,FeatureClass,Feature几个概念总结
    http://www.cnblogs.com/secenes/archive/2008/05/15/1198933.html
  • 原文地址:https://www.cnblogs.com/safiri/p/4086771.html
Copyright © 2011-2022 走看看