第一部分: 根据经度纬度, 查找地理位置
#import "LocationViewController.h"
#import <CoreLocation/CoreLocation.h>
@interface LocationViewController () <CLLocationManagerDelegate>
@property (nonatomic,strong) CLLocationManager *locationMag; // 定位管理对象
- (IBAction)geocode:(UIButton *)sender;
@property (strong,nonatomic) IBOutletUITextField *addressField;
@property (strong,nonatomic) IBOutletUILabel *latitude;
@property (strong,nonatomic) IBOutletUILabel *longitude;
@property (strong,nonatomic) IBOutletUILabel *detailAdress;
@property (nonatomic,strong) CLGeocoder *geocoder;// 编码对象(工具)
// 反地理编码
- (IBAction)reverseGeocode:(UIButton *)sender;
@property (strong,nonatomic) IBOutletUITextField *latitudeTextField;
@property (strong,nonatomic) IBOutletUITextField *longitudeTextField;
@property (strong,nonatomic) IBOutletUILabel *reverseDetailAddress;
@end
// 若是用SB进行界面切换(传值)
// 方法一:直接在SB上用线拖拽 正常传值
// 方法二:不拖线 若有多个界面传值则在 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender方法中来区分给哪个界面传值 获取目标VC用-->segue.destinationViewController
@implementation LocationViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view.
self.navigationController.navigationBar.translucent = NO;
// 创建定位管理对象
_locationMag = [[CLLocationManageralloc] init];
// CLLocationManager 是通过delegate来实现实时定位的
_locationMag.delegate =self;
// 需要提示全权限(向系统申请定位权限)
[_locationMagrequestAlwaysAuthorization];
// [_locationMag requestWhenInUseAuthorization];
// 开始定位
[_locationMagstartUpdatingLocation];
#pragma mark----创建一个地理(反)编码
self.geocoder = [[CLGeocoderalloc]init];
}
#pragma mark - 实现CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = locations[0];
NSLog(@"纬度:%f,经度:%f", location.coordinate.latitude, location.coordinate.longitude);
NSLog(@"%@", locations);
// 为了省电,定位完毕之后, 关闭
[self.locationMagstopUpdatingLocation];
}
#pragma mark----地理编码
- (IBAction)geocode:(UIButton *)sender
{
[self.geocodergeocodeAddressString:self.addressField.textcompletionHandler:
^(NSArray *placemarks,NSError *error) {
if (error) {
self.detailAdress.text =@"你查找的地点在另一个星球";
}else{
// placemarks这个数组中存放的是 CLPlacemark 对象(位置对象,属性有: name, country, location)
NSDictionary *dic = [placemarks[0]addressDictionary];
NSLog(@"%@", dic[@"Country"]);
// 设置经纬度
CLPlacemark *placemark = placemarks[0];
self.latitude.text = [NSStringstringWithFormat:@"%lf", placemark.location.coordinate.latitude];
self.longitude.text = [NSStringstringWithFormat:@"%lf",placemark.location.coordinate.longitude];
// 地址详情
self.detailAdress.text = placemark.name;
}
}];
}
// 地理反编码
- (IBAction)reverseGeocode:(UIButton *)sender
{
// 创建一个 CLLocation对象
// 获取输入的纬度和经度,并转化为 double 类型
CLLocationDegrees latitude = [self.latitudeTextField.textdoubleValue];
CLLocationDegrees longitude = [self.longitudeTextField.textdoubleValue];
CLLocation *loc = [[CLLocationalloc]initWithLatitude:latitudelongitude:longitude];
[self.geocoderreverseGeocodeLocation:loc completionHandler:^(NSArray *placemarks,NSError *error) {
if (error) {
self.reverseDetailAddress.text =@"未获取到指定位置";
}else
{
// 取出数组中第一个 placemark对象
CLPlacemark * placemark = placemarks[0];
// 设置详细地址
self.reverseDetailAddress.text = placemark.name;
}
}];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self.viewendEditing:YES];
}