下沉周边交通元素绘制逻辑

This commit is contained in:
董宏宇
2021-08-18 15:56:35 +08:00
parent 5f542a0f63
commit 75aed9e6cd
11 changed files with 472 additions and 27 deletions

View File

@@ -0,0 +1,201 @@
package com.mogo.module.common.drawer
import android.annotation.SuppressLint
import android.content.Context
import android.os.Handler
import android.os.Message
import com.mogo.commons.AbsMogoApplication
import com.mogo.map.MogoLatLng
import com.mogo.map.marker.IMogoMarker
import com.mogo.map.marker.MogoMarkerOptions
import com.mogo.module.common.MogoApisHandler
import com.mogo.module.common.constants.DataTypes
import com.mogo.module.common.drawer.bean.TrafficData
import com.mogo.utils.WorkThreadHandler
import java.util.concurrent.ConcurrentHashMap
/**
* @author xiaoyuzhou
* @date 2021/8/18 11:12 上午
* 交通元素 2D\3D绘制
*/
@SuppressLint("StaticFieldLeak")
object TrafficMarkerDrawer {
private val TAG = "TrafficMarkerDrawer"
private var mContext: Context? = null
// 动画持续时间
private val stepTime = 100L
// 维护Obu识别的他车集合
private val mTrafficMap = ConcurrentHashMap<String, TrafficData>()
// 地图内部资源md5缓存便于资源复用
private val mMarkerCachesResMd5Values = ConcurrentHashMap<String, String>()
// 上一帧数据的缓存,用来做移动动画
private val mMarkersCaches = ConcurrentHashMap<String, IMogoMarker>()
// 维护一个线程定时轮询数据进行地图绘制
private val mDrawerHandler: Handler =
object : Handler(WorkThreadHandler.newInstance("other_traffic_drawer").looper) {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
drawerTrafficInfo()
// 延时50毫秒重复发送自己定时轮询进行车辆绘制可以及时将已经不存在车辆删除
sendEmptyMessageDelayed(0, 100L)
}
}
init {
mContext = AbsMogoApplication.getApp()
mDrawerHandler.sendEmptyMessageDelayed(1, 0L)
}
/**
* 添加识别的数据
*/
fun addTrafficInfo(trafficData: TrafficData) {
mTrafficMap[trafficData.uuid] = trafficData
}
/**
* 更新识别数据,V2V预警的时候需要修改车辆颜色
*/
fun updateITrafficInfo(trafficData: TrafficData) {
mTrafficMap[trafficData.uuid] = trafficData
}
/**
* 移除识别的数据
*/
fun removeCvxRvInfoIndInfo(key: String) {
if (mTrafficMap.containsKey(key)) {
mTrafficMap.remove(key)
}
}
/**
* 绘制
*/
private fun drawerTrafficInfo() {
// 数据为空的时候清除所有数据
if (mTrafficMap.isEmpty()) {
mMarkersCaches.forEach {
it.value.remove()
}
mMarkersCaches.clear()
} else {
// 循环绘制识别的数据
mTrafficMap.forEach {
//Logger.d(TAG, "drawerCvxRvInfo${it.value}")
// 如果数据已经存在 Marker取出做动画
if (mMarkersCaches[it.key] != null) {
mMarkersCaches[it.key]?.let { it1 ->
changeDynamicMarker(it1, it.value)
}
}
// 不存在的添加Marker绘制
else {
drawObuRecognizedDataMarker(it.value)
}
}
}
}
/**
* 绘制单条
*/
private fun drawObuRecognizedDataMarker(trafficData: TrafficData) {
if (trafficData.type != null) {
val resId: Int = trafficData.type.traffic3DIconId
val resIdVal = resId.toString() + ""
val options = MogoMarkerOptions()
.owner(DataTypes.TYPE_MARKER_ADAS)
.anchor(0.5f, 0.5f)
.set3DMode(true)
.gps(true)
.controlAngle(true)
.resName(mMarkerCachesResMd5Values[resIdVal])
.icon3DRes(resId)
.rotate(trafficData.heading.toFloat())
.position(
MogoLatLng(
trafficData.lat,
trafficData.lon
)
)
// 修改颜色
when (trafficData.threatLevel) {
1 -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#D8D8D8FF")
}
2 -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#FFD53EFF")
}
3 -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#FF3C45FF")
}
else -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#D8D8D8FF")
}
}
val marker = MogoApisHandler.getInstance().apis
.mapServiceApi
.getMarkerManager(mContext)
.addMarker(DataTypes.TYPE_MARKER_OBU_DATA, options)
// 缓存3D资源
mMarkerCachesResMd5Values[resIdVal] = marker.markerResName
// 缓存数据
mMarkersCaches[trafficData.uuid] = marker
}
}
/**
* 带动画的修改Marker
*/
private fun changeDynamicMarker(
marker: IMogoMarker,
trafficData: TrafficData
) {
val resId: Int = trafficData.type.traffic3DIconId
val resIdVal = resId.toString() + ""
val options = marker.mogoMarkerOptions
options.resName(mMarkerCachesResMd5Values[resIdVal])
.icon3DRes(resId)
// 修改颜色
when (trafficData.threatLevel) {
1 -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#D8D8D8FF")
}
2 -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#FFD53EFF")
}
3 -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#FF3C45FF")
}
else -> {
mMarkersCaches[trafficData.uuid]?.setAnchorColor("#D8D8D8FF")
}
}
marker.addDynamicAnchorPosition(
MogoLatLng(
trafficData.lat,
trafficData.lon
),
trafficData.heading.toFloat(),
stepTime
)
}
}

View File

@@ -0,0 +1,77 @@
package com.mogo.module.common.drawer.bean;
import com.mogo.module.common.enums.TrafficTypeEnum;
/**
* @author xiaoyuzhou
* @date 2021/8/17 8:41 下午
* 交通元素数据,
*/
public class TrafficData {
/**
* 交通元素类型, 车、人、摩托、大巴车、卡车、自行车
*/
public TrafficTypeEnum type;
/**
* 识别物体唯一标识
*/
public String uuid;
/**
* 识别物体的纬度
*/
public double lat;
/**
* 识别物体的经度
*/
public double lon;
/**
* 车头朝向
*/
public double heading;
/**
* 系统时间
*/
public long systemTime;
/**
* 定位卫星时间
*/
public long satelliteTime;
/**
* 海拔
*/
public double alt;
/**
* 速度
*/
public double speed;
/**
* 莫顿码
*/
public long mortonCode;
/**
* 实际距离
* 使用distanceX和distanceY计算
*/
public double distance;
/**
* 危险等级
* range(0..3)
* 0x00: 保留
* 0x01: 模型原始颜色
* 0x02: 通知 -- 黄
* 0x03: 警告 -- 红
*/
public int threatLevel;
}

View File

@@ -0,0 +1,61 @@
package com.mogo.module.common.enums
import com.mogo.module.common.R
/**
* @author xiaoyuzhou
* @date 2021/8/18 11:39 上午
* 交通元素类型
*/
enum class TrafficTypeEnum(
var type: Int,
var desc: String,
var traffic2DIconId: Int,
var traffic3DIconId: Int
) {
TYPE_TRAFFIC_ID_WEI_ZHI(
0,
"未知数据",
R.raw.tache,
R.raw.tache
),
TYPE_TRAFFIC_ID_PEOPLE(
1,
"",
R.raw.people,
R.raw.people
),
TYPE_TRAFFIC_ID_BICYCLE(
2,
"自行车",
R.raw.zixingche,
R.raw.zixingche
),
TYPE_TRAFFIC_ID_TA_CHE(
3,
"他车",
R.raw.tachexiaoche,
R.raw.tachexiaoche
),
TYPE_TRAFFIC_ID_MOTO(
4,
"摩托",
R.raw.motorbike,
R.raw.motorbike
),
TYPE_TRAFFIC_ID_BUS(
6,
"大巴",
R.raw.bus,
R.raw.bus
),
TYPE_TRAFFIC_ID_TRUCK(
8,
"卡车",
R.raw.daba,
R.raw.daba
)
}

View File

@@ -1,4 +1,4 @@
package com.mogo.module.common.enum
package com.mogo.module.common.enums
import com.mogo.module.common.R
import com.zhidao.support.obu.constants.ObuConstants