地图篇-02.地理编码

地图篇-02.地理编码(GeoCoding/ReverseGeoCoding)

上一节给大家简单介绍了一下获取用户位置,用经纬度表示位置.这一节我们来讲讲地理编码.

首先,我们要知道什么是地理编码

概念:

  地理编码:指的是将统计资料或是地址信息建立空间坐标关系的过程,称为地理编码.实现了将中文地址或地名描述转换为经纬度表示在地图上(地球表面上)功能。

  反地理编码:实现了将地图上(地球表面上)的经纬度转换为中文地址或地名描述.

编码前准备:

  在写代码之前,在storyboard中拖几个控件,如下图:

拖好这些控件之后,一定要记得初始化tabBarController,下图

完成以上步骤之后,我们就要开始写代码了

因为要将两个UIViewController显示在视图上,所以创建两个类,并且关联上

关联好了之后就把我们需要的控件,拖入到相应的类中

现在就可以开始写代码了(重点):

首先,导入头文件

#import <CoreLocation/CoreLocation.h>,上一小节中说过,这个头文件如果有很多类都要用到,可以写一个pch文件,这里简单说一下方法:

完成上一步你会发现CoreLocation在类中还是不能用,不要急,还有下一步:

上代码:

地理编码(GeoCoding):

 1 //
 2 //  GeocodViewController.m
 3 //  地理编码
 4 //
 5 //  Created by admin on 16/5/21.
 6 //  Copyright © 2016年 KXZDJ. All rights reserved.
 7 //
 8
 9 #import "GeocodViewController.h"
10
11 @interface GeocodViewController ()
12 @property (weak, nonatomic) IBOutlet UITextField *addressFiled;
13 @property (weak, nonatomic) IBOutlet UILabel *latitudeLabel;
14 @property (weak, nonatomic) IBOutlet UILabel *lontitudeLabel;
15 @property (weak, nonatomic) IBOutlet UITextView *detailTextView;
16
17 @end
18
19 @implementation GeocodViewController
20 - (IBAction)geoCode:(id)sender {
21
22     //创建地理编码对象
23     CLGeocoder *geo = [[CLGeocoder alloc] init];
24
25     //地理编码
26     [geo geocodeAddressString:self.addressFiled.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
27         //判断placemarks如果没有值或者error存在,就打印错误信息
28         if (placemarks.count == 0 || error) {
29             NSLog(@"%@",error);
30             return;
31         }
32
33         //获取地标
34         CLPlacemark *cpl = [placemarks lastObject];
35
36         //纬度
37         CLLocationDegrees latitude = cpl.location.coordinate.latitude;
38
39         //经度
40         CLLocationDegrees longtitude = cpl.location.coordinate.longitude;
41
42         //赋值(注意经纬度是double类型)
43         self.latitudeLabel.text = [NSString stringWithFormat:@"%f",latitude];
44         self.lontitudeLabel.text = [NSString stringWithFormat:@"%f",longtitude];
45
46         //定义一个临时字符串接收获取到的地址名字
47         NSString *tempStr = @"";
48
49         //遍历placemarks,获取当前坐标位置
50         for (CLPlacemark *cpl in placemarks) {
51             //这里为什么要追加字符串呢?因为placemarks是一个数组,里面有很多重名的地方(比如:上海有个南京路步行街,成都有个春熙路步行街,当用户输入步行街的时候,这两个都会显示出来,如果不追加的话,就只会显示一个)
52             tempStr = [tempStr stringByAppendingString:[NSString stringWithFormat:@"%@\n",cpl.name]];
53         }
54
55         //赋值给self.detailTextView
56         self.detailTextView.text = tempStr;
57
58
59     }];
60 }
61
62 - (void)viewDidLoad {
63     [super viewDidLoad];
64
65 }
66
67
68 @end

运行效果图:

现在大家应该理解placemarks和代码中拼接字符串的意义所在了.

反地理编码(ReverseGeoCoding):

 1 //
 2 //  ReverseCodeViewController.m
 3 //  地理编码
 4 //
 5 //  Created by admin on 16/5/21.
 6 //  Copyright © 2016年 KXZDJ. All rights reserved.
 7 //
 8
 9 #import "ReverseCodeViewController.h"
10
11
12 @interface ReverseCodeViewController ()
13 @property (weak, nonatomic) IBOutlet UITextField *latitudeLabel;
14 @property (weak, nonatomic) IBOutlet UITextField *longtitudeLabel;
15 @property (weak, nonatomic) IBOutlet UITextView *detailTextView;
16
17 @end
18
19 @implementation ReverseCodeViewController
20
21 - (void)viewDidLoad {
22     [super viewDidLoad];
23
24 }
25 - (IBAction)reverseCode:(id)sender {
26     //创建地理编码
27     CLGeocoder *reverseCode = [[CLGeocoder alloc] init];
28
29     //纬度
30     CLLocationDegrees latitude = [self.latitudeLabel.text doubleValue];
31
32     //经度
33     CLLocationDegrees longitude = [self.longtitudeLabel.text doubleValue];
34
35     //创建地理位置
36     CLLocation *local = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];
37
38     //反地理编码
39     [reverseCode reverseGeocodeLocation:local completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
40         //判断placemarks如果没有值或者error存在,就打印错误信息
41         if (placemarks.count == 0 || error) {
42             NSLog(@"地理编码失败");
43             return;
44         }
45
46         NSLog(@"%ld",placemarks.count);
47
48         //获取地址
49         CLPlacemark *cpl = [placemarks lastObject];
50         NSLog(@"%@",cpl.name);
51
52         //赋值给detailTextView
53         self.detailTextView.text = cpl.name;
54     }];
55
56
57 }
58
59 @end

运行效果图:

在反地理编码的时候要注意了:

1.如果输入的经纬度,在地图上是存在的,但是编码失败,不要着急,那是因为系统会自动判定你在哪个国家,然后你只被允许访问这个国家内的经纬度.

2.反地理编码的时候大家可能会发现,数组里面只有一个值,这就印证了一个具体的经纬度的唯一性.

地理编码和反地理编码到这里就结束了,希望能帮到大家,如果有什么地方不足或者有错误的话请告诉我,我会第一时间纠正.谢谢...

时间: 2024-11-07 01:14:40

地图篇-02.地理编码的相关文章

iOS开发拓展篇—CoreLocation地理编码

iOS开发拓展篇—CoreLocation地理编码 一.简单说明 CLGeocoder:地理编码器,其中Geo是地理的英文单词Geography的简写. 1.使用CLGeocoder可以完成“地理编码”和“反地理编码” 地理编码:根据给定的地名,获得具体的位置信息(比如经纬度.地址的全称等) 反地理编码:根据给定的经纬度,获得具体的位置信息 (1)地理编码方法 - (void)geocodeAddressString:(NSString *)addressString completionHan

objective-c开发——地图定位之地理编码和地理反编码

我们平时做地图定位,主要是靠经纬度来准确定位某个位置. 但是,我们是人啊,我们不是卫星啊. 用户在地图上查一个地方,我们总不能告诉他,这个地方是东经多少度,北纬多少度吧. 咱们好歹得告诉人家个地名不是? 这就是我们今天说的地理编码和地理反编码. 地理编码:你说个地名,比如“西湖”,我们给你返回它的经纬度,然后你通过查出来的这个经纬度去定位 反地理编码:我告诉你一个经纬度,你通过经度纬度返回地名.最好在插个大头针在地图上就更好了,啥叫大头针,咱们以后再说. 首先,我的界面是这个样纸的,就是两个按钮

iOS 原生地图地理编码与反地理编码

当我们要在App实现功能:输入地名,编码为经纬度,实现导航功能. 那么,我需要用到原生地图中的地理编码功能,而在Core Location中主要包含了定位.地理编码(包括反编码)功能. 在文件中导入 #import <CoreLocation/CoreLocation.h> 地理编码: /** 地理编码 */ - (void)geocoder { CLGeocoder *geocoder=[[CLGeocoder alloc]init]; NSString *addressStr = @&qu

ios百度地图逆地理编码(基于2.3.0--2.4.0SDK开发)

不得不说,现在的百度LBS部门是不是没人了啊,时不时的搞出来一些不好用得东西 要做百度的逆地理编码功能,肯定是要先启动百度服务了,这些就不再扯了.  BMKGeoCodeSearch *_geoCodeSearch = [[BMKGeoCodeSearch alloc]init];  _geoCodeSearch.delegate = self; BMKReverseGeoCodeOption *reverseGeoCodeOption= [[BMKReverseGeoCodeOption al

百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码

之前写过一篇关于百度地图开发的blog,主要介绍了百度地图的基本地图的显示. 详见:Android百度地图开发(一)之初体验 下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码. 添加覆盖物 在地图上添加覆盖物,一般需要以下几个步骤: 1. 定义坐标点,有可能是一个,有可能是多个(比如:多边形覆盖物). 2. 构造OverlayOptions(地图覆盖物选型基类). 3. 在地图上添加覆盖物. 4. 添加相应的监听事件. 在API中可以看到,BaiDuMap类中有一个方法: 这个方法就是用

Demo:地图展示,定位,地理编码,标注,离线地图等

Demo:地图展示,定位,地理编码,标注,离线地图等 简单的实现天地图部分功能,地图展示,定位,地理编码,标注,公交和驾车规划,离线地图等功能,简单明了. 下载地址:http://www.devstore.cn/code/info/81.html 运行截图:    

逆向地理编码--根据地址搜索定位,点击地图、获取经纬度信息

1.地图使用的是高德.效果如下图: 2.前端代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head>    <met

在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据

百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路**号院**社区&output=json&ak=您的AK密钥 返回结果实例: { "status":0, "result": { "location":{"lng":116.79, "lat":

地图开发-地理编码&amp;反地理编码

1.地理编码: 就是把一个'地名字符串'转化成’经纬度' [geocoder geocodeAddressString:<#(NSString *)#> completionHandler:<#^(NSArray *placemarks, NSError *error)completionHandler#>] 2.反地理编码: 是把'经纬度’转换成’地名字符串' [geocoder reverseGeocodeLocation:<#(CLLocation *)#> co