在集成百度地图路径规划的时候遇到一些坑,还好解决了,特此记录一下,话不多说了,上步骤。
默认已经集成地图。
先看效果图
背景地图已通过添加图片打码.
1.初始化
private void initGh() {
OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
Log.e("leo","ok?");
//创建WalkingRouteOverlay实例
WalkingRouteOverlay overlay = new WalkingRouteOverlay(mBaiduMap);
if (walkingRouteResult.getRouteLines().size() > 0) {
Log.e("leo","开始");
//获取路径规划数据,(以返回的第一条数据为例)
//为WalkingRouteOverlay实例设置路径数据
overlay.setData(walkingRouteResult.getRouteLines().get(0));
//在地图上绘制WalkingRouteOverlay
overlay.addToMap();
Log.e("leo","结束");
}else {
Toast.makeText(MainActivity.this, "无线路规划", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
}
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
}
};
mSearch = RoutePlanSearch.newInstance();
// 步行线路搜索
mSearch.setOnGetRoutePlanResultListener(listener);
}
设置路线规划检索监听,有步行,骑行,驾车监听回掉,我们这里只以步行举例
2.引入Demo中的Overlay文件,这里以步行路线规划为例
百度Demo中均有,在此再粘贴一下
WalkingRouteOverlay.class
package com.tz.testbaidumap.Route;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.Polyline;
import com.baidu.mapapi.map.PolylineOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.route.WalkingRouteLine;
import java.util.ArrayList;
import java.util.List;
/**
* 用于显示步行路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示
*/
public class WalkingRouteOverlay extends OverlayManager {
private WalkingRouteLine mRouteLine = null;
public WalkingRouteOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
/**
* 设置路线数据。
*
* @param line
* 路线数据
*/
public void setData(WalkingRouteLine line) {
mRouteLine = line;
}
@Override
public final List<OverlayOptions> getOverlayOptions() {
if (mRouteLine == null) {
return null;
}
List<OverlayOptions> overlayList = new ArrayList<OverlayOptions>();
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().size() > 0) {
for (WalkingRouteLine.WalkingStep step : mRouteLine.getAllStep()) {
Bundle b = new Bundle();
b.putInt("index", mRouteLine.getAllStep().indexOf(step));
if (step.getEntrance() != null) {
overlayList.add((new MarkerOptions())
.position(step.getEntrance().getLocation())
.rotate((360 - step.getDirection()))
.zIndex(10)
.anchor(0.5f, 0.5f)
.extraInfo(b)
.icon(BitmapDescriptorFactory
.fromAssetWithDpi("Icon_line_node.png")));
}
// 最后路段绘制出口点
if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine
.getAllStep().size() - 1) && step.getExit() != null) {
overlayList.add((new MarkerOptions())
.position(step.getExit().getLocation())
.anchor(0.5f, 0.5f)
.zIndex(10)
.icon(BitmapDescriptorFactory
.fromAssetWithDpi("Icon_line_node.png")));
}
}
}
// starting
if (mRouteLine.getStarting() != null) {
overlayList.add((new MarkerOptions())
.position(mRouteLine.getStarting().getLocation())
.icon(getStartMarker() != null ? getStartMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_start.png")).zIndex(10));
}
// terminal
if (mRouteLine.getTerminal() != null) {
overlayList
.add((new MarkerOptions())
.position(mRouteLine.getTerminal().getLocation())
.icon(getTerminalMarker() != null ? getTerminalMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_end.png"))
.zIndex(10));
}
// poly line list
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().size() > 0) {
LatLng lastStepLastPoint = null;
for (WalkingRouteLine.WalkingStep step : mRouteLine.getAllStep()) {
List<LatLng> watPoints = step.getWayPoints();
if (watPoints != null) {
List<LatLng> points = new ArrayList<LatLng>();
if (lastStepLastPoint != null) {
points.add(lastStepLastPoint);
}
points.addAll(watPoints);
overlayList.add(new PolylineOptions().points(points).width(10)
.color(getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255)).zIndex(0));
lastStepLastPoint = watPoints.get(watPoints.size() - 1);
}
}
}
return overlayList;
}
/**
* 覆写此方法以改变默认起点图标
*
* @return 起点图标
*/
public BitmapDescriptor getStartMarker() {
return null;
}
public int getLineColor() {
return 0;
}
/**
* 覆写此方法以改变默认终点图标
*
* @return 终点图标
*/
public BitmapDescriptor getTerminalMarker() {
return null;
}
/**
* 处理点击事件
*
* @param i
* 被点击的step在
* {@link com.baidu.mapapi.search.route.WalkingRouteLine#getAllStep()}
* 中的索引
* @return 是否处理了该点击事件
*/
public boolean onRouteNodeClick(int i) {
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().get(i) != null) {
Log.i("baidumapsdk", "WalkingRouteOverlay onRouteNodeClick");
}
return false;
}
@Override
public final boolean onMarkerClick(Marker marker) {
for (Overlay mMarker : mOverlayList) {
if (mMarker instanceof Marker && mMarker.equals(marker)) {
if (marker.getExtraInfo() != null) {
onRouteNodeClick(marker.getExtraInfo().getInt("index"));
}
}
}
return true;
}
@Override
public boolean onPolylineClick(Polyline polyline) {
// TODO Auto-generated method stub
return false;
}
}
OverlayManager.class
package com.tz.testbaidumap.Route;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnPolylineClickListener;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLngBounds;
import java.util.ArrayList;
import java.util.List;
import static com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
/**
* 该类提供一个能够显示和管理多个Overlay的基类
* <p>
* 复写{@link #getOverlayOptions()} 设置欲显示和管理的Overlay列表
* </p>
* <p>
* 通过
* {@link com.baidu.mapapi.map.BaiduMap#setOnMarkerClickListener(com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener)}
* 将覆盖物点击事件传递给OverlayManager后,OverlayManager才能响应点击事件。
* <p>
* 复写{@link #onMarkerClick(com.baidu.mapapi.map.Marker)} 处理Marker点击事件
* </p>
*/
public abstract class OverlayManager implements OnMarkerClickListener, OnPolylineClickListener {
BaiduMap mBaiduMap = null;
private List<OverlayOptions> mOverlayOptionList = null;
List<Overlay> mOverlayList = null;
/**
* 通过一个BaiduMap 对象构造
*
* @param baiduMap
*/
public OverlayManager(BaiduMap baiduMap) {
mBaiduMap = baiduMap;
// mBaiduMap.setOnMarkerClickListener(this);
if (mOverlayOptionList == null) {
mOverlayOptionList = new ArrayList<OverlayOptions>();
}
if (mOverlayList == null) {
mOverlayList = new ArrayList<Overlay>();
}
}
/**
* 覆写此方法设置要管理的Overlay列表
*
* @return 管理的Overlay列表
*/
public abstract List<OverlayOptions> getOverlayOptions();
/**
* 将所有Overlay 添加到地图上
*/
public final void addToMap() {
if (mBaiduMap == null) {
return;
}
removeFromMap();
List<OverlayOptions> overlayOptions = getOverlayOptions();
if (overlayOptions != null) {
mOverlayOptionList.addAll(overlayOptions);
}
for (OverlayOptions option : mOverlayOptionList) {
mOverlayList.add(mBaiduMap.addOverlay(option));
}
}
/**
* 将所有Overlay 从 地图上消除
*/
public final void removeFromMap() {
if (mBaiduMap == null) {
return;
}
for (Overlay marker : mOverlayList) {
marker.remove();
}
mOverlayOptionList.clear();
mOverlayList.clear();
}
/**
* 缩放地图,使所有Overlay都在合适的视野内
* <p>
* 注: 该方法只对Marker类型的overlay有效
* </p>
*/
public void zoomToSpan() {
if (mBaiduMap == null) {
return;
}
if (mOverlayList.size() > 0) {
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Overlay overlay : mOverlayList) {
// polyline 中的点可能太多,只按marker 缩放
if (overlay instanceof Marker) {
builder.include(((Marker) overlay).getPosition());
}
}
MapStatus mapStatus = mBaiduMap.getMapStatus();
if (null != mapStatus){
int width = mapStatus.winRound.right - mBaiduMap.getMapStatus().winRound.left - 400;
int height = mapStatus.winRound.bottom - mBaiduMap.getMapStatus().winRound.top - 400;
mBaiduMap.setMapStatus(MapStatusUpdateFactory
.newLatLngBounds(builder.build(), width, height));
}
}
}
/**
* 设置显示在规定宽高中的地图地理范围
*/
public void zoomToSpanPaddingBounds(int paddingLeft, int paddingTop, int paddingRight, int paddingBottom) {
if (mBaiduMap == null) {
return;
}
if (mOverlayList.size() > 0) {
LatLngBounds.Builder builder = new LatLngBounds.Builder();
for (Overlay overlay : mOverlayList) {
// polyline 中的点可能太多,只按marker 缩放
if (overlay instanceof Marker) {
builder.include(((Marker) overlay).getPosition());
}
}
mBaiduMap.setMapStatus(MapStatusUpdateFactory
.newLatLngBounds(builder.build(), paddingLeft, paddingTop, paddingRight, paddingBottom));
}
}
}
拷贝资源文件
将百度demo中的assets文件全部拷贝吧!很重要的一步,不然代码没问题会闪退!!
开始路径规划
PlanNode stNode = PlanNode.withLocation(new LatLng(location.getLatitude(), location.getLongitude()));
PlanNode enNode = PlanNode.withLocation(new LatLng(marker.getPosition().latitude, marker.getPosition().longitude));
mSearch.walkingSearch((new WalkingRoutePlanOption())
.from(stNode)
.to(enNode));
我这里是以我自己的位置为起点和点击marker的坐标为终点,大家可以自行替换。还可以设置地名,详看官方文档。
至此步行路径规划就实现了,但是有一个小坑,我第一次测试是全部写在了onCreate方法中,但是闪退,所以可以写一个点击事件,初始化操作可以写到OnCreate方法中。