diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MarkerDrawerManager.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MarkerDrawerManager.kt index d1bccb8b3c..ff77607edf 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MarkerDrawerManager.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/MarkerDrawerManager.kt @@ -86,12 +86,33 @@ object MarkerDrawerManager { } } - fun updateRoutePoints(routePoints: List?, context: Context) { + /** + * 存储全局轨迹用于轮询计算车已走过的轨迹index + */ + fun updateGDRoutePoints(routePoints: List?) { 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?, context: Context): List { + 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 } diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt index 13b502df3d..b2da8879df 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/view/OverMapView.kt @@ -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? = 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 = locationList - // 转成高德坐标系并存储 - updateRoutePoints(list, mContext!!) - val planningPointList: List = planningPoints - UiThreadHandler.post ({ - displayCustomOverView() - drawStartAndEndMarker(planningPointList) - }, UiThreadHandler.MODE.QUEUE) - if (!isInit) { - callback = object : MarkerDrawerManager.Callback { - override fun onLocationChanged(planningPoints: List, 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, 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, locIndex: Int) { + private fun drawPolyline(coordinates: List, locIndex: Int) { if (textureList.size > 0) { textureList.clear() } @@ -819,49 +840,51 @@ class OverMapView @JvmOverloads constructor( * 站点轨迹集合被包含在地图显示范围内 */ fun includeSitePointsAndUpdateCamera(coordinates: List?) { - 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) } }