zoukankan      html  css  js  c++  java
  • 【百度地图安卓SDK】如何实现跨城驾车导航?例如从重庆到北京。

    摘要:驾车导航支持市内驾车,和跨城驾车。起点和终点的输入,支持关键字和经纬度两种形式。驾车同样有多种驾车策略。另外,步行导航与驾车导航类似,只需要更换接口名称即可。
    ----------------------------------------------------------------------
    系列阅读:
    1、【百度地图-安卓SDK】从头开始写android程序
    http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html 
    2、【“零起点”--百度地图手机SDK】如何创建一张地图
    http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html 
    3、【“零起点”--百度地图手机SDK】如何使用离线地图?
    http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html 
    4、【“零起点”--百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?
    http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html 
    5、【“零起点”--百度地图手机SDK】如何进行三种POI搜索?
    http://www.cnblogs.com/milkmap/archive/2012/06/05/2536764.html 
    6、【“零起点”--百度地图手机SDK】如何查询公交线路?如北京的104路
    http://www.cnblogs.com/milkmap/archive/2012/06/27/2554843.html

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

    http://www.cnblogs.com/milkmap/archive/2012/07/03/2574713.html 
    -----------------------------------------------------------------------

    一、驾车导航接口

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

    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();
        }
    }
  • 相关阅读:
    js实现继承的5种方式
    JavaScript文件操作(1)-基础
    12 个免费在线的 Web 网站性能测试工具
    server r2 系统更新文件清理
    在C#中,Json的序列化和反序列化的几种方式总结
    ES6,新增数据结构Set的用法
    ES6中有关数组的一些新操作
    vue中mode hash 和 history的区别
    POST和GET的区别
    前端的细节
  • 原文地址:https://www.cnblogs.com/milkmap/p/2576489.html
Copyright © 2011-2022 走看看