百度地图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
原创粉丝点击