地圖篇-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.反地理編碼的時候大家可能會發現,數組裡面只有一個值,這就印證了一個具體的經緯度的唯一性.
地理編碼和反地理編碼到這裡就結束了,希望能幫到大家,如果有什麼地方不足或者有錯誤的話請告訴我,我會第一時間糾正.謝謝...