什么是地理编码和反地理编码?
地理编码
地理编码:根据给定的地名,获得具体的位置信息(比如经纬度、地址的全称等)。
反地理编码服务
反地理编码:根据给定的经纬度,获得具体的位置信息。
广州“市”天河“区”棠下“街”盛达商务园D座5楼------113.381048,23.138369: 地理编码
113.381048,23.138369------》广州“市”天河“区”棠下“街”盛达商务园D座5楼: 反地理编码
经纬度
经纬度介绍
本初子午线
穿过英国伦敦格林文治天文台
往东边(右边)走,是东经(E)
往西边(左边)走,是西经(W)
东西经各180°,总共360°
赤道
往北边(上边)走,是北纬(N)
往南边(下边)走,是南纬(S)
南北纬各90°,总共180°
横跨经度\纬度越大(1°≈111km)
表示的范围就越大
在地图上看到的东西就越小
模拟位置
设置经纬度最好使用真机测试,如果是模拟器,需要设置模拟位置(经纬度)如下图:
设置测试经纬度
提示:
帝都的经纬度是:北纬40°,东经116°
CLGeocoder
使用CLGeocoder可以完成“地理编码”和“反地理编码”
地理编码方法
-(void)geocodeAddressString:(NSString*)addressStringcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
反地理编码方法
-(void)reverseGeocodeLocation:(CLLocation*)locationcompletionHandler:(CLGeocodeCompletionHandler)completionHandler;
CLGeocodeCompletionHandler
当地理\反地理编码完成时,就会调用CLGeocodeCompletionHandler
typedefvoid(^CLGeocodeCompletionHandler)(NSArray*placemarks,NSError*error);
这个block传递2个参数
error:当编码出错时(比如编码不出具体的信息)有值
placemarks:里面装着CLPlacemark对象
CLPlacemark
CLPlacemark的字面意思是地标,封装详细的地址位置信息
@property(nonatomic,readonly)CLLocation*location; //地理位置
@property(nonatomic,readonly)CLRegion*region; //区域
@property(nonatomic,readonly)NSDictionary*addressDictionary; //详细的地址信息
@property(nonatomic,readonly)NSString*name; //地址名称
@property(nonatomic,readonly)NSString*locality; //城市
实例代码
/** 地理编码 */使用这个类来实现地理编码反地理编码转换
@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:经度];
//注:传经纬度时候需要传 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");
}}];
网友评论