博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【百度地图-安卓SDK】如何实现跨城驾车导航?例如从重庆到北京。
阅读量:6315 次
发布时间:2019-06-22

本文共 6781 字,大约阅读时间需要 22 分钟。

摘要:驾车导航支持市内驾车,和跨城驾车。起点和终点的输入,支持关键字和经纬度两种形式。驾车同样有多种驾车策略。另外,步行导航与驾车导航类似,只需要更换接口名称即可。

----------------------------------------------------------------------
系列阅读:
1、【百度地图-安卓SDK】从头开始写android程序
 
2、【“零起点”--百度地图手机SDK】如何创建一张地图
 
3、【“零起点”--百度地图手机SDK】如何使用离线地图?
 
4、【“零起点”--百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?
 
5、【“零起点”--百度地图手机SDK】如何进行三种POI搜索?
 
6、【“零起点”--百度地图手机SDK】如何查询公交线路?如北京的104路

7、【“零起点”--百度地图手机SDK】如何查询从西单到王府井的公交导航?

 

-----------------------------------------------------------------------

 

一、驾车导航接口

 

申明变量和初始化搜索服务接口

MapView mMapView = null;  //activity内顶部书写myMKSearch = new MKSearch();  //实例化,oncreate函数里书写

 

驾车导航接口

 

1、起点和终点是string

这里需要注意的是,如果你采取的是string形式的起点和终点,就必须设置城市,且必须要保证string是POI信息点的title。否则,会搜索不到结果。

建议使用POI搜索接口,先找到POI点,再取它的title或者point。

MKPlanNode start = new MKPlanNode();MKPlanNode end = new MKPlanNode();start.name = "国家体育场北路";end.name = "重庆朝天门广场";myMKSearch.drivingSearch("北京", start, "重庆", end);

 

2、如果起点和终点直接是point形式,则可以不用设置城市,也不用这个point必须是POI数据。

MKPlanNode start = new MKPlanNode();MKPlanNode end = new MKPlanNode();start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));end.pt = new GeoPoint(40057031, 116307852);mMKSearch.drivingSearch(null, start, null, end);

 

3、驾车策略有如下几种

 ECAR_TIME_FIRST:时间优先;

ECAR_DIS_FIRST:距离最短;

ECAR_FEE_FIRST:费用最少

myMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);//驾车策略:时间优先、费用最少或距离最短

 

二、回调函数设置

回调函数里,只要先判断“是否有搜索结果”。然后搜索到结果之后,需要“刷新地图”。

  myMKSearch.init(mBMapMan, new MKSearchListener(){            public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {                if (error != 0 || res == null) {                    Toast.makeText(DrivingActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();                    return;                }                 RouteOverlay routeOverlay = new RouteOverlay(DrivingActivity.this, mMapView);                 routeOverlay.setData(res.getPlan(0).getRoute(0));// 此处仅展示一个方案作为示例                 mMapView.getOverlays().add(routeOverlay);//添加路线覆盖物                 mMapView.invalidate();  //刷新地图            }......                });

 

 

三、运行结果

 

 

四、全部源代码

我这里只给出了java的代码,其他文件的修改需要参考第二章《如何创建一张地图》

package com.baidu.driving;import android.app.Activity;import android.os.Bundle;/** 引入import **/import java.util.ArrayList;import java.util.List; import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Point;import android.graphics.drawable.Drawable;import android.location.Location;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Toast; import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.GeoPoint;import com.baidu.mapapi.ItemizedOverlay;import com.baidu.mapapi.LocationListener;import com.baidu.mapapi.MKAddrInfo;import com.baidu.mapapi.MKBusLineResult;import com.baidu.mapapi.MKDrivingRouteResult;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.MKLocationManager;import com.baidu.mapapi.MKPlanNode;import com.baidu.mapapi.MKPoiResult;import com.baidu.mapapi.MKSearch;import com.baidu.mapapi.MKSearchListener;import com.baidu.mapapi.MKSuggestionResult;import com.baidu.mapapi.MKTransitRouteResult;import com.baidu.mapapi.MKWalkingRouteResult;import com.baidu.mapapi.MapActivity;import com.baidu.mapapi.MapController;import com.baidu.mapapi.MapView;import com.baidu.mapapi.MyLocationOverlay;import com.baidu.mapapi.Overlay;import com.baidu.mapapi.OverlayItem;import com.baidu.mapapi.PoiOverlay;import com.baidu.mapapi.RouteOverlay;import com.baidu.mapapi.TransitOverlay;public class DrivingActivity extends MapActivity {    /** 申明变量 **/    BMapManager mBMapMan = null;    MKSearch myMKSearch = null;    //POI搜索    MapView mMapView = null;        /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                /** 创建地图 **/        mBMapMan = new BMapManager(getApplication());        mBMapMan.init("1713A92A7A0C854D1B8717670EF8B6CA75696567", null);        super.initMapActivity(mBMapMan);                 mMapView = (MapView) findViewById(R.id.bmapsView);//地图控件,不添加的话,就不用写。        mMapView.setBuiltInZoomControls(true);  //设置启用内置的缩放控件        MapController mMapController = mMapView.getController();  // 得到mMapView的控制权,可以用它控制和驱动平移和缩放        GeoPoint point = new GeoPoint((int) (39.915 * 1E6),                (int) (116.404 * 1E6));  //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)        mMapController.setCenter(point);  //设置地图中心点        mMapController.setZoom(5);    //设置地图zoom级别             myMKSearch = new MKSearch();  //实例化                /** 回调函数 **/                myMKSearch.init(mBMapMan, new MKSearchListener(){            @Override            public void onGetPoiResult(MKPoiResult result, int type, int iError) {            }            public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) {                if (error != 0 || res == null) {                    Toast.makeText(DrivingActivity.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();                    return;                }                 RouteOverlay routeOverlay = new RouteOverlay(DrivingActivity.this, mMapView);                 routeOverlay.setData(res.getPlan(0).getRoute(0));// 此处仅展示一个方案作为示例                 mMapView.getOverlays().add(routeOverlay);//添加路线覆盖物                 mMapView.invalidate();  //刷新地图            }            public void onGetTransitRouteResult(MKTransitRouteResult res,int error) {            }            public void onGetWalkingRouteResult(MKWalkingRouteResult res,int error) {            }            public void onGetAddrResult(MKAddrInfo res, int error) {            }            @Override            public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {                        }            @Override            public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {                        }                    });                          MKPlanNode start = new MKPlanNode();      MKPlanNode end = new MKPlanNode();      start.name = "国家体育场北路";      end.name = "重庆朝天门广场";      myMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);//驾车策略:时间优先、费用最少或距离最短      myMKSearch.drivingSearch("北京", start, "重庆", end);    }        @Override    protected boolean isRouteDisplayed() {        return false;    }        /** 引入方法管理API **/    @Override    protected void onDestroy() {        if (mBMapMan != null) {            mBMapMan.destroy();            mBMapMan = null;        }        super.onDestroy();    }    @Override    protected void onPause() {        if (mBMapMan != null) {            mBMapMan.stop();        }        super.onPause();    }    @Override    protected void onResume() {        if (mBMapMan != null) {            mBMapMan.start();        }        super.onResume();    }}

转载地址:http://yxkaa.baihongyu.com/

你可能感兴趣的文章
自适应网页布局经验
查看>>
Ubuntu apache 禁止目录浏览
查看>>
常用脚本--归档ERRORLOG
查看>>
js网页倒计时精确到秒级
查看>>
常用CSS缩写语法总结
查看>>
TDD:什么是桩(stub)和模拟(mock)?
查看>>
C# 模拟POST提交文件
查看>>
PAT 解题报告 1004. Counting Leaves (30)
查看>>
Android开发之蓝牙 --修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备
查看>>
[Head First设计模式]生活中学设计模式——外观模式
查看>>
Repository模式中,Update总是失败及其解析
查看>>
.Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序
查看>>
[原创]浅谈测试团队转型,思维模式的转变是关键
查看>>
Redis学习-SortedSet
查看>>
android CoordinatorLayout使用
查看>>
机器学习资料大汇总
查看>>
Python selenium 滚动条 详解
查看>>
poj1035Spell checker
查看>>
微信程序开发
查看>>
如何退出minicom【学习笔记】
查看>>