地理编码是把某个具体的位置计算为经纬度,反地理编码正好相反。
效果:通过输入框的搜索,也能定位到具体的位置。长按地图,就能获得某个位置的详细地址。
- #import "ViewController.h"
- #import <MapKit/MapKit.h>
- @interface ViewController ()<CLLocationManagerDelegate,MKMapViewDelegate>
- @property (nonatomic, strong) MKMapView * mapView;
- @property (nonatomic, strong) CLLocationManager * locationManager;
- @property (nonatomic, strong) UITextField * textField;
- @property (nonatomic, strong) NSString * titleString;
- @end
- @implementation ViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- // 116.456011,39.941272
- _mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
- [_mapView setDelegate:self];
- [_mapView setShowsUserLocation:YES];
- [_mapView setMapType:MKMapTypeStandard];
- [self.view addSubview:_mapView];
- UILongPressGestureRecognizer * longpressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)];
- [_mapView addGestureRecognizer:longpressGestureRecognizer];
- _textField = [[UITextField alloc] init];
- [_textField setTranslatesAutoresizingMaskIntoConstraints:NO];
- [_textField setBackgroundColor:[UIColor whiteColor]];
- [self.view addSubview:_textField];
- UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom];
- [btn setBackgroundColor:[UIColor orangeColor]];
- [btn setTitle:@"查找" forState:UIControlStateNormal];
- [btn setTranslatesAutoresizingMaskIntoConstraints:NO];
- [btn addTarget:self action:@selector(theBtnPressed:) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:btn];
- [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[_textField][btn(100)]-20-|"
- options:0
- metrics:nil
- views:NSDictionaryOfVariableBindings(_textField,btn)]];
- [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[_textField(30)]-(-30)-[btn(30)]"
- options:0
- metrics:nil
- views:NSDictionaryOfVariableBindings(_textField,btn)]];
- //检测定位功能是否开启
- if([CLLocationManager locationServicesEnabled]){
- if(!_locationManager){
- _locationManager = [[CLLocationManager alloc] init];
- if([_locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]){
- [_locationManager requestWhenInUseAuthorization];
- [_locationManager requestAlwaysAuthorization];
- }
- //设置代理
- [_locationManager setDelegate:self];
- //设置定位精度
- [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
- //设置距离筛选
- [_locationManager setDistanceFilter:100];
- //开始定位
- [_locationManager startUpdatingLocation];
- //设置开始识别方向
- [_locationManager startUpdatingHeading];
- }
- }else{
- UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:nil
- message:@"您没有开启定位功能"
- delegate:nil
- cancelButtonTitle:@"确定"
- otherButtonTitles:nil, nil nil];
- [alertView show];
- }
- }
- //点击按钮执行此方法
- - (void)theBtnPressed:(id)sender {
- [_textField resignFirstResponder];
- if([_textField.text length] == 0){
- return;
- }
- [self geocoder:_textField.text];
- }
- #pragma mark LongPress
- - (void)longPressed:(UILongPressGestureRecognizer *)recognizer {
- if(recognizer.state == UIGestureRecognizerStateBegan){
- CGPoint point = [recognizer locationInView:_mapView];
- CLLocationCoordinate2D coordinate2D = [_mapView convertPoint:point toCoordinateFromView:_mapView];
- [_mapView removeAnnotations:_mapView.annotations];
- CLLocation * location = [[CLLocation alloc] initWithLatitude:coordinate2D.latitude longitude:coordinate2D.longitude];
- [self reverseGeocoder:location];
- // MKPointAnnotation * pointAnnotation = [[MKPointAnnotation alloc] init];
- // [pointAnnotation setTitle:_titleString];
- // [pointAnnotation setCoordinate:coordinate2D];
- // [_mapView addAnnotation:pointAnnotation];
- }
- }
- //授权状态发生改变的时候执行
- - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
- switch(status){
- case kCLAuthorizationStatusDenied:
- {
- UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:nil
- message:@"定位功能没有开启" delegate:nil
- cancelButtonTitle:@"确定" otherButtonTitles:nil, nil nil];
- [alertView show];
- }
- break;
- default:
- break;
- }
- }
- #pragma mark mapViewDelegate
- - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
- static NSString * key = @"key";
- MKPinAnnotationView * pinAnnotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:key];
- if(pinAnnotationView == nil){
- pinAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:key];
- [pinAnnotationView setCanShowCallout:YES];
- }
- if([annotation isKindOfClass:[MKUserLocation class]]){
- [pinAnnotationView setPinColor:MKPinAnnotationColorRed];
- [((MKUserLocation *)annotation) setTitle:_titleString];
- }else{
- [pinAnnotationView setPinColor:MKPinAnnotationColorPurple];
- }
- return pinAnnotationView;
- }
- #pragma mark - CLLocationManangerDelegate
- //定位成功以后调用
- - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
- [_locationManager stopUpdatingLocation];
- CLLocation * location = locations.lastObject;
- MKCoordinateRegion coordinateRegion = MKCoordinateRegionMake(CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), MKCoordinateSpanMake(0.1, 0.1));
- [_mapView setRegion:[_mapView regionThatFits:coordinateRegion] animated:YES];
- // [self reverseGeocoder:location];
- }
- - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
- NSLog(@"error:%@",error);
- }
- #pragma mark Geocoder
- //反地理编码
- - (void)reverseGeocoder:(CLLocation *)currentLocation {
- CLGeocoder * geocoder = [[CLGeocoder alloc] init];
- [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) {
- if(error || placemarks.count == 0){
- NSLog(@"error");
- }else{
- CLPlacemark * placemark = placemarks.firstObject;
- self.titleString = placemark.name;
- MKPointAnnotation * pointAnnotation = [[MKPointAnnotation alloc] init];
- [pointAnnotation setTitle:placemark.name];
- [pointAnnotation setCoordinate:CLLocationCoordinate2DMake(placemark.location.coordinate.latitude, placemark.location.coordinate.longitude)];
- [_mapView addAnnotation:pointAnnotation];
- NSLog(@"placemark:%@",[[placemark addressDictionary] objectForKey:@"City"]);
- }
- }];
- }
- //地理编码
- - (void)geocoder:(NSString *)str {
- CLGeocoder * geocoder = [[CLGeocoder alloc] init];
- [geocoder geocodeAddressString:str completionHandler:^(NSArray *placemarks, NSError *error) {
- if(error || placemarks.count == 0){
- NSLog(@"error");
- }else{
- CLPlacemark * placemark = placemarks.firstObject;
- MKCoordinateRegion coordinateRegion = MKCoordinateRegionMake(CLLocationCoordinate2DMake(placemark.location.coordinate.latitude, placemark.location.coordinate.longitude), MKCoordinateSpanMake(0.1, 0.1));
- [_mapView setRegion:[_mapView regionThatFits:coordinateRegion] animated:YES];
- MKPointAnnotation * pointAnnotation = [[MKPointAnnotation alloc] init];
- [pointAnnotation setTitle:placemark.name];
- [pointAnnotation setCoordinate:CLLocationCoordinate2DMake(placemark.location.coordinate.latitude, placemark.location.coordinate.longitude)];
- [_mapView addAnnotation:pointAnnotation];
- }
- }];
- }
- - (void)didReceiveMemoryWarning {
- [super didReceiveMemoryWarning];
- // Dispose of any resources that can be recreated.
- }
- @end
参考:http://blog.csdn.net/chenyufeng1991/article/details/48596791