地圖篇-02.地理編碼,-02地理編碼

來源:互聯網
上載者:User

地圖篇-02.地理編碼,-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 @end18 19 @implementation GeocodViewController20 - (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.detailTextView56         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 @end18 19 @implementation ReverseCodeViewController20 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         //賦值給detailTextView53         self.detailTextView.text = cpl.name;54     }];55     56     57 }58 59 @end

運行:

在反地理編碼的時候要注意了:

1.如果輸入的經緯度,在地圖上是存在的,但是編碼失敗,不要著急,那是因為系統會自動判定你在哪個國家,然後你只被允許訪問這個國家內的經緯度.

2.反地理編碼的時候大家可能會發現,數組裡面只有一個值,這就印證了一個具體的經緯度的唯一性.

 

地理編碼和反地理編碼到這裡就結束了,希望能幫到大家,如果有什麼地方不足或者有錯誤的話請告訴我,我會第一時間糾正.謝謝...

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.