百度地图marker标记即行车路线规划和marker点击气泡事件
来源:互联网 发布:淘宝开店要生产许可证 编辑:程序博客网 时间:2024/04/28 06:36
上一篇,之前的定位什么的就不在说了,我们可以做个简单的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图的制作请自行百度。
1 0
- 百度地图marker标记即行车路线规划和marker点击气泡事件
- android集成百度地图定位、poi检索、marker标记功能,以及marker点击事件
- 关于百度地图marker的点击事件
- php的百度地图应用marker及点击事件,searchInfoWindow
- 如何区分多个百度地图marker的点击事件
- 百度地图3.0以上版本标注marker及其点击事件
- Android百度地图(多个marker的点击事件)
- 百度地图API 移动的marker,移动marker点击事件及动态改变速度
- 百度地图创建多个marker和监听事件
- 百度地图+Marker纠偏
- 百度地图,自定义Marker
- 百度地图marker
- Android 高德地图标记一组Marker,并有点击事件(上)
- 百度地图Marker的定位和方向
- 百度地图api之Marker类--标记点固定
- Android百度地图3.0.0点击Marker弹出覆盖物
- Android 百度地图自定义marker 控件点击无效问题解决方法。
- 百度地图Marker隐藏/显示
- drools用户指南----stateless session(无状态会话)的使用
- 02-linux静态库的编写和动态库
- RXJava详解
- Tensorflow的gRPC编程(三)
- 用ASCII进行首字母大写转换
- 百度地图marker标记即行车路线规划和marker点击气泡事件
- JS中三种字符串连接方式及其性能比较
- Alignment of Code UVA
- 最经学的java集合框架,虽然还没学全,但是常用的应该在这里了。
- Apache显示403,Forbidden
- 解读Batch Normalization
- 怎样将Hexo与github page 联系起来
- 14. Longest Common Prefix
- 递归思想