什么是地理編碼和反地理編碼?
地理編碼
地理編碼:根據(jù)給定的地名,獲得具體的位置信息(比如經(jīng)緯度宵喂、地址的全稱等)蝌矛。
反地理編碼服務(wù)
反地理編碼:根據(jù)給定的經(jīng)緯度凄杯,獲得具體的位置信息。
廣州“市”天河“區(qū)”棠下“街”盛達(dá)商務(wù)園D座5樓------113.381048,23.138369: 地理編碼
113.381048,23.138369------》廣州“市”天河“區(qū)”棠下“街”盛達(dá)商務(wù)園D座5樓: 反地理編碼
經(jīng)緯度
本初子午線
穿過英國倫敦格林文治天文臺?
往東邊(右邊)走菠秒,是東經(jīng)(E)
往西邊(左邊)走疙剑,是西經(jīng)(W)
東西經(jīng)各180°,總共360°
赤道
往北邊(上邊)走践叠,是北緯(N)
往南邊(下邊)走言缤,是南緯(S)
南北緯各90°,總共180°
橫跨經(jīng)度\緯度越大(1°≈111km)
表示的范圍就越大
在地圖上看到的東西就越小
模擬位置
最好使用真機(jī)測試,如果是模擬器禁灼,需要設(shè)置模擬位置(經(jīng)緯度)如下圖:
提示:
帝都的經(jīng)緯度是:北緯40°管挟,東經(jīng)116°
CLGeocoder
使用CLGeocoder可以完成“地理編碼”和“反地理編碼”
地理編碼方法
-(void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
反地理編碼方法
-(void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
CLGeocodeCompletionHandler
當(dāng)?shù)乩韁反地理編碼完成時,就會調(diào)用CLGeocodeCompletionHandler
typedefvoid(^CLGeocodeCompletionHandler)(NSArray*placemarks,NSError*error);
這個block傳遞2個參數(shù)
error:當(dāng)編碼出錯時(比如編碼不出具體的信息)有值
placemarks:里面裝著CLPlacemark對象
CLPlacemark
CLPlacemark的字面意思是地標(biāo)弄捕,封裝詳細(xì)的地址位置信息
@property(nonatomic,readonly)CLLocation*location; //地理位置
@property(nonatomic,readonly)CLRegion*region; //區(qū)域
@property(nonatomic,readonly)NSDictionary*addressDictionary; //詳細(xì)的地址信息
@property(nonatomic,readonly)NSString*name; //地址名稱
@property(nonatomic,readonly)NSString*locality; //城市
實例代碼
/** 地理編碼 */使用這個類來實現(xiàn)地理編碼反地理編碼轉(zhuǎn)換
@property (nonatomic, strong) CLGeocoder *geoC;
懶加載
- (CLGeocoder *)geoC{
?? if (!_geoC) {
? _geoC = [[CLGeocoder alloc] init];
}
? return _geoC;}
地理編碼
[self.geoC geocodeAddressString:城市名稱 completionHandler:^(NSArray* _Nullable placemarks, NSError * _Nullable error) {
if(error == nil)
{
NSLog(@"%@", placemarks);
[placemarks enumerateObjectsUsingBlock:^(CLPlacemark * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj.name);
NSString *cityStr = obj.name;
NSString *latitudeStr = @(obj.location.coordinate.latitude).stringValue;
NSString *longitudeStr = @(obj.location.coordinate.longitude).stringValue;
}];
}else{
NSLog(@"cuowu--%@", error.localizedDescription);
}
}];
反地理編碼
CLLocation *loc = [[CLLocation alloc] initWithLatitude:緯度 longitude:經(jīng)度];
//注:傳經(jīng)緯度時候需要傳 double類型
[self.geoC reverseGeocodeLocation:loc completionHandler:^(NSArray* _Nullable placemarks, NSError * _Nullable error) {if(error == nil)
{
NSLog(@"%@", placemarks);
[placemarks enumerateObjectsUsingBlock:^(CLPlacemark * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj.name);
NSString *cityStr = obj.name;
NSString *latitudeStr = @(obj.location.coordinate.latitude).stringValue;
NSString *longitudeStr = @(obj.location.coordinate.longitude).stringValue;
}];
}else
{
NSLog(@"cuowu");
}}];