你的位置:首页 > 操作系统

[操作系统]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) {}

效果:

下面我们来具体使用一下

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

<??><LinearLayout ="http://schemas.android.com/apk/res/android"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:orientation="vertical" >  <LinearLayout    ="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    ="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    ="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    ="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      ="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      ="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技术交流