根据输入的地址跳转到百度地图或者高德地图进行路线导航

写在前面: 尽管精确度已然调至最佳, 但还是会有一定程度的定位误差, 作为开发者我已然尽力, 只能希望apple官方做些优化吧

输入目的地地址时最好填入区, 不然有时会定位不到
http://developer.baidu.com/map/wiki/index.php?title=uri/api/ios
这个网址是百度地图官方的, 提供web和ios跳转到百度地图app的各种url, 诸如可以输入起点终点进行导航, 或者把输入的地址显示在百度地图上等等

下面这个对地址反编译成经纬度就已经要用到了, 更别说后面的定位了
#import <CoreLocation/CoreLocation.h>

要调用自带的高德地图, 就要
#import <MapKit/MapKit.h>

我的demo控件只是创建了一个开始跳转到地图的按钮和输入目的地的textField而已

以下是属性

@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) UIButton *buttonOfBeginLocate;

//目的地经纬度
@property (nonatomic, assign) CGFloat longitude;
@property (nonatomic, assign) CGFloat latitude;

//目前所在地经纬度
@property (nonatomic, assign) CGFloat currentLatitude;
@property (nonatomic, assign) CGFloat currentLongitude;

@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) CLGeocoder *geocoder;

写俩懒加载

 #pragma mark - 懒加载
- (CLLocationManager *)locationManager{

    if (!_locationManager) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        // 设置定位精确度到米
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        // 设置过滤器为无
        _locationManager.distanceFilter = kCLDistanceFilterNone;
        // 一个是requestAlwaysAuthorization,一个是requestWhenInUseAuthorization
        [_locationManager requestWhenInUseAuthorization];//这句话ios8以上版本使用。

    }
    return _locationManager;
}

- (CLGeocoder *)geocoder{

    if (!_geocoder) {
        _geocoder = [[CLGeocoder alloc] init];
    }
    return _geocoder;
}

在button点击事件里

  - (void)beginLocate:(UIButton *)button{

   [self.locationManager startUpdatingLocation];

   [self translateAddress];

   //设备安装了百度地图
  if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"baidumap://map/"]]){
      [self dumpToBaidu];
  }
  //没安装百度地图, 跳转到自带的高德
  else{
      [self testAppleMapWithLatitude:_latitude longitude:_longitude];
  }
}


#pragma mark - 定位协议方法
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

    _currentLatitude = newLocation.coordinate.latitude;
    _currentLongitude = newLocation.coordinate.longitude;
    if (_currentLatitude && _currentLongitude) {
        [manager stopUpdatingLocation];
    }

}


#pragma mark - 目的地地址编译为经纬度. 
//地址尽量有区, 比如龙湖区
- (void)translateAddress{

    [self.geocoder geocodeAddressString:_textField.text completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    
        if (placemarks.count > 0 && error == nil) {
        
            CLPlacemark *placemark = placemarks.firstObject;
        
            _longitude = placemark.location.coordinate.longitude;
            _latitude = placemark.location.coordinate.latitude;
        
        }
        else if (placemarks.count == 0 && error == nil){
            NSLog(@"placemarks元素为0");
        }else if(error != nil){
            NSLog(@"an arror occurred = %@", error);
        }
    }];

}

#pragma mark - 跳转到百度地图
- (void)dumpToBaidu{

    //转成UTF8  [NSCharacterSet URLQueryAllowedCharacterSet]
    //四个参数分别是, 当前位置纬度, 经度, 目的地纬度, 经度
    NSString *url4 = [[NSString stringWithFormat:@"baidumap://map/direction?origin=%f,%f&destination=%f,%f&mode=driving&src=webapp.navi.yourCompanyName.yourAppName", _currentLatitude, _currentLongitude, _latitude, _longitude] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];

    //根据起点终点跳转到百度地图并进行驾车导航
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url4]];

}

#pragma mark - 跳转到苹果高德地图
-(void)testAppleMapWithLatitude:(CGFloat)latitude longitude:(CGFloat)longitude{

    //    CLLocationCoordinate2D coords1 = CLLocationCoordinate2DMake(30.691793,104.088264);

    //    CLLocationCoordinate2D coords2 = CLLocationCoordinate2DMake(30.691293,104.088264);


    CLLocationCoordinate2D coords1 = CLLocationCoordinate2DMake(_currentLatitude, _currentLongitude);

//    CLLocationCoordinate2D coords2 = CLLocationCoordinate2DMake(40.001,116.404);

    CLLocationCoordinate2D coords2 = CLLocationCoordinate2DMake(latitude, longitude);

    //这个判断我没试过, 现在也没几个用ios6了吧
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0){
    
        // ios6以下,调用google map {
    
        NSString *urlString = [[NSString alloc] initWithFormat:@"http://maps.google.com/maps?saddr=%f,%f&daddr=%f,%f&dirfl=d", coords1.latitude,coords1.longitude,coords2.latitude,coords2.longitude];
    
        NSURL *aURL = [NSURL URLWithString:urlString]; //打开网页google地图
    
        [[UIApplication sharedApplication] openURL:aURL];
    
        }else// 直接调用ios自己带的apple map
    
    {
    
        //当前的位置
    
        //    MKMapItem *currentLocation = [MKMapItem mapItemForCurrentLocation];
    
        //起点
    
        MKMapItem *currentLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:coords1 addressDictionary:nil]];
    currentLocation.name = @"目前位置";
    
    
        //目的地的位置
        MKMapItem *toLocation = [[MKMapItem alloc] initWithPlacemark:[[MKPlacemark alloc] initWithCoordinate:coords2 addressDictionary:nil]];
    
        //显示在地图上的目的地名称
        toLocation.name = @"目的地";
    
        NSArray *items = [NSArray arrayWithObjects:currentLocation, toLocation, nil];
    
        NSDictionary *options = @{
                              MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving, MKLaunchOptionsMapTypeKey: [NSNumber numberWithInteger:MKMapTypeStandard], MKLaunchOptionsShowsTrafficKey:@YES
                              }; //打开苹果自身地图应用,并呈现特定的item
    
        [MKMapItem openMapsWithItems:items launchOptions:options];
    
    }

}

最后感谢 http://blog.csdn.net/hengshujiyi/article/details/45560609 给我灵感

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,979评论 4 60
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,263评论 25 707
  • 昨晚夜班,见到宝贝已经九点多了,在外婆家,昨晚表现不是很好,把床尿湿了,和外婆接触比较少点,宝贝应该是有点不适应的...
    亲然阅读 245评论 0 0
  • 我是家里的老小,我从小是家里被照顾的那个,用伯父他们的话说,但我从来没有觉得自己是被照顾的,我只是不需要去干农...
    王翠英阅读 240评论 0 0
  • CGAffineTransform是一个映射转换3*3的矩阵,用来绘画2D图像。可以实现放大、缩小、平移。先看看其...
    yuandiLiao阅读 9,123评论 0 10