上一篇,之前的定位什么的就不在说了,我们可以做个简单的demo,点击地图任意位置添加标记marker,并且根据,我们定位的位置为起点stNode,和marker标记即我们点击的位置即enNode,进行自动路线规划,橙色代码位置为添加marker如果你只需要marker标记那么即添加这些代码即可。
import android.content.Context;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.RouteLine;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.route.BikingRouteResult;
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.TransitRouteResult;
import com.baidu.mapapi.search.route.WalkingRouteResult;
import com.sanshi.demo.R;
/**
* Created by PC_F on 2017/4/7.
* 地图单击事件监听接口
*/
public class BaiduMapClickListener implements BaiduMap.OnMapClickListener, OnGetRoutePlanResultListener {
private Context context;
public BaiduMap mBaiduMap;
private BitmapDescriptor bitmapDefault;
private double mCurrentLantitude, mCurrentLongitude;
//全局变量
private double myLongitude; //经度
private double myLatitude; //纬度
private RouteLine route = null;
private OverlayManager routeOverlay = null;
//搜索相关
RoutePlanSearch mSearch = null;// 搜索模块,也可去掉地图模块独立使用
public BaiduMapClickListener(Context context, BaiduMap mBaiduMap, double mCurrentLantitude, double mCurrentLongitude) {
this.context = context;
this.mBaiduMap = mBaiduMap;
this.mCurrentLongitude = mCurrentLongitude;
this.mCurrentLantitude = mCurrentLantitude;
bitmapDefault = BitmapDescriptorFactory
.fromResource(R.drawable.red_car);
// 初始化搜索模块,注册事件监听
mSearch = RoutePlanSearch.newInstance();
mSearch.setOnGetRoutePlanResultListener(this);
}
/**
* 地图单击事件回调函数
*
* @param point 点击的地理坐标
*/
public void onMapClick(LatLng point) {
mBaiduMap.clear();
// 构建MarkerOption,用于在地图上添加Marker
MarkerOptions options = new MarkerOptions().position(point)
.icon(bitmapDefault);
myLatitude = point.latitude;
myLongitude = point.longitude;
// 在地图上添加Marker,并显示
mBaiduMap.addOverlay(options);
mBaiduMap.setOnMarkerClickListener(new BaiduMarkerClickListener(context, mBaiduMap, mCurrentLantitude, mCurrentLongitude));
SearchButtonProcess();
}
/**
* 地图内 Poi 单击事件回调函数
*
* @param poi 点击的 poi 信息
*/
public boolean onMapPoiClick(MapPoi poi) {
return false;
}
/**
* 发起路线规划搜索示例
*/
public void SearchButtonProcess() {
//重置浏览节点的路线数据
route = null;
mBaiduMap.clear();
PlanNode stNode = PlanNode.withLocation(new LatLng(mCurrentLantitude, mCurrentLongitude));
//TODO 服务器数据接口
//PlanNode enNode = PlanNode.withLocation(new LatLng(shopLatitude,shopLongitude)); //如果使用服务器传递数据将shop的经纬度替换
//PlanNode enNode = PlanNode.withCityNameAndPlaceName("无锡", editEn.getText().toString());
// PlanNode enNode = PlanNode.withCityNameAndPlaceName("无锡", "无锡火车站");
PlanNode enNode = PlanNode.withLocation(new LatLng(myLatitude, myLongitude));
// 实际使用中请对起点终点城市进行正确的设定
mSearch.drivingSearch((new DrivingRoutePlanOption())
.from(stNode)
.to(enNode));
}
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(context, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
}
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
//起终点或途经点地址有岐义,通过以下接口获取建议查询信息
//result.getSuggestAddrInfo()
return;
}
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
route = result.getRouteLines().get(0);
DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);
routeOverlay = overlay;
mBaiduMap.setOnMarkerClickListener(overlay);
overlay.setData(result.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
}
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
}
}
但是这样写还是不够,需要加上百度地图DrivingRouteOverlay,才能正常进行路线规划,如果是骑车不行的话有不同的类可以供你进行选择,这是百度api提供给我们的我们可以一点不动复制粘贴过来就可以了
package com.sanshi.demo.tools;
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.DrivingRouteLine;
import com.baidu.mapapi.search.route.DrivingRouteLine.DrivingStep;
import java.util.ArrayList;
import java.util.List;
/**
* 用于显示一条驾车路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示,当数据中包含路况数据时,则默认使用路况纹理分段绘制
*/
public class DrivingRouteOverlay extends OverlayManager {
private DrivingRouteLine mRouteLine = null;
boolean focus = false;
/**
* 构造函数
*
* @param baiduMap
* 该DrivingRouteOvelray引用的 BaiduMap
*/
public DrivingRouteOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public final List<OverlayOptions> getOverlayOptions() {
if (mRouteLine == null) {
return null;
}
List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
// step node
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().size() > 0) {
for (DrivingRouteLine.DrivingStep step : mRouteLine.getAllStep()) {
Bundle b = new Bundle();
b.putInt("index", mRouteLine.getAllStep().indexOf(step));
if (step.getEntrance() != null) {
overlayOptionses.add((new MarkerOptions())
.position(step.getEntrance().getLocation())
.anchor(0.5f, 0.5f)
.zIndex(10)
.rotate((360 - step.getDirection()))
.extraInfo(b)
.icon(BitmapDescriptorFactory
.fromAssetWithDpi("Icon_line_node.png")));
}
// 最后路段绘制出口点
if (mRouteLine.getAllStep().indexOf(step) == (mRouteLine
.getAllStep().size() - 1) && step.getExit() != null) {
overlayOptionses.add((new MarkerOptions())
.position(step.getExit().getLocation())
.anchor(0.5f, 0.5f)
.zIndex(10)
.icon(BitmapDescriptorFactory
.fromAssetWithDpi("Icon_line_node.png")));
}
}
}
if (mRouteLine.getStarting() != null) {
overlayOptionses.add((new MarkerOptions())
.position(mRouteLine.getStarting().getLocation())
.icon(getStartMarker() != null ? getStartMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_start.png")).zIndex(10));
}
if (mRouteLine.getTerminal() != null) {
overlayOptionses
.add((new MarkerOptions())
.position(mRouteLine.getTerminal().getLocation())
.icon(getTerminalMarker() != null ? getTerminalMarker() :
BitmapDescriptorFactory
.fromAssetWithDpi("Icon_end.png"))
.zIndex(10));
}
// poly line
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().size() > 0) {
List<DrivingStep> steps = mRouteLine.getAllStep();
int stepNum = steps.size();
List<LatLng> points = new ArrayList<LatLng>();
ArrayList<Integer> traffics = new ArrayList<Integer>();
int totalTraffic = 0;
for (int i = 0; i < stepNum ; i++) {
if (i == stepNum - 1) {
points.addAll(steps.get(i).getWayPoints());
} else {
points.addAll(steps.get(i).getWayPoints().subList(0, steps.get(i).getWayPoints().size() - 1));
}
totalTraffic += steps.get(i).getWayPoints().size() - 1;
if (steps.get(i).getTrafficList() != null && steps.get(i).getTrafficList().length > 0) {
for (int j = 0;j < steps.get(i).getTrafficList().length;j++) {
traffics.add(steps.get(i).getTrafficList()[j]);
}
}
}
// Bundle indexList = new Bundle();
// if (traffics.size() > 0) {
// int raffic[] = new int[traffics.size()];
// int index = 0;
// for (Integer tempTraff : traffics) {
// raffic[index] = tempTraff.intValue();
// index++;
// }
// indexList.putIntArray("indexs", raffic);
// }
boolean isDotLine = false;
if (traffics != null && traffics.size() > 0) {
isDotLine = true;
}
PolylineOptions option = new PolylineOptions().points(points).textureIndex(traffics)
.width(7).dottedLine(isDotLine).focus(true)
.color(getLineColor() != 0 ? getLineColor() : Color.argb(178, 0, 78, 255)).zIndex(0);
if (isDotLine) {
option.customTextureList(getCustomTextureList());
}
overlayOptionses.add(option);
}
return overlayOptionses;
}
/**
* 设置路线数据
*
* @param routeLine
* 路线数据
*/
public void setData(DrivingRouteLine routeLine) {
this.mRouteLine = routeLine;
}
/**
* 设置路线数据
*
* 路线数据
*/
public BitmapDescriptor getStartMarker() {
return null;
}
/**
* 覆写此方法以改变默认起点图标
*
* @return 起点图标
*/
public int getLineColor() {
return 0;
}
/**
* 覆写此方法以改变默认绘制颜色
* @return 线颜色
*/
public List<BitmapDescriptor> getCustomTextureList() {
ArrayList<BitmapDescriptor> list = new ArrayList<BitmapDescriptor>();
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_blue_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_green_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_yellow_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_red_arrow.png"));
list.add(BitmapDescriptorFactory.fromAsset("Icon_road_nofocus.png"));
return list;
}
/**
* 覆写此方法以改变默认终点图标
*
* @return 终点图标
*/
public BitmapDescriptor getTerminalMarker() {
return null;
}
/**
* 覆写此方法以改变默认点击处理
*
* @param i
* 线路节点的 index
* @return 是否处理了该点击事件
*/
public boolean onRouteNodeClick(int i) {
if (mRouteLine.getAllStep() != null
&& mRouteLine.getAllStep().get(i) != null) {
Log.i("baidumapsdk", "DrivingRouteOverlay 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) {
boolean flag = false;
for (Overlay mPolyline : mOverlayList) {
if (mPolyline instanceof Polyline && mPolyline.equals(polyline)) {
// 选中
flag = true;
break;
}
}
setFocus(flag);
return true;
}
public void setFocus(boolean flag) {
focus = flag;
for (Overlay mPolyline : mOverlayList) {
if (mPolyline instanceof Polyline) {
// 选中
((Polyline) mPolyline).setFocus(flag);
break;
}
}
}
}
如果需要对marker添加点击弹出气泡的话需要mBaiduMap.setOnMarkerClickListener()点击事件
package com.sanshi.demo.tools;
import android.content.Context;
import android.widget.Button;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.RouteLine;
import com.baidu.mapapi.search.route.RoutePlanSearch;
import com.sanshi.demo.R;
/**
* Created by PC_F on 2017/4/7.
* marker点击事件处理
*/
public class BaiduMarkerClickListener implements BaiduMap.OnMarkerClickListener{
private Context context;
private InfoWindow mInfoWindow;
public BaiduMap mBaiduMap;
private Button button;
//全局变量
private double myLongitude; //经度
private double myLatitude; //纬度
private RouteLine route = null;
private OverlayManager routeOverlay = null;
//搜索相关
RoutePlanSearch mSearch = null;// 搜索模块,也可去掉地图模块独立使用
private double mCurrentLantitude, mCurrentLongitude;
public BaiduMarkerClickListener(Context context, BaiduMap mBaiduMap, double mCurrentLantitude, double mCurrentLongitude) {
this.context = context;
this.mBaiduMap = mBaiduMap;
this.mCurrentLongitude = mCurrentLongitude;
this.mCurrentLantitude = mCurrentLantitude;
}
@Override
public boolean onMarkerClick(final Marker marker) {
final LatLng latLng = marker.getPosition();
int index = marker.getZIndex();
button = new Button(context
.getApplicationContext());
button.setBackgroundResource(R.drawable.qipao);
button.setTextColor(context.getResources().getColor(R.color.colorPrimary));
button.setTextSize(12);
// button.setPadding(16, 16, 16, 36);
button.setText("火警点");
// 定义用于显示该InfoWindow的坐标点
// 创建InfoWindow的点击事件监听者
// InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() {
// public void onInfoWindowClick() {
// SearchButtonProcess();
// }
// };
mInfoWindow = new InfoWindow(BitmapDescriptorFactory
.fromView(button), marker.getPosition(), -70, null);
mBaiduMap.showInfoWindow(mInfoWindow);
return true;
}
}
如果还要对气泡添加点击事件的话,那么是以下代码
//InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() //{
// public void onInfoWindowClick() {
// SearchButtonProcess();
// }
// };
并且把 mInfoWindow = new InfoWindow(BitmapDescriptorFactory
.fromView(button), marker.getPosition(), -70, null);中的null改成listener我们创建监听方法,请特别注意我们如果需要对marker添加点击事件的话,不是button.setOnClickListener();对于气泡,最好使用.9图,至于点9图的制作请自行百度。