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();
        }
    }
  • 相关阅读:
    HTML DOM教程 14HTML DOM Document 对象
    HTML DOM教程 19HTML DOM Button 对象
    HTML DOM教程 22HTML DOM Form 对象
    HTML DOM教程 16HTML DOM Area 对象
    ubuntu 11.04 问题 小结
    VC6.0的 错误解决办法 小结
    boot.img的解包与打包
    shell里 截取字符串
    从零 使用vc
    Imagemagick 对图片 大小 和 格式的 调整
  • 原文地址:https://www.cnblogs.com/milkmap/p/2576489.html
Copyright © 2011-2022 走看看