From 1d313e79e41a32b8853b21b6276717e2606d19f8 Mon Sep 17 00:00:00 2001 From: bxb Date: Thu, 9 Mar 2023 23:03:21 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=85=E6=89=AB=E8=BD=A6]=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=BD=A8=E8=BF=B9=E8=B7=AF=E7=BA=BF=E7=BB=98=E5=88=B6=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BF=AE=E6=94=B9=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SweeperRoutePlanningUpdateReqBean.java | 3 +- .../sweeper/callback/ISweeperTaskCallback.kt | 7 + .../ISweeperTaskDataToFragmentCallback.kt | 14 ++ .../callback/ISweeperTaskRouteCallback.kt | 8 + .../mogo/och/sweeper/event/WeltDataEvent.java | 2 +- .../fragment/BaseSweeperTabFragment.java | 141 ++++++++++---- .../och/sweeper/fragment/SweeperFragment.kt | 92 ++++----- .../fragment/WeltMapOverViewFragment.kt | 106 ++++------- .../och/sweeper/model/SweeperTaskModel.java | 98 +++++++--- .../sweeper/presenter/SweeperPresenter.java | 18 +- .../mogo/och/sweeper/view/WeltMapOverView.kt | 145 ++++++++++----- .../mogo/och/sweeper/view/WeltSmallMapView.kt | 174 ++++++++++++------ .../layout/sweeper_welt_small_map_view.xml | 2 +- 13 files changed, 510 insertions(+), 300 deletions(-) create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskDataToFragmentCallback.kt create mode 100644 OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskRouteCallback.kt diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java index 9d58dbb4c4..e3704e1db8 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/bean/SweeperRoutePlanningUpdateReqBean.java @@ -1,5 +1,6 @@ package com.mogo.och.sweeper.bean; +import java.io.Serializable; import java.util.List; /** @@ -7,7 +8,7 @@ import java.util.List; * * 订单状态更新请求数据结构 */ -public class SweeperRoutePlanningUpdateReqBean { +public class SweeperRoutePlanningUpdateReqBean implements Serializable { public String sn; public int lineId; public int startSiteId; diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt index 7d5e5ef749..182d0b9c4f 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskCallback.kt @@ -1,10 +1,12 @@ package com.mogo.och.sweeper.callback import com.mogo.och.sweeper.bean.SweeperMainTaskBean +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean import com.mogo.och.sweeper.bean.SweeperSubTaskBean import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean import com.mogo.och.sweeper.constant.SubTaskTypeEnum import com.mogo.och.sweeper.constant.TaskStatusEnum +import java.util.ArrayList /** * @author: wangmingjun @@ -36,4 +38,9 @@ interface ISweeperTaskCallback { */ fun setSubTakDetail(subTaskDetailBean: SweeperSubTaskDetailBean,subTaskTypeEnum: SubTaskTypeEnum) + /** + * 设置轨迹坐标点集合 + */ + fun setRouteList(routeList: ArrayList) + } \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskDataToFragmentCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskDataToFragmentCallback.kt new file mode 100644 index 0000000000..a028dc42ce --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskDataToFragmentCallback.kt @@ -0,0 +1,14 @@ +package com.mogo.och.sweeper.callback + +import com.amap.api.maps.model.LatLng +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean +import com.mogo.och.sweeper.database.bean.WeltDataBean +import java.util.ArrayList + +interface ISweeperTaskDataToFragmentCallback { + fun setRouteList(routeList: ArrayList) + fun setWeltData(weltDatas: ArrayList?, distance: String) + fun clearAllMarkerAndPolyline() + fun setProgress(progress:String) + fun setTaskListCoordinatesLatLng(coordinatesLatLng: ArrayList) +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskRouteCallback.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskRouteCallback.kt new file mode 100644 index 0000000000..5711c8e6ab --- /dev/null +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/callback/ISweeperTaskRouteCallback.kt @@ -0,0 +1,8 @@ +package com.mogo.och.sweeper.callback + +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean +import java.util.ArrayList + +interface ISweeperTaskRouteCallback { + fun setRouteList(routeList:ArrayList) +} \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/event/WeltDataEvent.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/event/WeltDataEvent.java index d260bbe3f4..f294bae32a 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/event/WeltDataEvent.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/event/WeltDataEvent.java @@ -6,7 +6,7 @@ import com.mogo.och.sweeper.database.bean.WeltDataBean; import java.util.ArrayList; public class WeltDataEvent{ - private int type; //1.添加起点和终点 2.实时添加贴边数据 3.清除数据 4.任务进度 + private int type; //1.添加起点和终点 2.实时添加贴边数据 3.清除数据 4.任务进度 5:任务轨迹数据 private ArrayList weltDataBeanList; private ArrayList markers; private String distance;//贴边数据 diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java index ee5728ca9e..7dffab403d 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java @@ -32,15 +32,17 @@ import com.mogo.map.uicontroller.IMogoMapUIController; import com.mogo.map.uicontroller.VisualAngleMode; import com.mogo.och.common.module.map.AmapNaviToDestinationModel; import com.mogo.och.sweeper.R; +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean; +import com.mogo.och.sweeper.callback.ISweeperTaskDataToFragmentCallback; import com.mogo.och.sweeper.callback.IWeltMapSwitchToSmallCallback; import com.mogo.och.sweeper.database.bean.WeltDataBean; -import com.mogo.och.sweeper.event.WeltDataEvent; import com.mogo.och.sweeper.view.SweeperTrafficDataView; import com.mogo.och.sweeper.view.WeltSmallMapView; -import org.greenrobot.eventbus.EventBus; - +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; +import java.util.List; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -55,7 +57,7 @@ import androidx.fragment.app.FragmentTransaction; * @author tongchenfei */ public abstract class BaseSweeperTabFragment> extends MvpFragment implements IMogoMapListener, - View.OnClickListener, IWeltMapSwitchToSmallCallback,View.OnTouchListener { + View.OnClickListener, IWeltMapSwitchToSmallCallback, View.OnTouchListener { private static final String TAG = "BaseSweeperTabFragment"; //地图放大缩小 @@ -88,9 +90,11 @@ public abstract class BaseSweeperTabFragment weltDataBeanList;//存储贴边数据 - private ArrayList latLngList;//存储任务起点和终点 + private ArrayList mWeltDataBeanList;//存储贴边数据 + private ArrayList mSubTaskCoordinates;//存储当前大任务的所有子任务起点和终点 + private ArrayList mRouteList;//存储任务的坐标轨迹 private String mProgress; + private ISweeperTaskDataToFragmentCallback mTaskDataToFragmentCallback; @Override protected int getLayoutId() { @@ -167,17 +171,19 @@ public abstract class BaseSweeperTabFragment{ + ThreadUtils.runOnUiThread(() -> { mMapWeltView.setTaskProgress(progress); - mProgress=progress; + mProgress = progress; + if (mTaskDataToFragmentCallback != null) { + mTaskDataToFragmentCallback.setProgress(progress); + } }); - WeltDataEvent weltDataEvent= new WeltDataEvent(4); - weltDataEvent.setProgress(progress); - EventBus.getDefault().postSticky(weltDataEvent); } + @Override protected void initViews(Bundle savedInstanceState) { super.initViews(savedInstanceState); @@ -409,7 +415,8 @@ public abstract class BaseSweeperTabFragment weltDataBeans, Boolean isWeltData, String distance) { - if (mMapWeltView != null) { - UiThreadHandler.post(() -> { - mMapWeltView.setWeltData(weltDataBeans, isWeltData, distance); - mMapWeltView.drawablePolyline(); - }); - } - this.weltDataBeanList = weltDataBeans; - WeltDataEvent weltDataEvent= new WeltDataEvent(2); - weltDataEvent.setWeltDataBeanList(weltDataBeanList); - weltDataEvent.setDistance(distance); - EventBus.getDefault().postSticky(weltDataEvent); + mWeltDataBeanList = weltDataBeans; + ThreadUtils.getSinglePool().execute(new Runnable() { + @Override + public void run() { + if (mMapWeltView != null) { + mMapWeltView.setWeltData(weltDataBeans, isWeltData, distance); + } + if (mTaskDataToFragmentCallback != null) { + mTaskDataToFragmentCallback.setWeltData(weltDataBeans, distance); + } + } + }); } - /** - * 作业任务全览图的添加起点和终点 - */ - public void addStartAndEndMarker(LatLng startPoint, LatLng endPoint) { + public void setTaskListCoordinatesLatLng(ArrayList subTaskCoordinates) { + this.mSubTaskCoordinates = subTaskCoordinates; if (mMapWeltView != null) { - mMapWeltView.addStartAndEndMarker(startPoint, endPoint); + mMapWeltView.setTaskListCoordinatesLatLng(subTaskCoordinates); + } + if (mTaskDataToFragmentCallback != null) { + mTaskDataToFragmentCallback.setTaskListCoordinatesLatLng(subTaskCoordinates); } - ArrayList latLngs = new ArrayList<>(2); - latLngs.add(0, startPoint); - latLngs.add(1, endPoint); - this.latLngList = latLngs; - WeltDataEvent weltDataEvent= new WeltDataEvent(1); - weltDataEvent.setMarkers(latLngs); - EventBus.getDefault().postSticky(weltDataEvent); } /** @@ -481,7 +483,9 @@ public abstract class BaseSweeperTabFragment routeList) { + mRouteList = routeList; + ThreadUtils.getSinglePool().execute(new Runnable() { + @Override + public void run() { + mMapWeltView.setRouteList(routeList); + if (mTaskDataToFragmentCallback != null) { + mTaskDataToFragmentCallback.setRouteList(routeList); + } + } + }); + } + + public static String format(double value) { + BigDecimal bd = new BigDecimal(value); + bd = bd.setScale(2, RoundingMode.HALF_UP); + return bd.toString(); + } + + public void setTaskDataToFragmentCallback(ISweeperTaskDataToFragmentCallback mTaskDataToFragmentCallback) { + this.mTaskDataToFragmentCallback = mTaskDataToFragmentCallback; + } + /** * 结束子任务 */ public void debugEndSubTask() { + ArrayList resultArrayList = tempData(); + setTaskRouteList(resultArrayList); + UiThreadHandler.postDelayed(() -> { + ArrayList routeList =tempData1(); + ArrayList weltDataBeans = new ArrayList<>(); + ArrayList subTaskCoordinates=new ArrayList<>(); + for (int i = 0; i < routeList.size(); i++) { + WeltDataBean weltDataBean = new WeltDataBean(); + weltDataBean.setLocLon(routeList.get(i).longitude); + weltDataBean.setLocLat(routeList.get(i).latitude); + weltDataBean.setWeltDistance(Math.random() * 50); + weltDataBeans.add(weltDataBean); + subTaskCoordinates.add(new LatLng(routeList.get(i).latitude,routeList.get(i).longitude)); + } + setTaskListCoordinatesLatLng(subTaskCoordinates); + setWeltDataToMap(weltDataBeans, true, format(Math.random() * 50)); + }, 2000); + } + private ArrayList tempData() { + ArrayList results = new ArrayList<>(); + results.add(getRoute(116.41732262522,39.974576894194)); + results.add(getRoute(116.43963532201855,39.9752190287537)); + results.add(getRoute(116.4440910789222,39.96469276598098)); + results.add(getRoute(116.45254030604285,39.958762580403544)); + results.add(getRoute(116.46168616811329,39.94668171374373)); + return results; + } + private ArrayList tempData1() { + ArrayList results = new ArrayList<>(); + results.add(getRoute(116.41732262522,39.974576894194)); + results.add(getRoute(116.43963532201855,39.9752190287537)); + results.add(getRoute(116.4440910789222,39.96469276598098)); + return results; + } + private SweeperRoutePlanningUpdateReqBean.Result getRoute(double longitude,double latitude){ + SweeperRoutePlanningUpdateReqBean.Result result = new SweeperRoutePlanningUpdateReqBean.Result(); + result.latitude = latitude; + result.longitude =longitude; + return result; } } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt index f192b08973..59d1b92477 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/SweeperFragment.kt @@ -6,6 +6,7 @@ import android.view.View import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import chassis.ChassisStatesOuterClass +import com.amap.api.maps.model.LatLng import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d @@ -14,14 +15,10 @@ import com.mogo.eagle.core.utilcode.util.ClickUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil import com.mogo.och.sweeper.R -import com.mogo.och.sweeper.bean.SubInfo -import com.mogo.och.sweeper.bean.SweeperMainTaskBean -import com.mogo.och.sweeper.bean.SweeperSubTaskBean -import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean +import com.mogo.och.sweeper.bean.* import com.mogo.och.sweeper.constant.SubTaskTypeEnum import com.mogo.och.sweeper.constant.TaskStatusEnum import com.mogo.och.sweeper.database.MyDataBase -import com.mogo.och.sweeper.database.bean.WeltDataBean import com.mogo.och.sweeper.presenter.SweeperPresenter import com.mogo.och.sweeper.ui.adapter.TaskListAdapter import com.mogo.och.sweeper.ui.dialog.SweeperManualDrivingDialog @@ -34,15 +31,17 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.math.BigDecimal import java.math.RoundingMode +import kotlin.math.roundToInt /** * 清扫车主界面 */ class SweeperFragment : BaseSweeperTabFragment(), MenuPopWindow.OnMenuItemOnClickListener { - companion object{ + companion object { const val TAG = "SweeperFragment" } + private var mAdapter: TaskListAdapter? = null private var mCurrentSubPosition: Int = 0 //子任务下标 private var mSubMutableList: MutableList? = null @@ -68,11 +67,11 @@ class SweeperFragment : BaseSweeperTabFragment?,refresh: Boolean) { + fun setMainTaskList(mainTaskBeanList: MutableList?, refresh: Boolean) { setShowCurrentTaskPanelView(false) setShowTaskListPanelView(true) sweeper_cl_work_mode.visibility = View.GONE @@ -223,7 +222,7 @@ class SweeperFragment : BaseSweeperTabFragment { //子任务开始 setTaskBtn(true) sweeper_current_task_view.setTaskStatus(2) - if (mSubTaskType==SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE){ + if (mSubTaskType == SubTaskTypeEnum.MANUAL_DRIVING_SUBTYPE) { sweeper_current_task_view.setCurrentData(mCurrentSubPosition) } } @@ -315,16 +316,6 @@ class SweeperFragment : BaseSweeperTabFragment() + val dataList = ArrayList() for (index in subList.indices) { val startPoint = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( AbsMogoApplication.getApp(), subList[index].startWgs84Lon, subList[index].startWgs84Lat ) - val startWeltData = WeltDataBean() - startWeltData.locLat = startPoint.latitude - startWeltData.locLon = startPoint.longitude - startWeltData.weltDistance = -9999.0 - dataList.add(startWeltData) + val startLatLng = LatLng(startPoint.latitude, startPoint.longitude) + dataList.add(index,startLatLng) val endPoint = CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj( AbsMogoApplication.getApp(), subList[index].endWgs84Lon, subList[index].endWgs84Lat ) - val endWeltData = WeltDataBean() - endWeltData.locLat = endPoint.latitude - endWeltData.locLon = endPoint.longitude - endWeltData.weltDistance = -9999.0 - dataList.add(endWeltData) + val endLatLng = LatLng(endPoint.latitude, endPoint.longitude) + dataList.add(index+1,endLatLng) } - setWeltDataToMap(dataList, false, "0") + setTaskListCoordinatesLatLng(dataList) } } } //模拟结束子任务 override fun debugEndSubTask() { - mPresenter?.onArriveTaskEnd(null) + //mPresenter?.onArriveTaskEnd(null) + super.debugEndSubTask() + } + + /** + * 设置路线轨迹 + */ + override fun setTaskRouteList(routeList: ArrayList) { + super.setTaskRouteList(routeList) } } \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt index 051bb545ab..451041752b 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/WeltMapOverViewFragment.kt @@ -1,29 +1,22 @@ package com.mogo.och.sweeper.fragment import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.lifecycle.lifecycleScope import com.amap.api.maps.model.LatLng import com.mogo.commons.mvp.BaseFragment import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean +import com.mogo.och.sweeper.callback.ISweeperTaskDataToFragmentCallback import com.mogo.och.sweeper.callback.IWeltMapSwitchToSmallCallback import com.mogo.och.sweeper.database.bean.WeltDataBean -import com.mogo.och.sweeper.event.WeltDataEvent import kotlinx.android.synthetic.main.fragment_welt_map_overview.* import kotlinx.android.synthetic.main.sweeper_welt_map_overview.* -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import org.greenrobot.eventbus.EventBus -import org.greenrobot.eventbus.Subscribe -import org.greenrobot.eventbus.ThreadMode /** * 作业任务全览图 */ -class WeltMapOverViewFragment() : BaseFragment() { +class WeltMapOverViewFragment() : BaseFragment(), ISweeperTaskDataToFragmentCallback { private var mIWeltMapSwitchToSmallCallBack: IWeltMapSwitchToSmallCallback? = null + private var mFragment: SweeperFragment? = null override fun getLayoutId(): Int = R.layout.fragment_welt_map_overview override fun getTagName(): String { return "WeltMapOverViewFragment" @@ -35,11 +28,10 @@ class WeltMapOverViewFragment() : BaseFragment() { fun setWeltMapSwitchToSmallCallBack(iWeltMapSwitchToSmallCallback: IWeltMapSwitchToSmallCallback){ this.mIWeltMapSwitchToSmallCallBack=iWeltMapSwitchToSmallCallback } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - EventBus.getDefault().register(this) - return super.onCreateView(inflater, container, savedInstanceState) + fun setSweeperFragment(fragment: SweeperFragment){ + this.mFragment=fragment + mFragment?.setTaskDataToFragmentCallback(this) } - override fun initViews(savedInstanceState: Bundle?) { super.initViews(savedInstanceState) weltMapOverView.onCreateView(savedInstanceState) @@ -48,17 +40,18 @@ class WeltMapOverViewFragment() : BaseFragment() { } val bundle = arguments if (bundle != null) { - val latLngs = bundle.getSerializable("startAndEndPoint") as? ArrayList + val latLngs = bundle.getSerializable("subTaskCoordinates") as? ArrayList val weltDataList = bundle.getSerializable("weltDataList") as? ArrayList + val routeList = bundle.getSerializable("routeList") as? ArrayList val progress = bundle.getString("progress") + routeList?.let { + weltMapOverView.setRouteList(it) + } latLngs?.let { - if (it.size >= 2) { - addStartAndEndMarker(it[0], it[1]) - } + setTaskListCoordinatesLatLng(it) } weltDataList?.let { - setWeltData(it,false,"0") - drawablePolyline() + setWeltData(it,"0.0") } progress?.let { weltMapOverView.setProgress(progress) @@ -73,14 +66,18 @@ class WeltMapOverViewFragment() : BaseFragment() { mIWeltMapSwitchToSmallCallBack: IWeltMapSwitchToSmallCallback, weltDataList: ArrayList?, latLngs: ArrayList?, - progress:String? + routeList: ArrayList?, + progress:String?, + sweeperFragment: SweeperFragment ): WeltMapOverViewFragment { val args = Bundle() args.putSerializable("weltDataList", weltDataList) - args.putSerializable("startAndEndPoint", latLngs) + args.putSerializable("subTaskCoordinates", latLngs) + args.putSerializable("routeList", routeList) args.putString("progress", progress) val fragment = WeltMapOverViewFragment() fragment.setWeltMapSwitchToSmallCallBack(mIWeltMapSwitchToSmallCallBack) + fragment.setSweeperFragment(sweeperFragment) fragment.arguments = args return fragment } @@ -100,56 +97,23 @@ class WeltMapOverViewFragment() : BaseFragment() { super.onDestroy() weltMapOverView.onDestroy() } - - override fun onDestroyView() { - super.onDestroyView() - EventBus.getDefault().unregister(this) + override fun setTaskListCoordinatesLatLng(coordinatesLatLng: java.util.ArrayList) { + weltMapOverView.setTaskListCoordinatesLatLng(coordinatesLatLng) } - @Subscribe(threadMode = ThreadMode.BACKGROUND) - fun changeWeltData(weltDataEvent: WeltDataEvent) { - if (weltDataEvent.type == 1) { - lifecycleScope.launch(Dispatchers.Main) { - weltDataEvent.markers?.let { - addStartAndEndMarker(it[0], it[1]) - } - } - } else if (weltDataEvent.type == 2) { - lifecycleScope.launch(Dispatchers.Main) { - setWeltData(weltDataEvent.weltDataBeanList,true,weltDataEvent.distance) - drawablePolyline() - } - } else if (weltDataEvent.type == 3) { - lifecycleScope.launch(Dispatchers.Main) { - clearAllMarkerAndPolyline() - } - }else if (weltDataEvent.type == 4){ - weltMapOverView.setProgress(weltDataEvent.progress) - } - } - - /** - * 设置任务路线数据 - */ - private fun setWeltData(weltDatas: MutableList?,isWeltData:Boolean,distance:String) { - weltMapOverView.setWeltData(weltDatas,isWeltData,distance) - } - - /** - * 绘制任务路线数据 - */ - private fun drawablePolyline() { - weltMapOverView.drawablePolyline() - } - - /** - * 添加起点和终点marker - */ - private fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { - weltMapOverView.drawStartAndEndMarker(startPoint, endPoint) - } - - private fun clearAllMarkerAndPolyline() { + override fun clearAllMarkerAndPolyline() { weltMapOverView.clearAllMarkerAndPolyline() } + + override fun setProgress(progress: String) { + weltMapOverView.setProgress(progress) + } + + override fun setRouteList(routeList: java.util.ArrayList) { + weltMapOverView.setRouteList(routeList) + } + + override fun setWeltData(weltDatas: java.util.ArrayList?, distance: String) { + weltMapOverView.setWeltData(weltDatas,true,distance) + } } \ No newline at end of file diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperTaskModel.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperTaskModel.java index 3b2a7a104c..7703fa3d01 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperTaskModel.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/model/SweeperTaskModel.java @@ -46,6 +46,7 @@ import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean; import com.mogo.och.sweeper.callback.ISweeperADASStatusCallback; import com.mogo.och.sweeper.callback.ISweeperControllerStatusCallback; import com.mogo.och.sweeper.callback.ISweeperTaskCallback; +import com.mogo.och.sweeper.callback.ISweeperTaskRouteCallback; import com.mogo.och.sweeper.constant.SubTaskTypeEnum; import com.mogo.och.sweeper.constant.SweeperConst; import com.mogo.och.sweeper.constant.TaskStatusEnum; @@ -83,7 +84,7 @@ public class SweeperTaskModel { private ISweeperControllerStatusCallback mControllerStatusCallback; //Model->Presenter:VR mode等 private ISweeperADASStatusCallback mADASStatusCallback; private ISweeperTaskCallback mSweeperTaskCallback; - List points = new ArrayList<>();//全路径信息 + ArrayList points = new ArrayList<>();//全路径信息 //当前子任务详情信息包括轨迹文件信息 private SweeperSubTaskDetailBean mCurrentSubTaskDetail; //子任务是否正在进行中 @@ -97,12 +98,17 @@ public class SweeperTaskModel { //当前任务是否是第一个 private boolean mIsFirstSubtask = false; //当前任务是否是第一个 - private int mSubTaskType=0; //1自动驾驶 2.人工驾驶 + private int mSubTaskType = 0; //1自动驾驶 2.人工驾驶 //0: 代表没有启动过 1代表是启动第一次,当>=1 代表是重试 每次子任务结束/主任务结束清空置为0 private volatile int firstStartAutopilot = 0; + private int mLineId;//路线id //自动驾驶状态 private int mAutopilotState = IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_DISABLE; + private String longitude;//经度 + + private String latitude;//纬度 + public static SweeperTaskModel getInstance() { if (sInstance == null) { synchronized (SweeperTaskModel.class) { @@ -190,27 +196,42 @@ public class SweeperTaskModel { @Override public void onAutopilotRotting(MessagePad.GlobalPathResp routeList) { if (null != routeList && routeList.getWayPointsList().size() > 0) { - points.clear(); - points.addAll(coordinateConverterWgsToGcjList(mContext, routeList.getWayPointsList())); + if (mCurrentSubTaskDetail.getLineId() != mLineId) {//判断是否同一条路线 + mLineId = mCurrentSubTaskDetail.getLineId(); + points.addAll(coordinateConverterWgsToGcjList(mContext, routeList.getWayPointsList())); + if (mSweeperTaskCallback != null) { + mSweeperTaskCallback.setRouteList(points); + } + } } } }; - public void setSubtask(boolean isFirstSubtask, boolean isLastSubtask, int subTaskId,int subTaskType) { + public void setSubtask(boolean isFirstSubtask, boolean isLastSubtask, int subTaskId, int subTaskType) { this.mIsLastSubtask = isLastSubtask; this.mIsFirstSubtask = isFirstSubtask; this.mSubTaskId = subTaskId; - this.mSubTaskType=subTaskType; + this.mSubTaskType = subTaskType; + } + + /** + * 清除路线缓存数据 + */ + public void clearRouteList() { + points.clear(); + mSubTaskType=0; } /** * 保存自动驾驶状态 + * * @param autopilotState */ - public void setAutopilotState(int autopilotState){ - this.mAutopilotState=autopilotState; + public void setAutopilotState(int autopilotState) { + this.mAutopilotState = autopilotState; } + public static List coordinateConverterWgsToGcjList(Context mContext, List mogoLatLngList) { List points = new ArrayList<>(); @@ -247,11 +268,11 @@ public class SweeperTaskModel { @Override public void onMsgReceived(OCHOperationalMessage obj) { - if (obj == null){ + if (obj == null) { CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onMsgReceived = null"); return; } - CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onMsgReceived = "+obj.getMessage()); + CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "onMsgReceived = " + obj.getMessage()); OCHSocketMessageManager.INSTANCE.pushAppOperationalMsgBox(obj.getPushTimeStamp(), obj.getMessage()); } @@ -290,16 +311,39 @@ public class SweeperTaskModel { if (mControllerStatusCallback != null) { mControllerStatusCallback.onCarLocationChanged(gnssInfo); } - if (mSubTaskType==2){//人工驾驶子任务需要手动跳过,不能自动结束 + if (mSubTaskType == 2) {//人工驾驶子任务需要手动跳过,不能自动结束 + addCoordinates(gnssInfo); return; } //子任务完成的围栏判断 子任务正在执行中,还未到达子任务终点 - if (mIsSubTaskWorking&&!isArriveSubTaskEndSite) { + if (mIsSubTaskWorking && !isArriveSubTaskEndSite) { judgeArrivedStation(gnssInfo); } } }; + /** + * 根据当前定位收集人工驾驶子任务轨迹点 + * + * @param mogoLatLng + */ + private void addCoordinates(MogoLocation mogoLatLng) { + String tempLongitude = NumberFormatUtil.cutOutNumber(mogoLatLng.getLongitude(), 5); + String tempLatitude = NumberFormatUtil.cutOutNumber(mogoLatLng.getLatitude(), 5); + //用于过滤车是否停在原地,经纬度相同的情况 + if (!tempLongitude.equals(longitude) && !tempLatitude.equals(latitude)) { + latitude = NumberFormatUtil.cutOutNumber(mogoLatLng.getLatitude(), 5); + longitude = NumberFormatUtil.cutOutNumber(mogoLatLng.getLongitude(), 5); + SweeperRoutePlanningUpdateReqBean.Result result = new SweeperRoutePlanningUpdateReqBean.Result(); + result.latitude = mogoLatLng.getLatitude(); + result.longitude = mogoLatLng.getLongitude(); + points.add(result); + if (mSweeperTaskCallback != null) { + mSweeperTaskCallback.setRouteList(points); + } + } + } + //根据围栏判断,是否到达子任务终点 private void judgeArrivedStation(MogoLocation location) { double endSiteLon = mCurrentSubTaskDetail.getEndSiteLon(); @@ -312,7 +356,7 @@ public class SweeperTaskModel { + " to " + mCurrentSubTaskDetail.getEndSiteName()); Log.d(TAG, "行程日志-judgeArrivedStation() distance = " + distance + " to " + mCurrentSubTaskDetail.getEndSiteName()); - isArriveSubTaskEndSite=true; + isArriveSubTaskEndSite = true; //到达子任务终点 结束子任务 subTaskEnd(mIsFirstSubtask, mIsLastSubtask, mSubTaskId); //无自动驾驶到终点信息传null return; @@ -363,9 +407,11 @@ public class SweeperTaskModel { public boolean getSubWorking() { return mIsSubTaskWorking; } - public void setWorking(Boolean isWorking){ - this.mIsSubTaskWorking=isWorking; + + public void setWorking(Boolean isWorking) { + this.mIsSubTaskWorking = isWorking; } + /** * 关闭美化模式 */ @@ -393,10 +439,10 @@ public class SweeperTaskModel { //MAP 280 每隔100ms左右返回一次到站, 导致在到达中间站后再次滑动出发后会有时间差,收到一次到站,出现问题 //此处比对 自驾告诉的子任务终点坐标和本地应到子任务终点坐标, 一致时才表示子任务完成 if (data != null && data.getEndLocation() != null && mCurrentSubTaskDetail != null) { - Log.d(M_SWEEPER + TAG, "MAP到站通知:"+mCurrentSubTaskDetail.getEndSiteName()+"经度:" - +data.getEndLocation().getLongitude()+"纬度:"+data.getEndLocation().getLongitude()); - CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "MAP到站通知:"+mCurrentSubTaskDetail.getEndSiteName()+"经度:" - +data.getEndLocation().getLongitude()+"纬度:"+data.getEndLocation().getLatitude()); + Log.d(M_SWEEPER + TAG, "MAP到站通知:" + mCurrentSubTaskDetail.getEndSiteName() + "经度:" + + data.getEndLocation().getLongitude() + "纬度:" + data.getEndLocation().getLongitude()); + CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "MAP到站通知:" + mCurrentSubTaskDetail.getEndSiteName() + "经度:" + + data.getEndLocation().getLongitude() + "纬度:" + data.getEndLocation().getLatitude()); String latitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLatitude(), 5); //wgs String longitude = NumberFormatUtil.cutOutNumber(data.getEndLocation().getLongitude(), 5); String arriveLat = NumberFormatUtil.cutOutNumber(mCurrentSubTaskDetail.getEndSiteWgs64Lat(), 5); @@ -406,13 +452,13 @@ public class SweeperTaskModel { return; } } - if (mSubTaskType==2){//人工驾驶子任务需要手动跳过,不能自动结束 + if (mSubTaskType == 2) {//人工驾驶子任务需要手动跳过,不能自动结束 return; } if (isArriveSubTaskEndSite) return; CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "行程日志-当前==subTaskId=" + mSubTaskId); - isArriveSubTaskEndSite=true; + isArriveSubTaskEndSite = true; //到达子任务终点 结束子任务 subTaskEnd(mIsFirstSubtask, mIsLastSubtask, mSubTaskId); } @@ -424,9 +470,11 @@ public class SweeperTaskModel { SweeperAnalyticsManager.getInstance().triggerStartAutopilotEvent(isRestart, send, mCurrentSubTaskDetail.getStartSiteName(), mCurrentSubTaskDetail.getEndSiteName(), mCurrentSubTaskDetail.getLineId()); } + public boolean isRestartAutopilot() { return firstStartAutopilot > 1; } + public void triggerUnableStartAPReasonEvent() { if (mCurrentSubTaskDetail == null) { return; @@ -530,7 +578,7 @@ public class SweeperTaskModel { CallerLogger.INSTANCE.d(M_SWEEPER + TAG, "getMainTaskList:" + GsonUtil.jsonFromObject(data)); if (mSweeperTaskCallback != null && data != null && data.getCode() == 0) { List list = data.getData(); - mSweeperTaskCallback.setMainTaskList(list,refresh); + mSweeperTaskCallback.setMainTaskList(list, refresh); } } @@ -616,7 +664,7 @@ public class SweeperTaskModel { /** * 在自动驾驶状态 */ - if (isStartSubtask&&mAutopilotState==IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//是否需要自动开始执行任务 + if (isStartSubtask && mAutopilotState == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) {//是否需要自动开始执行任务 subTaskStart(isFirst, isEnd, subTaskId, subTaskType); } } @@ -657,7 +705,7 @@ public class SweeperTaskModel { if (mSweeperTaskCallback != null && data != null) { if (data.getData()) { mIsSubTaskWorking = true; - isArriveSubTaskEndSite=false; + isArriveSubTaskEndSite = false; mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.START_SUBTASK, false); if (subTaskType == SubTaskTypeEnum.AUTOPILOT_SUBTYPE) {//如果是自动驾驶子任务子开启自驾 if (FunctionBuildConfig.isDemoMode) {//美化模式开启时 @@ -708,7 +756,7 @@ public class SweeperTaskModel { if (data != null) { if (data.getData()) { mIsSubTaskWorking = false; - if (mSweeperTaskCallback!=null){ + if (mSweeperTaskCallback != null) { mSweeperTaskCallback.updateSubTaskStatus(TaskStatusEnum.END_SUBTASK, isEnd); } if (isEnd) { diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java index dc592e8d63..c540cd8fc7 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/presenter/SweeperPresenter.java @@ -18,11 +18,13 @@ import com.mogo.och.common.module.manager.OCHAdasAbilityManager; import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil; import com.mogo.och.common.module.utils.NumberFormatUtil; import com.mogo.och.sweeper.bean.SweeperMainTaskBean; +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean; import com.mogo.och.sweeper.bean.SweeperSubTaskBean; import com.mogo.och.sweeper.bean.SweeperSubTaskDetailBean; import com.mogo.och.sweeper.callback.ISweeperADASStatusCallback; import com.mogo.och.sweeper.callback.ISweeperControllerStatusCallback; import com.mogo.och.sweeper.callback.ISweeperTaskCallback; +import com.mogo.och.sweeper.callback.ISweeperTaskRouteCallback; import com.mogo.och.sweeper.constant.SubTaskTypeEnum; import com.mogo.och.sweeper.constant.TaskStatusEnum; import com.mogo.och.sweeper.database.MyDataBase; @@ -57,7 +59,7 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_SWE */ public class SweeperPresenter extends Presenter implements IMoGoAutopilotStatusListener, ISweeperControllerStatusCallback, ISweeperADASStatusCallback, - IMoGoSweeperFutianCleanSystemListener, ISweeperTaskCallback { + IMoGoSweeperFutianCleanSystemListener, ISweeperTaskCallback, ISweeperTaskRouteCallback { private static final String TAG = "SweeperPresenter"; //当前子任务id @@ -181,7 +183,12 @@ public class SweeperPresenter extends Presenter public void startOpenAutopilot() { } - + /** + * 清除路线缓存数据 + */ + public void clearRouteList(){ + SweeperTaskModel.getInstance().clearRouteList(); + } public void startAutopilot() { SweeperTaskModel.getInstance().startAutopilot(); } @@ -435,10 +442,9 @@ public class SweeperPresenter extends Presenter @Override public void setSubTakDetail(@NonNull SweeperSubTaskDetailBean subTaskDetailBean, SubTaskTypeEnum subTaskTypeEnum) { - mView.setSubTakDetail(subTaskDetailBean, subTaskTypeEnum); } - //mock贴边数据 - private void weltData(MogoLocation location){ - + @Override + public void setRouteList(@NonNull ArrayList routeList) { + //mView.setTaskRouteList(routeList); } } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt index 52b34d2a28..487c2bb275 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltMapOverView.kt @@ -16,7 +16,9 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Liste import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean import com.mogo.och.sweeper.database.bean.WeltDataBean import com.mogo.och.sweeper.util.SweeperMapAssetStyleUtil import kotlinx.android.synthetic.main.sweeper_welt_map_overview.view.* @@ -25,12 +27,11 @@ import kotlinx.android.synthetic.main.sweeper_welt_map_overview.view.* * 作业任务全览图 */ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { - private var mWeltData: MutableList = mutableListOf() //任务数据集合 - private var mCoordinatesLatLng: MutableList = mutableListOf() //任务坐标点 + private var mTaskCoordinatesLatLng: MutableList = mutableListOf() //当前大任务的所有起终点集合 private var mCarMarker: Marker? = null private var mAMap: AMap? = null - private var mPolyline: Polyline? = null - private var colorList: MutableList = mutableListOf() + private var mPolylines: MutableList = mutableListOf() + private var mRoutePolylines: Polyline?=null private val mLineMarkers: MutableList = mutableListOf() private var mFirst: Boolean = false @@ -102,40 +103,45 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { /** * 添加画线颜色值 */ - private fun addRouteColorList() { - for (i in mWeltData.indices) { - if (mWeltData[i].weltDistance == -9999.0) {//未经过 + private fun getRouteColorList(weltData: MutableList):MutableList { + val colorList= mutableListOf() + for (i in weltData.indices) { + if (weltData[i].weltDistance == -9999.0) {//未经过 colorList.add(Color.parseColor("#3BA1CC")) - } else if (mWeltData[i].weltDistance == -10000.0) {//非贴边 + } else if (weltData[i].weltDistance == -10000.0) {//非贴边 colorList.add(Color.parseColor("#236299")) - } else if (mWeltData[i].weltDistance < 0) { + } else if (weltData[i].weltDistance < 0) { colorList.add(Color.parseColor("#C22101")) - } else if (mWeltData[i].weltDistance >= 0 && mWeltData[i].weltDistance < 10) { + } else if (weltData[i].weltDistance >= 0 && weltData[i].weltDistance < 10) { colorList.add(Color.parseColor("#4DFFA4")) - } else if (mWeltData[i].weltDistance >= 10 && mWeltData[i].weltDistance < 20) { + } else if (weltData[i].weltDistance >= 10 && weltData[i].weltDistance < 20) { colorList.add(Color.parseColor("#FFDD4D")) - } else if (mWeltData[i].weltDistance >= 20) { + } else if (weltData[i].weltDistance >= 20) { colorList.add(Color.parseColor("#FF912B")) } } + return colorList } override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { - mogoLocation?.let { gnssInfo -> - val currentLatLng = LatLng(gnssInfo.latitude, gnssInfo.longitude) - //更新车辆位置 - mCarMarker?.rotateAngle = (360 - gnssInfo.heading).toFloat() - mCarMarker?.position = currentLatLng - mCarMarker?.setToTop() - //圈定地图显示范围 - val boundsBuilder = LatLngBounds.Builder() - if (mCoordinatesLatLng.size > 0) { - //存放经纬度 - for (i in mCoordinatesLatLng.indices) { - boundsBuilder.include(mCoordinatesLatLng[i]) + ThreadUtils.getSinglePool().run { + mogoLocation?.let { gnssInfo -> + val currentLatLng = LatLng(gnssInfo.latitude, gnssInfo.longitude) + //更新车辆位置 + mCarMarker?.rotateAngle = (360 - gnssInfo.heading).toFloat() + mCarMarker?.position = currentLatLng + mCarMarker?.setToTop() + //圈定地图显示范围 + val boundsBuilder = LatLngBounds.Builder() + if (mTaskCoordinatesLatLng.size > 0) { + //存放经纬度 + for (i in mTaskCoordinatesLatLng.indices) { + boundsBuilder.include(mTaskCoordinatesLatLng[i]) + } } boundsBuilder.include(currentLatLng) mAMap?.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100)) + } } } @@ -143,20 +149,24 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { /** * 根据贴边数据绘制任务路线 */ - fun drawablePolyline() { - mPolyline?.remove() - if (mAMap != null) { - addRouteColorList() - if (mWeltData.size >= 2 && mCoordinatesLatLng.size > 2) { + fun drawablePolyline(weltDatas: MutableList?) { + weltDatas?.let { + val colorList=getRouteColorList(it) + val coordinatesLatLngs= mutableListOf() + for (i in it.indices) { + coordinatesLatLngs.add(LatLng(it[i].locLat,it[i].locLon)) + } + if (coordinatesLatLngs.size > 2) { //设置线段纹理 val polylineOptions = PolylineOptions() - polylineOptions.addAll(mCoordinatesLatLng) + polylineOptions.addAll(coordinatesLatLngs) polylineOptions.width(14f) //线段宽度 polylineOptions.isUseTexture = false polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) polylineOptions.colorValues(colorList) + polylineOptions.visible(true) // 绘制线 - mPolyline = mAMap?.addPolyline(polylineOptions) + mPolylines.add(mAMap?.addPolyline(polylineOptions)) } } } @@ -164,7 +174,7 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { /** * 绘制起点和终点的marker */ - fun drawStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { + private fun drawStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { val startMarker = mAMap?.addMarker(MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.sweeper_big_start_maker_icon))) startMarker?.position = startPoint mLineMarkers.add(startMarker) @@ -177,11 +187,14 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { * 清除所有标记和路线 */ fun clearAllMarkerAndPolyline() { - mPolyline?.remove() for (i in mLineMarkers.indices) { mLineMarkers[i]?.isVisible = false mLineMarkers[i]?.remove() } + for (i in mPolylines.indices) { + mPolylines[i]?.remove() + } + mRoutePolylines?.remove() mLineMarkers.clear() //mFirst = false //showOrHiddenLegendData(false) @@ -190,22 +203,54 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { /** * 设置贴边数据 */ - fun setWeltData(weltData: MutableList?, isWeltData: Boolean, distance: String?) { - if (weltData != null) { - this.mWeltData.addAll(weltData) - for (i in mWeltData.indices) { - mCoordinatesLatLng.add(LatLng(mWeltData[i].locLat, mWeltData[i].locLon)) + fun setWeltData(weltDatas: MutableList?, isWeltData: Boolean, distance: String?) { + drawablePolyline(weltDatas) + ThreadUtils.runOnUiThread { + distance?.let { + setDistance(it) } } - distance?.let { - setDistance(it) - } //if (!mFirst && isWeltData) { // mFirst = true // showOrHiddenLegendData(true) //} } + /** + * 任务轨迹数据 + */ + fun setRouteList(routeList: ArrayList) { + val routeCoordinatesLatLngs= mutableListOf() + for (i in routeList.indices) { + routeCoordinatesLatLngs.add(LatLng(routeList[i].latitude,routeList[i].longitude)) + } + drawRouteListPolyline(routeCoordinatesLatLngs) + } + + private fun drawRouteListPolyline(routeList: MutableList) { + mRoutePolylines?.remove() + val polylineOptions = PolylineOptions() + polylineOptions.width(14f) //线段宽度 + polylineOptions.isUseTexture = false + polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + polylineOptions.color(Color.parseColor("#3BA1CC")) + polylineOptions.addAll(routeList) + polylineOptions.visible(true) + mRoutePolylines=mAMap?.addPolyline(polylineOptions) + } + + /** + * 设置当前大任务的所有子任务起终点集合 + */ + fun setTaskListCoordinatesLatLng(coordinatesLatLng: MutableList) { + ThreadUtils.runOnUiThread { + this.mTaskCoordinatesLatLng = coordinatesLatLng + if (mTaskCoordinatesLatLng.size > 0) { + drawStartAndEndMarker(mTaskCoordinatesLatLng[0], mTaskCoordinatesLatLng[mTaskCoordinatesLatLng.size - 1]) + } + } + } + /** * 设置图例数据 */ @@ -222,14 +267,22 @@ class WeltMapOverView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { private fun setDistance(distance: String) { taskWeltDistanceTv.text = "贴边:${distance}cm" } - fun setProgress(progress:String?){ + + fun setProgress(progress: String?) { progress?.let { - taskProgressTv.visibility=View.VISIBLE - taskWeltDistanceTv.visibility=View.VISIBLE - taskProgressTv.text=it - showOrHiddenLegendData(true) + if ("0" == progress) { + taskProgressTv.visibility = View.GONE + taskWeltDistanceTv.visibility = View.GONE + showOrHiddenLegendData(false) + } else { + taskProgressTv.visibility = View.VISIBLE + taskWeltDistanceTv.visibility = View.VISIBLE + taskProgressTv.text = it + showOrHiddenLegendData(true) + } } } + fun onCreateView(savedInstanceState: Bundle?) { sweeperTextureMapView.onCreate(savedInstanceState) } diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt index 8525d12f79..17a2c5931d 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/view/WeltSmallMapView.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.Color import android.os.Bundle import android.util.AttributeSet +import android.util.Log import android.view.LayoutInflater import android.view.View import android.widget.ImageView @@ -16,22 +17,23 @@ import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Liste import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationGCJ02ListenerManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.och.common.module.utils.CoordinateCalculateRouteUtil +import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.sweeper.R +import com.mogo.och.sweeper.bean.SweeperRoutePlanningUpdateReqBean import com.mogo.och.sweeper.database.bean.WeltDataBean import com.mogo.och.sweeper.util.SweeperMapAssetStyleUtil import kotlinx.android.synthetic.main.sweeper_welt_small_map_view.view.* + /** * 作业任务小地图 */ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { - private var mWeltData: MutableList = mutableListOf() //任务数据集合 - private var mCoordinatesLatLng: MutableList = mutableListOf() //任务坐标点 + private var mTaskCoordinatesLatLng: MutableList = mutableListOf() //当前大任务的所有起终点集合 private var mCarMarker: Marker? = null private var mAMap: AMap? = null - private var mPolyline: Polyline? = null - private var colorList: MutableList = mutableListOf() + private var mPolylines: MutableList = mutableListOf() + private var mRoutePolylines: Polyline?=null private val mLineMarkers: MutableList = mutableListOf() //清扫车任务地图 @@ -53,19 +55,22 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { } override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { - mogoLocation?.let { - val currentLatLng = LatLng(it.latitude, it.longitude) - drawCarMarker(mogoLocation) - //圈定地图显示范围 - val boundsBuilder = LatLngBounds.Builder() - if (mCoordinatesLatLng.size > 0) { - //存放经纬度 - for (i in mCoordinatesLatLng.indices) { - boundsBuilder.include(mCoordinatesLatLng[i]) + d(SceneConstant.M_SWEEPER + TAG, "mogoLocation:$mogoLocation") + ThreadUtils.getSinglePool().run { + mogoLocation?.let { + val currentLatLng = LatLng(it.latitude, it.longitude) + drawCarMarker(mogoLocation) + //圈定地图显示范围 + val boundsBuilder = LatLngBounds.Builder() + if (mTaskCoordinatesLatLng.size > 0) { + //存放经纬度 + for (i in mTaskCoordinatesLatLng.indices) { + boundsBuilder.include(mTaskCoordinatesLatLng[i]) + } } + boundsBuilder.include(currentLatLng) + mAMap!!.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100)) } - boundsBuilder.include(currentLatLng) - mAMap!!.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(boundsBuilder.build(), 100, 100, 100, 100)) } } @@ -126,50 +131,57 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { } /** - * 添加画线颜色值 + * 根据贴边数据绘制任务路线 */ - private fun addRouteColorList() { - for (i in mWeltData.indices) { - if (mWeltData[i].weltDistance == -9999.0) {//未经过 - colorList.add(Color.parseColor("#3BA1CC")) - } else if (mWeltData[i].weltDistance == -10000.0) {//非贴边 - colorList.add(Color.parseColor("#236299")) - } else if (mWeltData[i].weltDistance < 0) { - colorList.add(Color.parseColor("#C22101")) - } else if (mWeltData[i].weltDistance >= 0 && mWeltData[i].weltDistance < 10) { - colorList.add(Color.parseColor("#4DFFA4")) - } else if (mWeltData[i].weltDistance >= 10 && mWeltData[i].weltDistance < 20) { - colorList.add(Color.parseColor("#FFDD4D")) - } else if (mWeltData[i].weltDistance >= 20) { - colorList.add(Color.parseColor("#FF912B")) + private fun drawablePolyline(weltDatas: MutableList?) { + weltDatas?.let { + val colorList = getRouteColorList(it) + val coordinatesLatLngs = mutableListOf() + for (i in it.indices) { + coordinatesLatLngs.add(LatLng(it[i].locLat,it[i].locLon)) + } + if (coordinatesLatLngs.size > 2) { + //设置线段纹理 + val polylineOptions = PolylineOptions() + polylineOptions.addAll(coordinatesLatLngs) + polylineOptions.width(30f) //线段宽度 + polylineOptions.isUseTexture = false + polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + polylineOptions.colorValues(colorList) + polylineOptions.visible(true) + // 绘制线 + mPolylines.add(mAMap?.addPolyline(polylineOptions)) } } } /** - * 根据贴边数据绘制任务路线 + * 添加画线颜色值 */ - fun drawablePolyline() { - mPolyline?.remove() - if (mAMap != null) { - addRouteColorList() - if (mWeltData.size >= 2 && mCoordinatesLatLng.size > 2) { - val polylineOptions = PolylineOptions() - polylineOptions.addAll(mCoordinatesLatLng) - polylineOptions.width(14f) //线段宽度 - polylineOptions.isUseTexture = false - polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) - polylineOptions.colorValues(colorList) - // 绘制线 - mPolyline = mAMap?.addPolyline(polylineOptions) + private fun getRouteColorList(weltData: MutableList): MutableList { + val colorList = mutableListOf() + for (i in weltData.indices) { + if (weltData[i].weltDistance == -9999.0) {//未经过 + colorList.add(Color.parseColor("#3BA1CC")) + } else if (weltData[i].weltDistance == -10000.0) {//非贴边 + colorList.add(Color.parseColor("#236299")) + } else if (weltData[i].weltDistance < 0) { + colorList.add(Color.parseColor("#C22101")) + } else if (weltData[i].weltDistance >= 0 && weltData[i].weltDistance < 10) { + colorList.add(Color.parseColor("#4DFFA4")) + } else if (weltData[i].weltDistance >= 10 && weltData[i].weltDistance < 20) { + colorList.add(Color.parseColor("#FFDD4D")) + } else if (weltData[i].weltDistance >= 20) { + colorList.add(Color.parseColor("#FF912B")) } } + return colorList } /** * 添加起点和终点的marker */ - fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { + private fun addStartAndEndMarker(startPoint: LatLng, endPoint: LatLng) { for (i in mLineMarkers.indices) { mLineMarkers[i]?.isVisible = false mLineMarkers[i]?.remove() @@ -183,16 +195,33 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { mLineMarkers.add(endMarker) } + /** + * 设置当前大任务的所有子任务起终点集合 + */ + fun setTaskListCoordinatesLatLng(coordinatesLatLng: MutableList) { + this.mTaskCoordinatesLatLng = coordinatesLatLng + if (mTaskCoordinatesLatLng.size > 0) { + d( + SceneConstant.M_SWEEPER + TAG, + "startPoint:${mTaskCoordinatesLatLng[0]} endPoint:${mTaskCoordinatesLatLng[mTaskCoordinatesLatLng.size - 1]}" + ) + addStartAndEndMarker(mTaskCoordinatesLatLng[0], mTaskCoordinatesLatLng[mTaskCoordinatesLatLng.size - 1]) + } + } + /** * 清除所有标记和路线 */ fun clearAllMarkerAndPolyline() { - mPolyline?.remove() for (i in mLineMarkers.indices) { mLineMarkers[i]?.isVisible = false mLineMarkers[i]?.remove() } + for (i in mPolylines.indices) { + mPolylines[i]?.remove() + } mLineMarkers.clear() + mRoutePolylines?.remove() //mFirst = false //showOrHiddenWelt(false) } @@ -210,25 +239,60 @@ class WeltSmallMapView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener { /** * 设置贴边数据 */ - fun setWeltData(weltData: MutableList, isWeltData: Boolean, distance: String) { - this.mWeltData = weltData - for (i in mWeltData.indices) { - mCoordinatesLatLng.add(CoordinateCalculateRouteUtil.coordinateConverterWgsToGcj(context, mWeltData[i].locLon, mWeltData[i].locLat)) + fun setWeltData(weltDatas: MutableList, isWeltData: Boolean, distance: String) { + drawablePolyline(weltDatas) + ThreadUtils.runOnUiThread { + setWeltDistance(distance) } - taskWeltDistanceTv.text = "贴边:${distance}cm" //if (!mFirst&&isWeltData) { // showOrHiddenWelt(true) // mFirst = true //} } + /** + * 设置贴边距离 + */ + private fun setWeltDistance(distance: String) { + taskWeltDistanceTv.text = "贴边:${distance}cm" + } + + /** + * 设置任务轨迹数据 + */ + fun setRouteList(routeList: ArrayList) { + val routeCoordinatesLatLngs = mutableListOf() + for (i in routeList.indices) { + routeCoordinatesLatLngs.add(LatLng(routeList[i].latitude, routeList[i].longitude)) + } + drawRouteListPolyline(routeCoordinatesLatLngs) + } + + private fun drawRouteListPolyline(routeList: MutableList) { + mRoutePolylines?.remove() + val polylineOptions = PolylineOptions() + polylineOptions.addAll(routeList) + polylineOptions.width(14f) //线段宽度 + polylineOptions.isUseTexture = false + polylineOptions.lineCapType(PolylineOptions.LineCapType.LineCapSquare) + polylineOptions.color(Color.parseColor("#3BA1CC")) + polylineOptions.visible(true) + mRoutePolylines=mAMap?.addPolyline(polylineOptions) + } + /** * 设置任务进度 */ fun setTaskProgress(progress: String?) { - taskWeltDistanceTv.visibility = View.VISIBLE - taskProgressTv.visibility = View.VISIBLE - taskProgressTv.text = progress + if (progress == "0") { + taskWeltDistanceTv.visibility = View.GONE + taskProgressTv.visibility = View.GONE + } else { + taskWeltDistanceTv.visibility = View.VISIBLE + taskProgressTv.visibility = View.VISIBLE + taskProgressTv.text = progress + } + } fun onCreateView(savedInstanceState: Bundle?) { diff --git a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml index 854bed4e60..6433b172de 100644 --- a/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml +++ b/OCH/mogo-och-sweeper/src/main/res/layout/sweeper_welt_small_map_view.xml @@ -41,7 +41,7 @@ android:id="@+id/taskWeltDistanceTv" android:layout_width="wrap_content" android:layout_height="wrap_content" - tools:text="贴边:8cm" + android:text="贴边:0.0cm" app:layout_constraintTop_toTopOf="parent" android:background="#3d98c7" android:textColor="@color/white"