我们平时做地图定位,主要是靠经纬度来准确定位某个位置。
但是,我们是人啊,我们不是卫星啊。
用户在地图上查一个地方,我们总不能告诉他,这个地方是东经多少度,北纬多少度吧。
咱们好歹得告诉人家个地名不是?
这就是我们今天说的地理编码和地理反编码。
地理编码:你说个地名,比如“西湖”,我们给你返回它的经纬度,然后你通过查出来的这个经纬度去定位
反地理编码:我告诉你一个经纬度,你通过经度纬度返回地名。最好在插个大头针在地图上就更好了,啥叫大头针,咱们以后再说。
首先,我的界面是这个样纸的,就是两个按钮,拖线,生成两个方法
源代码如下
//
// ViewController.m
// Demo3_反地理编码
//
// Created by shiran on 16/3/23.
// Copyright © 2016年 shiran. All rights reserved.
//
#import "ViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()
//地理编码
@property(nonatomic,strong)CLGeocoder *geocoder;
@end
@implementation ViewController
-(CLGeocoder *)geocoder{
if (!_geocoder) {
_geocoder=[[CLGeocoder alloc]init];
}
return _geocoder;
}
//地理编码
- (IBAction)geocoder:(UIButton *)sender {
NSString *address=@"西湖";
if (address.length==0) {
return;
}
[self.geocoder geocodeAddressString:address completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (error==nil) {
for (CLPlacemark *placeMark in placemarks) {
NSLog(@"%@",placeMark.addressDictionary[@"City"]);
NSLog(@"%f,%f",placeMark.location.coordinate.latitude,placeMark.location.coordinate.longitude);
}
}
else
{
NSLog(@"%@",error);
}
}];
}
//反地理编码
- (IBAction)reverseGeocoder:(UIButton *)sender {
CLLocation *loc = [[CLLocation alloc]initWithLatitude:40 longitude:116];
[self.geocoder reverseGeocodeLocation:loc completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (error==nil) {
for (CLPlacemark *placemark in placemarks) {
NSLog(@"%@,%@",placemark.addressDictionary[@"City"],placemark.name);
}
}
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
点击 地理编码 按钮,控制台输出如下 ,因为我的模拟器是英文的,所以控制台打印也是英文的,就这么洋气^_^
看,南昌的经纬度和杭州的经纬度都出来了,看来不止杭州有个西湖,南昌也有西湖啊,长姿势吧^_^
点击 反地理编码 按钮,控制台输出如下
这里,根据我的经纬度返回的地址是北京门头沟