[3.2.0][Opt]全览模式轨迹绘制切换到子线程
This commit is contained in:
@@ -86,12 +86,33 @@ object MarkerDrawerManager {
|
||||
}
|
||||
}
|
||||
|
||||
fun updateRoutePoints(routePoints: List<MessagePad.Location>?, context: Context) {
|
||||
/**
|
||||
* 存储全局轨迹用于轮询计算车已走过的轨迹index
|
||||
*/
|
||||
fun updateGDRoutePoints(routePoints: List<LatLng>?) {
|
||||
if (routePoints == null || routePoints.isEmpty()) return
|
||||
val latLngModels = coordinateConverterWgsToGcjListCommon(context, routePoints)
|
||||
planningPoints.clear()
|
||||
planningPoints.addAll(latLngModels)
|
||||
// float remainingSumLength = calculateRemainingSumLength(mRoutePoints);
|
||||
synchronized(this) {
|
||||
planningPoints.clear()
|
||||
planningPoints.addAll(routePoints)
|
||||
}
|
||||
}
|
||||
|
||||
fun resetStatus() {
|
||||
synchronized(this) {
|
||||
planningPoints.clear()
|
||||
}
|
||||
lastArrivedIndex = -1
|
||||
}
|
||||
|
||||
/**
|
||||
* 转为高德定位对象
|
||||
*/
|
||||
fun change2GDPoints(routePoints: List<MessagePad.Location>?, context: Context): List<LatLng> {
|
||||
return if (routePoints == null || routePoints.isEmpty()) {
|
||||
emptyList()
|
||||
} else {
|
||||
coordinateConverterWgsToGcjListCommon(context, routePoints)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -111,11 +132,14 @@ object MarkerDrawerManager {
|
||||
if (routePoints.isNotEmpty()) {
|
||||
//基础点
|
||||
val baseLatLng = routePoints[0]
|
||||
newPoints.add(baseLatLng)
|
||||
var baseDiffDis = CoordinateUtils.calculateLineDistance(
|
||||
realLon, realLat, baseLatLng.longitude, baseLatLng.latitude
|
||||
) // lon,lat, prelon, prelat
|
||||
for (i in 1 until routePoints.size) {
|
||||
val latLng = routePoints[i]
|
||||
// 深拷贝数据用于高德地图上轨迹线的绘制
|
||||
newPoints.add(LatLng(latLng.latitude, latLng.longitude))
|
||||
val diff = CoordinateUtils.calculateLineDistance(
|
||||
realLon, realLat, latLng.longitude, latLng.latitude
|
||||
)
|
||||
@@ -140,7 +164,6 @@ object MarkerDrawerManager {
|
||||
} else {
|
||||
lastArrivedIndex = currentIndex
|
||||
}
|
||||
newPoints.addAll(routePoints)
|
||||
newPoints.add(currentIndex + 1, LatLng(realLat, realLon))
|
||||
return currentIndex + 1
|
||||
}
|
||||
|
||||
@@ -37,21 +37,18 @@ import com.mogo.eagle.core.function.map.R
|
||||
import com.mogo.eagle.core.function.smp.MakerWithCount
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.callback
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.change2GDPoints
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.coordinateConverterWgsToGcj
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.lastArrivedIndex
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.lonLatHeading
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.planningPoints
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.startLoopCalCarLocation
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.updateRoutePoints
|
||||
import com.mogo.eagle.core.function.smp.MarkerDrawerManager.updateGDRoutePoints
|
||||
import com.mogo.eagle.core.function.smp.V2XMarkerView
|
||||
import com.mogo.eagle.core.utilcode.mogo.MapAssetStyleUtils
|
||||
import com.mogo.eagle.core.utilcode.util.ThreadUtils
|
||||
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
|
||||
import com.zhidaoauto.map.sdk.open.tools.ThreadPoolUtils
|
||||
import me.jessyan.autosize.utils.AutoSizeUtils
|
||||
import mogo.telematics.pad.MessagePad
|
||||
import mogo.v2x.MogoV2X
|
||||
import java.util.concurrent.ExecutorService
|
||||
import java.util.concurrent.Executors
|
||||
import kotlin.math.pow
|
||||
|
||||
@@ -127,10 +124,16 @@ class OverMapView @JvmOverloads constructor(
|
||||
@Volatile
|
||||
private var isInit = false
|
||||
|
||||
@Volatile
|
||||
private var isFirst = true
|
||||
|
||||
// 用来绘制轨迹线
|
||||
private val singlePool by lazy {
|
||||
Executors.newSingleThreadExecutor()
|
||||
}
|
||||
|
||||
private var allPoints: List<LatLng>? = null
|
||||
|
||||
companion object {
|
||||
const val TAG = "OverMapView"
|
||||
}
|
||||
@@ -334,8 +337,9 @@ class OverMapView @JvmOverloads constructor(
|
||||
mStartMarker?.isVisible = false
|
||||
mEndMarker?.isVisible = false
|
||||
MarkerDrawerManager.stopLoopCalCarLocation()
|
||||
planningPoints.clear()
|
||||
lastArrivedIndex = -1
|
||||
ThreadUtils.getIoPool().execute {
|
||||
MarkerDrawerManager.resetStatus()
|
||||
}
|
||||
isInit = false
|
||||
}
|
||||
|
||||
@@ -470,37 +474,50 @@ class OverMapView @JvmOverloads constructor(
|
||||
Log.d(TAG, "全局路径规划轨迹为空")
|
||||
return
|
||||
}
|
||||
Log.d(TAG, "全局路径规划轨迹下发")
|
||||
isFirst = true
|
||||
MarkerDrawerManager.resetStatus()
|
||||
val list: List<MessagePad.Location> = locationList
|
||||
// 转成高德坐标系并存储
|
||||
updateRoutePoints(list, mContext!!)
|
||||
val planningPointList: List<LatLng> = planningPoints
|
||||
UiThreadHandler.post ({
|
||||
displayCustomOverView()
|
||||
drawStartAndEndMarker(planningPointList)
|
||||
}, UiThreadHandler.MODE.QUEUE)
|
||||
if (!isInit) {
|
||||
callback = object : MarkerDrawerManager.Callback {
|
||||
override fun onLocationChanged(planningPoints: List<LatLng>, locIndex: Int) {
|
||||
// 每1s刷新一下轨迹线
|
||||
UiThreadHandler.post ({
|
||||
if (planningPoints.isNotEmpty()) {
|
||||
drawPolyline(planningPoints, locIndex)
|
||||
// 转成高德定位对象并存储
|
||||
val planningPointList = change2GDPoints(list, mContext!!)
|
||||
updateGDRoutePoints(planningPointList)
|
||||
synchronized(this::class.java) {
|
||||
if (!isInit) {
|
||||
var timeStamp = 0L
|
||||
callback = object : MarkerDrawerManager.Callback {
|
||||
override fun onLocationChanged(points: List<LatLng>, locIndex: Int) {
|
||||
if (points.isNotEmpty()) {
|
||||
// 每1s刷新一下轨迹线
|
||||
singlePool.execute {
|
||||
if (isFirst) {
|
||||
Log.d(TAG, "第一次!")
|
||||
isFirst = false
|
||||
allPoints = points
|
||||
displayCustomOverView()
|
||||
drawStartAndEndMarker(points)
|
||||
}
|
||||
timeStamp = System.currentTimeMillis()
|
||||
drawPolyline(points, locIndex)
|
||||
Log.d(TAG, "绘制轨迹线的时间为:${System.currentTimeMillis() - timeStamp}ms")
|
||||
}
|
||||
}
|
||||
}, UiThreadHandler.MODE.QUEUE)
|
||||
}
|
||||
}
|
||||
startLoopCalCarLocation()
|
||||
isInit = true
|
||||
}
|
||||
startLoopCalCarLocation()
|
||||
isInit = true
|
||||
}
|
||||
UiThreadHandler.post({
|
||||
if (geoHashInfMap.isNullOrEmpty()) {
|
||||
UiThreadHandler.postDelayed({
|
||||
if (geoHashInfMap.isNullOrEmpty()) {
|
||||
UiThreadHandler.postDelayed({
|
||||
singlePool.execute {
|
||||
drawInfrastructureMarkers(locationList)
|
||||
}, 1000, UiThreadHandler.MODE.QUEUE)
|
||||
} else {
|
||||
}
|
||||
}, 1000, UiThreadHandler.MODE.QUEUE)
|
||||
} else {
|
||||
singlePool.execute {
|
||||
drawInfrastructureMarkers(locationList)
|
||||
}
|
||||
}, UiThreadHandler.MODE.QUEUE)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -662,33 +679,35 @@ class OverMapView @JvmOverloads constructor(
|
||||
* 进入自定义全览模式
|
||||
*/
|
||||
fun displayCustomOverView() {
|
||||
val linePointsLatLng = planningPoints
|
||||
if (linePointsLatLng.size > 1 && mLocation != null) {
|
||||
//圈定地图显示范围
|
||||
//存放经纬度
|
||||
val boundsBuilder = LatLngBounds.Builder()
|
||||
for (i in linePointsLatLng.indices) {
|
||||
boundsBuilder.include(linePointsLatLng[i])
|
||||
}
|
||||
val currentLatLng = LatLng(mLocation!!.latitude, mLocation!!.longitude)
|
||||
boundsBuilder.include(currentLatLng)
|
||||
val cameraPosition = CameraPosition.Builder().tilt(mTilt).build()
|
||||
//第二个参数为四周留空宽度
|
||||
mAMap!!.moveCamera(
|
||||
CameraUpdateFactory.newLatLngBoundsRect(
|
||||
boundsBuilder.build(),
|
||||
AutoSizeUtils.dp2px(context, leftPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, rightPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, topPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, bottomPadding.toFloat())
|
||||
singlePool.execute {
|
||||
val linePointsLatLng = allPoints
|
||||
if (linePointsLatLng != null && linePointsLatLng.size > 1 && mLocation != null) {
|
||||
//圈定地图显示范围
|
||||
//存放经纬度
|
||||
val boundsBuilder = LatLngBounds.Builder()
|
||||
for (i in linePointsLatLng.indices) {
|
||||
boundsBuilder.include(linePointsLatLng[i])
|
||||
}
|
||||
val currentLatLng = LatLng(mLocation!!.latitude, mLocation!!.longitude)
|
||||
boundsBuilder.include(currentLatLng)
|
||||
val cameraPosition = CameraPosition.Builder().tilt(mTilt).build()
|
||||
//第二个参数为四周留空宽度
|
||||
mAMap!!.moveCamera(
|
||||
CameraUpdateFactory.newLatLngBoundsRect(
|
||||
boundsBuilder.build(),
|
||||
AutoSizeUtils.dp2px(context, leftPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, rightPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, topPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, bottomPadding.toFloat())
|
||||
)
|
||||
)
|
||||
)
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
} else {
|
||||
//设置希望展示的地图缩放级别
|
||||
val cameraPosition = CameraPosition.Builder()
|
||||
.target(mCarMarker!!.position).tilt(mTilt).zoom(zoomLevel.toFloat()).build()
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
} else {
|
||||
//设置希望展示的地图缩放级别
|
||||
val cameraPosition = CameraPosition.Builder()
|
||||
.target(mCarMarker!!.position).tilt(mTilt).zoom(zoomLevel.toFloat()).build()
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -718,6 +737,7 @@ class OverMapView @JvmOverloads constructor(
|
||||
mStartMarker?.isVisible = false
|
||||
mEndMarker?.isVisible = false
|
||||
if (coordinates.size > 2) {
|
||||
Log.d(TAG, "绘制起终点")
|
||||
// 设置开始结束Marker位置
|
||||
val startLatLng = coordinates[0]
|
||||
val endLatLng = coordinates[coordinates.size - 1]
|
||||
@@ -725,6 +745,8 @@ class OverMapView @JvmOverloads constructor(
|
||||
mEndMarker?.position = endLatLng
|
||||
mStartMarker?.isVisible = true
|
||||
mEndMarker?.isVisible = true
|
||||
} else {
|
||||
Log.d(TAG, "不绘制起终点")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -734,8 +756,7 @@ class OverMapView @JvmOverloads constructor(
|
||||
* @param coordinates
|
||||
* @param locIndex
|
||||
*/
|
||||
@MainThread
|
||||
fun drawPolyline(coordinates: List<LatLng>, locIndex: Int) {
|
||||
private fun drawPolyline(coordinates: List<LatLng>, locIndex: Int) {
|
||||
if (textureList.size > 0) {
|
||||
textureList.clear()
|
||||
}
|
||||
@@ -819,49 +840,51 @@ class OverMapView @JvmOverloads constructor(
|
||||
* 站点轨迹集合被包含在地图显示范围内
|
||||
*/
|
||||
fun includeSitePointsAndUpdateCamera(coordinates: List<LatLng>?) {
|
||||
val linePointsLatLng = planningPoints
|
||||
val boundsBuilder = LatLngBounds.Builder()
|
||||
var isOnlyCarLocation = true
|
||||
singlePool.execute {
|
||||
val linePointsLatLng = allPoints
|
||||
val boundsBuilder = LatLngBounds.Builder()
|
||||
var isOnlyCarLocation = true
|
||||
|
||||
if (linePointsLatLng.size > 1) {
|
||||
// 圈定地图显示范围(自动驾驶轨迹)
|
||||
for (i in linePointsLatLng.indices) {
|
||||
boundsBuilder.include(linePointsLatLng[i])
|
||||
if (linePointsLatLng != null && linePointsLatLng.size > 1) {
|
||||
// 圈定地图显示范围(自动驾驶轨迹)
|
||||
for (i in linePointsLatLng.indices) {
|
||||
boundsBuilder.include(linePointsLatLng[i])
|
||||
}
|
||||
isOnlyCarLocation = false
|
||||
}
|
||||
isOnlyCarLocation = false
|
||||
}
|
||||
|
||||
if (mLocation != null) {
|
||||
// 自车坐标
|
||||
boundsBuilder.include(LatLng(mLocation!!.latitude, mLocation!!.longitude))
|
||||
}
|
||||
|
||||
coordinates?.let {
|
||||
// 站点轨迹被包含在地图显示范围内
|
||||
for (i in it.indices) {
|
||||
boundsBuilder.include(it[i])
|
||||
if (mLocation != null) {
|
||||
// 自车坐标
|
||||
boundsBuilder.include(LatLng(mLocation!!.latitude, mLocation!!.longitude))
|
||||
}
|
||||
isOnlyCarLocation = false
|
||||
}
|
||||
|
||||
if (!isOnlyCarLocation) {
|
||||
val cameraPosition = CameraPosition.Builder().tilt(mTilt).build()
|
||||
//第二个参数为四周留空宽度
|
||||
mAMap!!.moveCamera(
|
||||
CameraUpdateFactory.newLatLngBoundsRect(
|
||||
boundsBuilder.build(),
|
||||
AutoSizeUtils.dp2px(context, leftPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, rightPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, topPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, bottomPadding.toFloat())
|
||||
coordinates?.let {
|
||||
// 站点轨迹被包含在地图显示范围内
|
||||
for (i in it.indices) {
|
||||
boundsBuilder.include(it[i])
|
||||
}
|
||||
isOnlyCarLocation = false
|
||||
}
|
||||
|
||||
if (!isOnlyCarLocation) {
|
||||
val cameraPosition = CameraPosition.Builder().tilt(mTilt).build()
|
||||
//第二个参数为四周留空宽度
|
||||
mAMap!!.moveCamera(
|
||||
CameraUpdateFactory.newLatLngBoundsRect(
|
||||
boundsBuilder.build(),
|
||||
AutoSizeUtils.dp2px(context, leftPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, rightPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, topPadding.toFloat()),
|
||||
AutoSizeUtils.dp2px(context, bottomPadding.toFloat())
|
||||
)
|
||||
)
|
||||
)
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
} else {
|
||||
//设置希望展示的地图缩放级别
|
||||
val cameraPosition = CameraPosition.Builder()
|
||||
.target(mCarMarker!!.position).tilt(mTilt).zoom(zoomLevel.toFloat()).build()
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
} else {
|
||||
//设置希望展示的地图缩放级别
|
||||
val cameraPosition = CameraPosition.Builder()
|
||||
.target(mCarMarker!!.position).tilt(mTilt).zoom(zoomLevel.toFloat()).build()
|
||||
mAMap!!.moveCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -885,7 +908,7 @@ class OverMapView @JvmOverloads constructor(
|
||||
*/
|
||||
override fun onAutopilotRotting(globalPathResp: MessagePad.GlobalPathResp?) {
|
||||
globalPathResp?.let {
|
||||
singlePool.execute {
|
||||
ThreadUtils.getIoPool().execute {
|
||||
handlePlanningData(it.wayPointsList)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user