百度地图marker标记即行车路线规划和marker点击气泡事件

上一篇,之前的定位什么的就不在说了,我们可以做个简单的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图的制作请自行百度。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青丶穗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值