更新时间:2022-02-24 本章节将对点标记、添加Marker、绘制自定义Marker、Marker点击和拖拽操作、POI底图标注等作进一步说明。 点标记
点标记用来在地图上标记任何位置,例如用户位置、车辆位置、店铺位置等一切带有位置属性的事物。
地图 SDK 提供的点标记功能包含两大部分,一部分是点(俗称 Marker)同时,SDK 对 Marker 封装了大量的触发事件,例如点击事件、长按事件、拖拽事件。
由于内容丰富,以下只能展示一些基础功能的使用,详细内容可参考类参考文档。
添加Marker
开发者可以根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息。开发者通过MarkerOptions类来设置Marker的属性。
绘制Marker的代码如下:
//定义Maker坐标点 LatLng point = new LatLng(39.963175, 116.400244); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.icon_marka); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) .icon(bitmap); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option);
绘制自定义Marker
可根据实际的业务需求,在地图指定的位置上添加自定义的 Marker。MarkerOptions 是设置 Marker 参数变量的类,添加 Marker 时会经常用到。
Marker常用属性:
名称 | 说明 | |
icon | 设置图标 | |
animateType | 动画类型 | MarkerAnimateType.none |
MarkerAnimateType.drop | ||
MarkerAnimateType.grow | ||
MarkerAnimateType.jump | ||
alpha | 透明度 | |
position | 位置坐标 | |
perspective | 是否开启近大远小效果 | true |
false | ||
draggable | 是否可拖拽 | |
flat | 是否平贴地图 (俯视图)(双手下拉地图查看效果) | true |
false | ||
anchor | 锚点比例 | |
rotate | 旋转角度 | |
title | 设置标题 | |
visible | 是否可见 | |
extraInfo | 额外信息 |
自定义Marker示例
//定义Maker坐标点 LatLng point = new LatLng(39.944251, 116.494996); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.marker_custom); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) //必传参数 .icon(bitmap) //必传参数 .draggable(true) //设置平贴地图,在地图中双指下拉查看效果 .flat(true) .alpha(0.5f); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option);
效果如图:
注:自V3.6.0起,原内置覆盖物相关类代码开源 覆盖物开源代码中提供了一些基于基础覆盖而组合而成的高级覆盖物,包括用于显示poi数据,规划路线,公交详情路线的覆盖物。 OverlayManager /PoiOverlay / IndoorPoiOverlay /IndoorRouteOverlay /TransitRouteOverlay /WalkingRouteOverlay /BikingRouteOverlay /DrivingRouteOverlay /BusLineOverlay /MassTransitRouteOverlay / 以上源码可在BaiduMapsApiDemo工程中找到。 可触发的Marker事件
Marker点击事件
点击Marker时会回调BaiduMap.OnMarkerClickListener,监听器的实现方式示例如下:
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { //marker被点击时回调的方法 //若响应点击事件,返回true,否则返回false //默认返回false @Override public boolean onMarkerClick(Marker marker) { return false; } });
Marker拖拽事件
在拖拽Marker时会回调BaiduMap.OnMarkerDragListener,监听器的实现方式如下(要在构造MarkerOptions时开启draggable):
mBaiduMap.setOnMarkerDragListener(new BaiduMap.OnMarkerDragListener() { //在Marker拖拽过程中回调此方法,这个Marker的位置可以通过getPosition()方法获取 //marker 被拖动的Marker对象 @Override public void onMarkerDrag(Marker marker) { //对marker处理拖拽逻辑 } //在Marker拖动完成后回调此方法, 这个Marker的位可以通过getPosition()方法获取 //marker 被拖拽的Marker对象 @Override public void onMarkerDragEnd(Marker marker) { } //在Marker开始被拖拽时回调此方法, 这个Marker的位可以通过getPosition()方法获取 //marker 被拖拽的Marker对象 @Override public void onMarkerDragStart(Marker marker) { } });
效果如图:
底图标注
自V3.6.0版本起,SDK在BaiduMap提供了控制底图标注的showMapPoi方法,默认显示底图标注。利用此属性可得到仅显示道路信息的地图,方法如下:
mBaiduMap.showMapPoi(false);
运行后,底图标注被隐藏,效果如图:
Marker碰撞策略
Android 7.5.0 起地图SDK支持marker碰撞策略功能,并兼容之前的marker绘制功能,只有打开isJoinCollision开关才进行碰撞策略。
marker碰撞策略可检测屏幕中海量marker的碰撞情况,并自动更新marker状态,确保屏幕中的marker互不碰撞。
Marker碰撞策略的主要属性如下:
属性 | 类型 | 说明 |
isJoinCollision | boolean | 是否参与碰撞,默认值为false |
isForceDisplay | boolean | 参与碰撞后是否强制展示,默认值为false |
priority | int | 碰撞优先级,默认值为整型的最大值 |
startLevel | int | 最小展示层级,默认值为4 |
endLevel | int | 最大展示层级,室内默认22,室外默认21 |
实现marker碰撞策略前,请提前准备好带经纬度信息的数据集,具体实现方式如下:
LatLng latlng = new LatLng(39.94871, 116.43784); markerOptions = new MarkerOptions() .position(latlng)// 设置marker经纬度坐标 .icon(bitmap)// 设置 Marker 覆盖物的图标 .isJoinCollision(true)// 设置marker参与碰撞 .isForceDisPlay(true) //设置压盖时 marker强制展示 .priority(9)//设置碰撞优先级为9 mMarker = (Marker) (mBaiduMap.addOverlay(markerOptions));//将marker添加到地图上
只要将marker的isJoinCollision设为true,并添加marker,就自动开启碰撞策略,示例图如下:
碰撞策略执行前
碰撞策略执行后
3DMarker 更新时间:2020-09-20
Android 7.5.2 起 地图SDK提供3D Marker绘制功能,支持对带高度的Marker覆盖物绘制,以满足更多场景需求。如下示例图就是将3D Marker绘制到3D建筑物上,并与3D建筑物绑定。 示例图如下
添加3D Marker的流程如下:
1、设置3D Marker高度:
Int height = 100; //
2、将带有高度的Marker的位置信息转换成二维屏幕坐标:
Point srcPoint = projection.geoPoint3toScreenLocation(new LatLng(23.008468, 113.72953), 100);
3、再将二维屏幕坐标转换成对应的经纬度坐标:
LatLng latLng = projection.fromScreenLocation(srcPoint)
之后就可以像添加普通覆盖物一样将3D Marker添加到地图上了。