• AndroidStudio下加入百度地图的使用(四)——路线规划


    上一章中我们已经完成了API常用的方法及常量属性的使用,这一章向大家介绍一下地图的重要功能-路线规划。

    (1) 定义API中的路线查询类:

    RoutePlanSearch  mSearch = RoutePlanSearch.newInstance();
    mSearch.drivingSearch().;//驾车路线
    mSearch.transitSearch();//公交路线
    mSearch.walkingSearch();//步行路线

    (2) 设置起点和终点

    PlanNode stNode = PlanNode.withCityNameAndPlaceName("",“”)      PlanNode  enNode  =  PlanNode.withCityNameAndPlaceName("", “”);

    (3) 实现OnGetRoutePlanResultListener监听

    当路线结果发生变化的时候要重写 驾车路线 公交路线 步行路线这3个方法

    public void onGetTransitRouteResult(TransitRouteResult result) {}
    public void onGetWalkingRouteResult(WalkingRouteResult result) {}
    public void onGetDrivingRouteResult(DrivingRouteResult result) {}

    效果:

    下面我们来具体使用一下

    第一步:编写布局,没有什么特殊的地方

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="起点:" />
            <EditText
                android:id="@+id/start"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:ems="10"
                android:text="烟台莱山区科技大厦" >
                <requestFocus />
            </EditText>
        </LinearLayout>
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="终点:" />
            <EditText
                android:id="@+id/end"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:ems="10"
                android:text="烟台大学" >
                <requestFocus />
            </EditText>
        </LinearLayout>
        <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dip"
            android:layout_marginTop="5dip"
            android:orientation="horizontal" >
            <Button
                android:id="@+id/drive"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginLeft="2dip"
                android:layout_marginRight="2dip"
                android:layout_weight="1.0"
                android:onClick="SearchButtonProcess"
                android:text="驾车搜索" />
            <Button
                android:id="@+id/transit"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginLeft="2dip"
                android:layout_marginRight="2dip"
                android:layout_weight="1.0"
                android:onClick="SearchButtonProcess"
                android:text="公交搜索" />
            <Button
                android:id="@+id/walk"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_marginLeft="2dip"
                android:layout_marginRight="2dip"
                android:layout_weight="1.0"
                android:onClick="SearchButtonProcess"
                android:text="步行搜索" />
        </LinearLayout>
        <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
            <com.baidu.mapapi.map.MapView
                android:id="@+id/map"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:clickable="true" />
            <LinearLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:layout_alignWithParentIfMissing="false"
                android:layout_marginRight="10dp"
                android:layout_marginTop="10dip"
                android:orientation="vertical" >
                <Button
                    android:id="@+id/customicon"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_marginTop="10dip"
                    android:layout_weight="1.0"
                    android:onClick="changeRouteIcon"
                    android:text="自定义起终点图标" />
            </LinearLayout>
            <LinearLayout
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignWithParentIfMissing="false"
                android:layout_centerHorizontal="true"
                android:layout_centerVertical="false"
                android:layout_marginBottom="10dip" >
                <Button
                    android:id="@+id/pre"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_marginLeft="2dip"
                    android:layout_marginRight="2dip"
                    android:layout_weight="1.0"
                    android:background="@drawable/pre_"
                    android:onClick="nodeClick" />
                <Button
                    android:id="@+id/next"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_marginLeft="2dip"
                    android:layout_marginRight="2dip"
                    android:layout_weight="1.0"
                    android:background="@drawable/next_"
                    android:onClick="nodeClick" />
            </LinearLayout>
        </RelativeLayout>
    </LinearLayout>

    第二步: 在Activity中实现功能(完整代码)

    package com.jerehedu.administrator.baidumapapplication;
    import android.app.Activity;
    import android.location.Geocoder;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.baidu.mapapi.SDKInitializer;
    import com.baidu.mapapi.map.BaiduMap;
    import com.baidu.mapapi.map.BitmapDescriptor;
    import com.baidu.mapapi.map.BitmapDescriptorFactory;
    import com.baidu.mapapi.map.InfoWindow;
    import com.baidu.mapapi.map.MapPoi;
    import com.baidu.mapapi.map.MapStatus;
    import com.baidu.mapapi.map.MapStatusUpdate;
    import com.baidu.mapapi.map.MapStatusUpdateFactory;
    import com.baidu.mapapi.map.MapView;
    import com.baidu.mapapi.map.MyLocationConfigeration;
    import com.baidu.mapapi.model.LatLng;
    
    import com.baidu.mapapi.overlayutil.DrivingRouteOvelray;
    import com.baidu.mapapi.overlayutil.OverlayManager;
    import com.baidu.mapapi.overlayutil.TransitRouteOverlay;
    import com.baidu.mapapi.overlayutil.WalkingRouteOverlay;
    import com.baidu.mapapi.search.core.RouteLine;
    import com.baidu.mapapi.search.core.SearchResult;
    import com.baidu.mapapi.search.route.DrivingRouteLine;
    import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
    import com.baidu.mapapi.search.route.DrivingRouteResult;
    import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
    import com.baidu.mapapi.search.route.PlanNode;
    import com.baidu.mapapi.search.route.RoutePlanSearch;
    import com.baidu.mapapi.search.route.TransitRouteLine;
    import com.baidu.mapapi.search.route.TransitRoutePlanOption;
    import com.baidu.mapapi.search.route.TransitRouteResult;
    import com.baidu.mapapi.search.route.WalkingRouteLine;
    import com.baidu.mapapi.search.route.WalkingRoutePlanOption;
    import com.baidu.mapapi.search.route.WalkingRouteResult;
    public class RoutePlanDemo extends Activity implements BaiduMap.OnMapClickListener,
            OnGetRoutePlanResultListener {
        //浏览路线节点相关
        Button mBtnPre = null;//上一个节点
        Button mBtnNext = null;//下一个节点
        int nodeIndex = -1;//节点索引,供浏览节点时使用
        RouteLine route = null;
        OverlayManager routeOverlay = null;
        boolean useDefaultIcon = false;
        private TextView popupText = null;
    
        //地图相关,使用继承MapView的MyRouteMapView目的是重写touch事件实现泡泡处理
        //如果不处理touch事件,则无需继承,直接使用MapView即可
        MapView mMapView = null;    // 地图View
        BaiduMap mBaidumap = null;
        //搜索相关
        RoutePlanSearch mSearch = null;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            SDKInitializer.initialize(getApplicationContext());
            setContentView(R.layout.activity_routeplan);
            CharSequence titleLable = "路线规划功能";
            setTitle(titleLable);
            //初始化地图
            mMapView = (MapView) findViewById(R.id.map);
            mBaidumap = mMapView.getMap();
    
            //设定中心点坐标
            LatLng cenpt = new LatLng(37.52,121.39);
            //定义地图状态
            MapStatus mMapStatus = new MapStatus.Builder()
                    .target(cenpt)
                    .build();
            //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
            MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
            //改变地图状态
            mBaidumap.setMapStatus(mMapStatusUpdate);
            mBtnPre = (Button) findViewById(R.id.pre);
            mBtnNext = (Button) findViewById(R.id.next);
            mBtnPre.setVisibility(View.INVISIBLE);
            mBtnNext.setVisibility(View.INVISIBLE);
            //地图点击事件处理
            mBaidumap.setOnMapClickListener(this);
            // 初始化搜索模块,注册事件监听
            mSearch = RoutePlanSearch.newInstance();
            mSearch.setOnGetRoutePlanResultListener(this);
        }
    
        /**
         * 发起路线规划搜索示例
         *
         * @param v
         */
        public void SearchButtonProcess(View v) {
            //重置浏览节点的路线数据
            route = null;
            mBtnPre.setVisibility(View.INVISIBLE);
            mBtnNext.setVisibility(View.INVISIBLE);
            mBaidumap.clear();
            // 处理搜索按钮响应
            EditText editSt = (EditText) findViewById(R.id.start);
            EditText editEn = (EditText) findViewById(R.id.end);
            //设置起终点信息,对于tranist search 来说,城市名无意义
            PlanNode stNode = PlanNode.withCityNameAndPlaceName("烟台", editSt.getText().toString());
            PlanNode enNode = PlanNode.withCityNameAndPlaceName("烟台", editEn.getText().toString());
    
            // 实际使用中请对起点终点城市进行正确的设定
            if (v.getId() == R.id.drive) {
                mSearch.drivingSearch((new DrivingRoutePlanOption())
                        .from(stNode)
                        .to(enNode));
            } else if (v.getId() == R.id.transit) {
                mSearch.transitSearch((new TransitRoutePlanOption())
                        .from(stNode)
                        .city("烟台")
                        .to(enNode));
            } else if (v.getId() == R.id.walk) {
                mSearch.walkingSearch((new WalkingRoutePlanOption())
                        .from(stNode)
                        .to(enNode));
            }
        }
    
        /**
         * 节点浏览示例
         *
         * @param v
         */
        public void nodeClick(View v) {
            if (route == null ||
                    route.getAllStep() == null) {
                return;
            }
            if (nodeIndex == -1 && v.getId() == R.id.pre) {
                return;
            }
            //设置节点索引
            if (v.getId() == R.id.next) {
                if (nodeIndex < route.getAllStep().size() - 1) {
                    nodeIndex++;
                } else {
                    return;
                }
            } else if (v.getId() == R.id.pre) {
                if (nodeIndex > 0) {
                    nodeIndex--;
                } else {
                    return;
                }
            }
            //获取节结果信息
            LatLng nodeLocation = null;
            String nodeTitle = null;
            Object step = route.getAllStep().get(nodeIndex);
            if (step instanceof DrivingRouteLine.DrivingStep) {
                nodeLocation = ((DrivingRouteLine.DrivingStep) step).getEntrace().getLocation();
                nodeTitle = ((DrivingRouteLine.DrivingStep) step).getInstructions();
            } else if (step instanceof WalkingRouteLine.WalkingStep) {
                nodeLocation = ((WalkingRouteLine.WalkingStep) step).getEntrace().getLocation();
                nodeTitle = ((WalkingRouteLine.WalkingStep) step).getInstructions();
            } else if (step instanceof TransitRouteLine.TransitStep) {
                nodeLocation = ((TransitRouteLine.TransitStep) step).getEntrace().getLocation();
                nodeTitle = ((TransitRouteLine.TransitStep) step).getInstructions();
            }
    
            if (nodeLocation == null || nodeTitle == null) {
                return;
            }
            //移动节点至中心
            mBaidumap.setMapStatus(MapStatusUpdateFactory.newLatLng(nodeLocation));
            // show popup
            popupText = new TextView(RoutePlanDemo.this);
            popupText.setBackgroundResource(R.drawable.popup);
            popupText.setTextColor(0xFF000000);
            popupText.setText(nodeTitle);
            mBaidumap.showInfoWindow(new InfoWindow(popupText, nodeLocation,null));
    
        }
    
        /**
         * 切换路线图标,刷新地图使其生效
         * 注意: 起终点图标使用中心对齐.
         */
        public void changeRouteIcon(View v) {
            if (routeOverlay == null) {
                return;
            }
            if (useDefaultIcon) {
                ((Button) v).setText("自定义起终点图标");
                Toast.makeText(this,
                        "将使用系统起终点图标",
                        Toast.LENGTH_SHORT).show();
    
            } else {
                ((Button) v).setText("系统起终点图标");
                Toast.makeText(this,
                        "将使用自定义起终点图标",
                        Toast.LENGTH_SHORT).show();
    
            }
            useDefaultIcon = !useDefaultIcon;
            routeOverlay.removeFromMap();
            routeOverlay.addToMap();
        }
    
    
        @Override
        protected void onRestoreInstanceState(Bundle savedInstanceState) {
            super.onRestoreInstanceState(savedInstanceState);
        }
    
        @Override
        public void onGetWalkingRouteResult(WalkingRouteResult result) {
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                //起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                //result.getSuggestAddrInfo()
                return;
            }
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                nodeIndex = -1;
                mBtnPre.setVisibility(View.VISIBLE);
                mBtnNext.setVisibility(View.VISIBLE);
                route = result.getRouteLines().get(0);
                WalkingRouteOverlay overlay = new MyWalkingRouteOverlay(mBaidumap);
                mBaidumap.setOnMarkerClickListener(overlay);
                routeOverlay = overlay;
                overlay.setData(result.getRouteLines().get(0));
                overlay.addToMap();
                overlay.zoomToSpan();
            }
    
        }
    
        @Override
        public void onGetTransitRouteResult(TransitRouteResult result) {
    
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                //起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                //result.getSuggestAddrInfo()
                return;
            }
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                nodeIndex = -1;
                mBtnPre.setVisibility(View.VISIBLE);
                mBtnNext.setVisibility(View.VISIBLE);
                route = result.getRouteLines().get(0);
                TransitRouteOverlay overlay = new MyTransitRouteOverlay(mBaidumap);
                mBaidumap.setOnMarkerClickListener(overlay);
                routeOverlay = overlay;
                overlay.setData(result.getRouteLines().get(0));
                overlay.addToMap();
                overlay.zoomToSpan();
            }
        }
    
        @Override
        public void onGetDrivingRouteResult(DrivingRouteResult result) {
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                Toast.makeText(RoutePlanDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
            }
            if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
                //起终点或途经点地址有岐义,通过以下接口获取建议查询信息
                //result.getSuggestAddrInfo()
                return;
            }
            if (result.error == SearchResult.ERRORNO.NO_ERROR) {
                nodeIndex = -1;
                mBtnPre.setVisibility(View.VISIBLE);
                mBtnNext.setVisibility(View.VISIBLE);
                route = result.getRouteLines().get(0);
                DrivingRouteOvelray overlay = new MyDrivingRouteOverlay(mBaidumap);
                routeOverlay = overlay;
                mBaidumap.setOnMarkerClickListener(overlay);
                overlay.setData(result.getRouteLines().get(0));
                overlay.addToMap();
                overlay.zoomToSpan();
            }
        }
    
        //定制RouteOverly
        private class MyDrivingRouteOverlay extends DrivingRouteOvelray {
    
            public MyDrivingRouteOverlay(BaiduMap baiduMap) {
                super(baiduMap);
            }
    
            @Override
            public BitmapDescriptor getStartMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
                }
                return null;
            }
    
            @Override
            public BitmapDescriptor getTerminalMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
                }
                return null;
            }
        }
    
        private class MyWalkingRouteOverlay extends WalkingRouteOverlay {
    
            public MyWalkingRouteOverlay(BaiduMap baiduMap) {
                super(baiduMap);
            }
    
            @Override
            public BitmapDescriptor getStartMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
                }
                return null;
            }
    
            @Override
            public BitmapDescriptor getTerminalMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
                }
                return null;
            }
        }
    
        private class MyTransitRouteOverlay extends TransitRouteOverlay {
    
            public MyTransitRouteOverlay(BaiduMap baiduMap) {
                super(baiduMap);
            }
    
            @Override
            public BitmapDescriptor getStartMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
                }
                return null;
            }
    
            @Override
            public BitmapDescriptor getTerminalMarker() {
                if (useDefaultIcon) {
                    return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
                }
                return null;
            }
        }
    
        @Override
        public void onMapClick(LatLng point) {
            mBaidumap.hideInfoWindow();
        }
    
        @Override
        public boolean onMapPoiClick(MapPoi poi) {
            return false;
        }
    
        @Override
        protected void onPause() {
            mMapView.onPause();
            super.onPause();
        }
    
        @Override
        protected void onResume() {
            mMapView.onResume();
            super.onResume();
        }
    
        @Override
        protected void onDestroy() {
            mSearch.destroy();
            mMapView.onDestroy();
            super.onDestroy();
        }
    }

    百度地图的重要使用功能都已介绍完毕,希望大家在使用的时候有好的使用方法和效果时可以一起分享

    作者:杰瑞教育
    出处:http://www.cnblogs.com/jerehedu/ 
    版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    技术咨询:JRedu技术交流
     
  • 相关阅读:
    OpenDaylight及Postman实现VxLAN网络实验
    OpenDaylight的C/S模式实验
    OpenFlow1.3协议基于Mininet部署与验证
    Open vSwitch流表应用实战
    Open vSwitch的VxLAN隧道网络实验
    Open vSwitch的GRE隧道实验网络
    Open vSwitch使用案例扩展实验
    Beta 冲刺(1/7)
    福大软工 · 第十次作业
    福大软工 · BETA 版冲刺前准备(团队)
  • 原文地址:https://www.cnblogs.com/jerehedu/p/4942925.html
走看看 - 开发者的网上家园