From 45e3e3ca0ddf2b0202a1ca305dbf8d8c15f6fc15 Mon Sep 17 00:00:00 2001
From: squallzhjch <zhangjingchao@navinfo.com>
Date: Tue, 18 Jul 2023 10:49:56 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=9B=BE?=
 =?UTF-8?q?=E5=8D=A1=E9=A1=BF=20=E4=BF=AE=E6=94=B9=E6=96=B0=E5=A2=9Elink?=
 =?UTF-8?q?=E7=BA=BF=E5=9E=8B=E7=BC=96=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../omqs/ui/activity/map/MainActivity.kt      |  18 ++-
 .../omqs/ui/activity/map/MainViewModel.kt     |  51 ++++---
 .../EvaluationResultViewModel.kt              |   3 +-
 .../ui/fragment/tasklink/TaskLinkFragment.kt  |  12 ++
 .../ui/fragment/tasklink/TaskLinkViewModel.kt | 141 ++++++++++++++++--
 .../src/main/assets/editormarker.xml          |   2 +-
 .../library/data/entity/HadLinkDvoBean.kt     |  10 +-
 .../collect/library/map/NIMapController.kt    |   1 -
 .../library/map/handler/BaseHandler.kt        |   5 +-
 .../library/map/handler/LineHandler.kt        |  12 ++
 .../map/handler/LocationLayerHandler.kt       |  11 +-
 .../library/map/handler/MarkHandler.kt        |  96 ++++++------
 .../map/handler/MeasureLayerHandler.kt        |  28 +++-
 .../library/map/layers/OmdbTaskLinkLayer.kt   |   3 +-
 14 files changed, 298 insertions(+), 95 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
index b84b5b45..e72e6c4f 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
@@ -223,9 +223,18 @@ class MainActivity : BaseActivity() {
             }
         }
 
+        viewModel.liveDataTaskLink.observe(this) {
+            val bundle = Bundle()
+            bundle.putString("TaskLinkId", it)
+            findNavController(R.id.main_activity_right_fragment).navigate(
+                R.id.TaskLinkFragment,
+                bundle
+            )
+        }
+
         //捕捉列表变化回调
         viewModel.liveDataNILocationList.observe(this) {
-             Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show()
+            Toast.makeText(this, "轨迹被点击了", Toast.LENGTH_LONG).show()
         }
 
         //右上角菜单是否被点击
@@ -545,7 +554,12 @@ class MainActivity : BaseActivity() {
             mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65)
         }
         mapController.mMapView.vtmMap.animator()
-            .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude))
+            .animateTo(
+                GeoPoint(
+                    mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,
+                    mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude
+                )
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.M)
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
index d650fdf5..8a8f3f70 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
@@ -23,13 +23,10 @@ import androidx.lifecycle.viewModelScope
 import androidx.navigation.findNavController
 import com.blankj.utilcode.util.ToastUtils
 import com.navinfo.collect.library.data.dao.impl.TraceDataBase
-import com.navinfo.collect.library.data.entity.NiLocation
-import com.navinfo.collect.library.data.entity.NoteBean
-import com.navinfo.collect.library.data.entity.QsRecordBean
-import com.navinfo.collect.library.data.entity.RenderEntity
-import com.navinfo.collect.library.data.entity.TaskBean
+import com.navinfo.collect.library.data.entity.*
 import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener
+import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.GeometryToolsKt
 import com.navinfo.omqs.Constant
@@ -91,6 +88,9 @@ class MainViewModel @Inject constructor(
     //道路名
     val liveDataRoadName = MutableLiveData<RenderEntity?>()
 
+    //捕捉到新增的link
+    val liveDataTaskLink = MutableLiveData<String>()
+
     /**
      * 当前选中的要展示的详细信息的要素
      */
@@ -150,6 +150,12 @@ class MainViewModel @Inject constructor(
                 liveDataNILocationList.value = list
             }
         })
+        mapController.lineHandler.setOnTaskLinkItemClickListener(object :
+            OnTaskLinkItemClickListener {
+            override fun onTaskLink(taskLinkId: String) {
+                liveDataTaskLink.value = taskLinkId
+            }
+        })
 
         initLocation()
 
@@ -159,7 +165,9 @@ class MainViewModel @Inject constructor(
 //                testPoint = it
                 //线选择状态
                 if (bSelectRoad) {
-                    captureLink(it)
+                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                        captureLink(it)
+                    }
                 } else {
                     captureItem(it)
                 }
@@ -169,7 +177,7 @@ class MainViewModel @Inject constructor(
             initTaskData()
             initQsRecordData()
             initNoteData()
-            initNILocationData()
+//            initNILocationData()
         }
     }
 
@@ -227,8 +235,10 @@ class MainViewModel @Inject constructor(
             mapController.mMapView.context,
             Constant.USER_DATA_PATH
         ).niLocationDao.findToTaskIdAll(id.toString())
-        list!!.forEach {
-            mapController.markerHandle.addNiLocationMarkerItem(it)
+        if (list != null) {
+            for (location in list) {
+                mapController.markerHandle.addNiLocationMarkerItem(location)
+            }
         }
     }
 
@@ -238,6 +248,17 @@ class MainViewModel @Inject constructor(
     private fun initLocation() {
         //用于定位点存储到数据库
         viewModelScope.launch(Dispatchers.Default) {
+            //用于定位点捕捉道路
+            mapController.locationLayerHandler.niLocationFlow.collectLatest { location ->
+                if (!isSelectRoad()) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                    captureLink(
+                        GeoPoint(
+                            location.latitude,
+                            location.longitude
+                        )
+                    )
+                }
+            }
             mapController.locationLayerHandler.niLocationFlow.collect { location ->
                 val geometry = GeometryTools.createGeometry(
                     GeoPoint(
@@ -285,17 +306,6 @@ class MainViewModel @Inject constructor(
                 //mapController.mMapView.vtmMap.updateMap(true)
             }
         }
-        //用于定位点捕捉道路
-        viewModelScope.launch(Dispatchers.Default) {
-            mapController.locationLayerHandler.niLocationFlow.collectLatest { location ->
-                if (!isSelectRoad()) captureLink(
-                    GeoPoint(
-                        location.latitude,
-                        location.longitude
-                    )
-                )
-            }
-        }
 
         //显示轨迹图层
         mapController.layerManagerHandler.showNiLocationLayer()
@@ -312,6 +322,7 @@ class MainViewModel @Inject constructor(
     /**
      * 捕获道路和面板
      */
+    @RequiresApi(Build.VERSION_CODES.N)
     private suspend fun captureLink(point: GeoPoint) {
 
         val linkList = realmOperateHelper.queryLink(
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
index 0f3fc0ae..468d56d6 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
@@ -39,6 +39,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel
 import io.realm.Realm
 import io.realm.RealmList
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.launch
 import org.oscim.core.GeoPoint
 import java.io.File
@@ -109,7 +110,7 @@ class EvaluationResultViewModel @Inject constructor(
     init {
         liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString())
         viewModelScope.launch {
-            mapController.onMapClickFlow.collect {
+            mapController.onMapClickFlow.collectLatest {
                 liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText()
                 mapController.markerHandle.addMarker(it, markerTitle)
                 viewModelScope.launch {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt
index 571a1d23..579382bb 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt
@@ -36,6 +36,13 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 
+        arguments?.let {
+            val id = it.getString("TaskLinkId")
+            if (id != null && id.isNotEmpty()){
+                viewModel.initData(id)
+            }
+        }
+
         binding.taskLinkAddPoint.setOnClickListener(this)
         binding.taskLinkKind.setOnClickListener(this)
         binding.taskLinkFunctionalLevel.setOnClickListener(this)
@@ -44,6 +51,8 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
         binding.taskLinkBarSave.setOnClickListener(this)
         binding.taskLinkBack.setOnClickListener(this)
         binding.taskLinkClear.setOnClickListener(this)
+        binding.taskLinkBarDelete.setOnClickListener(this)
+
         /**
          * 数据操作结束
          */
@@ -150,6 +159,9 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener {
             binding.taskLinkClear -> {
                 viewModel.clearLink()
             }
+            binding.taskLinkBarDelete ->{
+                viewModel.deleteData(requireContext())
+            }
         }
     }
 
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt
index 87b32795..6945c9a9 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt
@@ -1,5 +1,7 @@
 package com.navinfo.omqs.ui.fragment.tasklink
 
+import android.app.Dialog
+import android.content.Context
 import android.content.SharedPreferences
 import android.os.Build
 import androidx.annotation.RequiresApi
@@ -8,15 +10,18 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.navinfo.collect.library.data.entity.HadLinkDvoBean
 import com.navinfo.collect.library.data.entity.LinkInfoBean
+import com.navinfo.collect.library.data.entity.QsRecordBean
 import com.navinfo.collect.library.data.entity.TaskBean
 import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.omqs.Constant
+import com.navinfo.omqs.ui.dialog.FirstDialog
 import dagger.hilt.android.lifecycle.HiltViewModel
 import io.realm.Realm
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
 import org.bson.codecs.UuidCodec
 import org.bson.internal.UuidHelper
 import org.oscim.core.GeoPoint
@@ -102,6 +107,11 @@ class TaskLinkViewModel @Inject constructor(
      */
     val liveDataTaskBean = MutableLiveData<TaskBean?>()
 
+    /**
+     * 当前正在编辑的线
+     */
+    private var hadLinkDvoBean: HadLinkDvoBean? = null
+
     /**
      * 当前正在选择哪个数据 1:种别 2:功能等级 3:数据等级
      */
@@ -184,26 +194,50 @@ class TaskLinkViewModel @Inject constructor(
                 liveDataToastMessage.postValue("请选择数据等级!")
                 return@launch
             }
-            val linkBean = HadLinkDvoBean(
-//                taskId = liveDataTaskBean.value!!.id,
-                linkPid = UUID.randomUUID().toString(),
-                linkStatus = 3,
-                length = mapController.measureLayerHandler.lineLengthLiveData.value!!,
-                geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points),
-                linkInfo = LinkInfoBean(
+            val task: TaskBean = liveDataTaskBean.value!!
+            if (hadLinkDvoBean != null) {
+                hadLinkDvoBean!!.taskId = liveDataTaskBean.value!!.id
+                hadLinkDvoBean!!.length =
+                    mapController.measureLayerHandler.lineLengthLiveData.value!!
+                hadLinkDvoBean!!.geometry =
+                    GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points)
+                hadLinkDvoBean!!.linkInfo = LinkInfoBean(
                     kind = liveDataSelectKind.value!!.type,
                     functionLevel = liveDataSelectFunctionLevel.value!!.type,
                     dataLevel = liveDataSelectDataLevel.value!!.type,
                 )
-            )
-            val task: TaskBean = liveDataTaskBean.value!!
-            task.hadLinkDvoList.add(linkBean)
+                for (l in task.hadLinkDvoList) {
+                    if (l.linkPid == hadLinkDvoBean!!.linkPid) {
+                        task.hadLinkDvoList.remove(l)
+                        task.hadLinkDvoList.add(hadLinkDvoBean)
+                        break
+                    }
+                }
+            } else {
+                hadLinkDvoBean = HadLinkDvoBean(
+                    taskId = liveDataTaskBean.value!!.id,
+                    linkPid = UUID.randomUUID().toString(),
+                    linkStatus = 3,
+                    length = mapController.measureLayerHandler.lineLengthLiveData.value!!,
+                    geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points),
+                    linkInfo = LinkInfoBean(
+                        kind = liveDataSelectKind.value!!.type,
+                        functionLevel = liveDataSelectFunctionLevel.value!!.type,
+                        dataLevel = liveDataSelectDataLevel.value!!.type,
+                    )
+                )
+                task.hadLinkDvoList.add(hadLinkDvoBean)
+            }
+
+
             val realm = Realm.getDefaultInstance()
             realm.executeTransaction {
+                it.copyToRealmOrUpdate(hadLinkDvoBean)
                 it.copyToRealmOrUpdate(task)
             }
-            mapController.lineHandler.addTaskLink(linkBean)
-            sharedPreferences.edit().putString(Constant.SHARED_SYNC_TASK_LINK_ID, linkBean.linkPid)
+            mapController.lineHandler.addTaskLink(hadLinkDvoBean!!)
+            sharedPreferences.edit()
+                .putString(Constant.SHARED_SYNC_TASK_LINK_ID, hadLinkDvoBean!!.linkPid)
                 .apply()
             liveDataFinish.postValue(true)
         }
@@ -231,4 +265,87 @@ class TaskLinkViewModel @Inject constructor(
     fun clearLink() {
         mapController.measureLayerHandler.clear()
     }
+
+    /**
+     * 初始化数据
+     */
+    fun initData(id: String) {
+        viewModelScope.launch(Dispatchers.IO) {
+            val realm = Realm.getDefaultInstance()
+            val objects =
+                realm.where(HadLinkDvoBean::class.java).equalTo("linkPid", id)
+                    .findFirst()
+            objects?.linkInfo?.let {
+                for (kind in kindList) {
+                    if (kind.type == it.kind) {
+                        liveDataSelectKind.postValue(kind)
+                        break
+                    }
+                }
+                for (function in functionLevelList) {
+                    if (function.type == it.functionLevel) {
+                        liveDataSelectFunctionLevel.postValue(function)
+                        break
+                    }
+                }
+                for (data in dataLevelList) {
+                    if (data.type == it.dataLevel) {
+                        liveDataSelectDataLevel.postValue(data)
+                        break
+                    }
+                }
+            }
+            val task =
+                realm.where(TaskBean::class.java).equalTo("id", objects?.taskId)
+                    .findFirst()
+
+            if (task != null) {
+                liveDataTaskBean.postValue(realm.copyFromRealm(task))
+            }
+            hadLinkDvoBean = realm.copyFromRealm(objects)
+            withContext(Dispatchers.Main) {
+                mapController.measureLayerHandler.initPathLine(hadLinkDvoBean?.geometry!!)
+            }
+        }
+    }
+
+    /**
+     * 删除数据
+     */
+    fun deleteData(context: Context) {
+        if(hadLinkDvoBean == null){
+            liveDataFinish.value = true
+            return
+        }
+        val mDialog = FirstDialog(context)
+        mDialog.setTitle("提示?")
+        mDialog.setMessage("是否删除Mark,请确认!")
+        mDialog.setPositiveButton("确定"
+        ) { _, _ ->
+            mDialog.dismiss()
+            viewModelScope.launch(Dispatchers.IO) {
+                val realm = Realm.getDefaultInstance()
+                realm.executeTransaction {
+                    val task = it.where(TaskBean::class.java).equalTo("id",hadLinkDvoBean!!.taskId).findFirst()
+                    if(task != null) {
+                        for (h in task.hadLinkDvoList) {
+                            if(h.linkPid == hadLinkDvoBean!!.linkPid)
+                                task.hadLinkDvoList.remove(h)
+                            break
+                        }
+                        realm.copyToRealmOrUpdate(task)
+                    }
+
+//                    val objects = it.where(HadLinkDvoBean::class.java)
+//                        .equalTo("linkPid", hadLinkDvoBean!!.linkPid).findFirst()
+//                    objects?.deleteFromRealm()
+                }
+                mapController.lineHandler.removeTaskLink(hadLinkDvoBean!!.linkPid)
+                mapController.mMapView.vtmMap.updateMap(true)
+                liveDataFinish.postValue(true)
+            }
+        }
+        mDialog.setNegativeButton("取消", null)
+        mDialog.show()
+    }
 }
\ No newline at end of file
diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml
index 06448ea1..0b7a0264 100644
--- a/collect-library/src/main/assets/editormarker.xml
+++ b/collect-library/src/main/assets/editormarker.xml
@@ -1690,7 +1690,7 @@
             <m k="speedFlag" v="1">
                 <caption fill="#000000" k="maxSpeed" priority="0" size="12" stroke="#ffffff"
                     stroke-width="1.0"></caption>
-                <symbol src="assets:omdb/icon_4004_1.png" symbol-height="46"
+                <symbol src="assets:omdb/icon_4004_0.svg" symbol-height="46"
                     symbol-width="46"></symbol>
                 <!--                <caption k="minSpeed" dy="-28" fill="#000000" priority="0" size="14" stroke="#ffffff"-->
                 <!--                    stroke-width="1.0"></caption>-->
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
index 3bfef3e0..8b486d45 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
@@ -1,12 +1,13 @@
 package com.navinfo.collect.library.data.entity
 
 import io.realm.RealmObject
+import io.realm.annotations.PrimaryKey
 
 open class HadLinkDvoBean @JvmOverloads constructor(
-//    /**
-//     * 任务id,方便捕捉查询
-//     */
-//    var taskId: Int = 0,
+    /**
+     * 任务id,方便捕捉查询
+     */
+    var taskId: Int = 0,
     /**
      * 图幅号
      */
@@ -14,6 +15,7 @@ open class HadLinkDvoBean @JvmOverloads constructor(
     /**
      * linkPid
      */
+    @PrimaryKey
     var linkPid: String = "",
     /**
      * (几何)加偏后
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt
index d449d4a2..89004106 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt
@@ -1,6 +1,5 @@
 package com.navinfo.collect.library.map
 
-import android.os.Build
 import androidx.appcompat.app.AppCompatActivity
 import androidx.lifecycle.lifecycleScope
 import com.navinfo.collect.library.map.handler.*
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt
index 6e3240a0..1efce364 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt
@@ -1,6 +1,6 @@
 package com.navinfo.collect.library.map.handler
 
-import android.content.Context
+import android.util.Log
 import androidx.appcompat.app.AppCompatActivity
 import com.navinfo.collect.library.map.NIMapView
 import org.oscim.layers.Layer
@@ -10,6 +10,7 @@ abstract class BaseHandler(context: AppCompatActivity, mapView: NIMapView) {
     protected val mMapView: NIMapView = mapView
 
     fun addLayer(layer: Layer, groupType: NIMapView.LAYER_GROUPS) {
+        Log.e("jingo", "增加了图层 ${layer.toString()}")
         mMapView.vtmMap.layers().add(
             layer,
             groupType.groupIndex
@@ -17,11 +18,11 @@ abstract class BaseHandler(context: AppCompatActivity, mapView: NIMapView) {
     }
 
     fun removeLayer(layer: Layer) {
+        Log.e("jingo", "移除了图层 ${layer.toString()}")
         mMapView.vtmMap.layers().remove(layer)
     }
 
 
-
 //    fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) {
 //        mMapView.setOnMapClickListener(listener)
 //    }
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
index 0cdee3b3..c52bbd7e 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
@@ -36,6 +36,7 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
         onTaskLinkItemClickListener = listener
     }
 
+
     /**
      * 路口高亮
      */
@@ -183,6 +184,12 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
      * 增加一条任务高亮线
      */
     fun addTaskLink(linkBean: HadLinkDvoBean) {
+        for (marker in omdbTaskMarkerLayer.itemList) {
+            if ((marker as MarkerItem).title == linkBean.linkPid) {
+                omdbTaskMarkerLayer.removeItem(marker)
+                break
+            }
+        }
         if (linkBean.linkStatus == 3) {
             val pointList = GeometryTools.getGeoPoints(linkBean.geometry)
             val geoPoint = if (pointList.size < 3) {
@@ -197,7 +204,10 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
             )
             omdbTaskMarkerLayer.addItem(marker)
         }
+        omdbTaskLinkLayer.removeLine(linkBean.linkPid)
         omdbTaskLinkLayer.addLine(linkBean)
+        omdbTaskLinkLayer.update()
+        mMapView.vtmMap.updateMap(true)
     }
 
     /**
@@ -211,6 +221,8 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
             }
         }
         omdbTaskLinkLayer.removeLine(linkBeanId)
+        omdbTaskLinkLayer.update()
+        mMapView.vtmMap.updateMap(true)
     }
 }
 
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt
index 851d095c..0743a60d 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt
@@ -12,6 +12,7 @@ import com.baidu.location.LocationClientOption.LocationMode
 import com.navinfo.collect.library.data.entity.NiLocation
 import com.navinfo.collect.library.map.NIMapView
 import com.navinfo.collect.library.utils.DateUtils
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.flow.MutableSharedFlow
 import kotlinx.coroutines.launch
 import org.oscim.core.GeoPoint
@@ -29,7 +30,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) :
 //
 //    }
 
-    val niLocationFlow = MutableSharedFlow<NiLocation>(5)
+    val niLocationFlow = MutableSharedFlow<NiLocation>(3)
 
     init {
         ///添加定位图层到地图,[NIMapView.LAYER_GROUPS.NAVIGATION] 是最上层layer组
@@ -72,10 +73,10 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) :
 //                )
 
 //                if (niLocationListener != null) {
-                    getCurrentNiLocation()?.let { it1 ->
-                        mContext.lifecycleScope.launch {
-                            niLocationFlow.emit(it1)
-                        }
+                getCurrentNiLocation()?.let { it1 ->
+                    mContext.lifecycleScope.launch(Dispatchers.Default) {
+                        niLocationFlow.emit(it1)
+                    }
 
 //                    }// niLocationListener.call(it1) }
                 }
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
index 26c97517..13030488 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
@@ -5,6 +5,7 @@ import android.content.SharedPreferences
 import android.graphics.BitmapFactory
 import android.graphics.Canvas
 import android.graphics.Color
+import android.util.Log
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.content.res.ResourcesCompat
 import androidx.lifecycle.lifecycleScope
@@ -536,58 +537,67 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
      * 添加质检数据marker
      */
     public suspend fun addNiLocationMarkerItem(niLocation: NiLocation) {
+        synchronized(this) {
+            Log.e("jingo", "插入定位点0 ")
 
-        var itemizedLayer: ItemizedLayer? = null
+            var itemizedLayer: ItemizedLayer? = null
 
-        val direction: Double = niLocation.direction
+            val direction: Double = niLocation.direction
 
-        val geoMarkerItem: MarkerItem = ClusterMarkerItem(
-            niLocation,
-            niLocation.id,
-            niLocation.time,
-            GeoPoint(niLocation.latitude, niLocation.longitude)
-        )
+            val geoMarkerItem: MarkerItem = ClusterMarkerItem(
+                niLocation,
+                niLocation.id,
+                niLocation.time,
+                GeoPoint(niLocation.latitude, niLocation.longitude)
+            )
 
-        //角度
-        when (niLocation.media) {
-            0 -> {
-                //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
-                //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
-                if (direction != 0.0) {
-                    val symbolGpsTemp =
-                        MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false)
-                    geoMarkerItem.marker = symbolGpsTemp
-                    geoMarkerItem.setRotation(direction.toFloat())
-                } else {
-                    val symbolGpsTemp =
-                        MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false)
-                    geoMarkerItem.marker = symbolGpsTemp
+            //角度
+            when (niLocation.media) {
+                0 -> {
+                    //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
+                    //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
+                    if (direction != 0.0) {
+                        val symbolGpsTemp =
+                            MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false)
+                        geoMarkerItem.marker = symbolGpsTemp
+                        geoMarkerItem.setRotation(direction.toFloat())
+                    } else {
+                        val symbolGpsTemp =
+                            MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false)
+                        geoMarkerItem.marker = symbolGpsTemp
+                    }
+                    Log.e(
+                        "jingo",
+                        "插入定位点1 ${geoMarkerItem.geoPoint.longitude} ${geoMarkerItem.geoPoint.latitude}"
+                    )
+                    niLocationItemizedLayer.addItem(geoMarkerItem)
+                    itemizedLayer = niLocationItemizedLayer
                 }
-                niLocationItemizedLayer.addItem(geoMarkerItem)
-                itemizedLayer = niLocationItemizedLayer
-            }
 
-            1 -> {
-                //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
-                //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
-                if (direction != 0.0) {
-                    val symbolLidarTemp =
-                        MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false)
-                    geoMarkerItem.marker = symbolLidarTemp
-                    geoMarkerItem.setRotation(direction.toFloat())
-                } else {
-                    val symbolGpsTemp =
-                        MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false)
-                    geoMarkerItem.marker = symbolGpsTemp
+                1 -> {
+                    //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
+                    //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可
+                    if (direction != 0.0) {
+                        val symbolLidarTemp =
+                            MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false)
+                        geoMarkerItem.marker = symbolLidarTemp
+                        geoMarkerItem.setRotation(direction.toFloat())
+                    } else {
+                        val symbolGpsTemp =
+                            MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false)
+                        geoMarkerItem.marker = symbolGpsTemp
+                    }
+                    Log.e(
+                        "jingo",
+                        "插入定位点2 ${geoMarkerItem.geoPoint.longitude} ${geoMarkerItem.geoPoint.latitude}"
+                    )
+                    niLocationItemizedLayer.addItem(geoMarkerItem)
+                    itemizedLayer = niLocationItemizedLayer
                 }
-                niLocationItemizedLayer.addItem(geoMarkerItem)
-                itemizedLayer = niLocationItemizedLayer
-            }
 
+            }
+            itemizedLayer?.update()
         }
-
-        itemizedLayer!!.update()
-
     }
 
 
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt
index 237afa13..289e58b5 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt
@@ -3,11 +3,9 @@ package com.navinfo.collect.library.map.handler
 import android.graphics.BitmapFactory
 import android.graphics.Canvas
 import android.graphics.Color
-import android.os.Build
 import android.text.TextPaint
 import android.util.Log
 import android.widget.Toast
-import androidx.annotation.RequiresApi
 import androidx.appcompat.app.AppCompatActivity
 import androidx.lifecycle.MutableLiveData
 import com.navinfo.collect.library.R
@@ -453,6 +451,32 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) :
         }
     }
 
+    /**
+     * 初始化线数据, 用来二次编辑
+     */
+    fun initPathLine(geometry: String) {
+        bDrawLine = true
+        mPathLayer.isEnabled = true
+        mPathLayerTemp.isEnabled = true
+        val pointList = GeometryTools.getGeoPoints(geometry)
+        mPathLayer.setPoints(pointList)
+        for (point in pointList) {
+            val markerItem = MarkerItem(createUUID(), "", "", point)
+            markerLayer.addItem(markerItem)
+            mPathMakers.add(markerItem)
+        }
+        if (mPathLayer.points.size > 1) {
+            val distance: Double = GeometryTools.getDistance(mPathLayer.points)
+            val bg = BigDecimal(distance)
+            val f1 = bg.setScale(3, BigDecimal.ROUND_HALF_UP).toDouble()
+            lineLengthLiveData.value = f1
+            tempLineDistanceLiveData.value = "${f1}米"
+        } else {
+            lineLengthLiveData.value = 0.000
+        }
+        mMapView.updateMap(true)
+    }
+
     private val itemGestureListener: OnItemGestureListener<MarkerInterface> =
         object : OnItemGestureListener<MarkerInterface> {
             override fun onItemSingleTapUp(index: Int, item: MarkerInterface): Boolean {
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt
index 0b82d09e..c44d2405 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt
@@ -59,12 +59,11 @@ class OmdbTaskLinkLayer(map: Map, private var style: Style) : VectorLayer(map) {
         update()
     }
 
-    fun removeLine(linkPid: String): Boolean {
+    fun removeLine(linkPid: String) {
         if (lineMap.containsKey(linkPid)) {
             super.remove(lineMap[linkPid])
             lineMap.remove(linkPid)
         }
-        return false
     }
 
     fun removeLine(geometry: Geometry) {

From 4ef07f470db83e4cf1a5861ad3cded030533ff32 Mon Sep 17 00:00:00 2001
From: squallzhjch <zhangjingchao@navinfo.com>
Date: Tue, 18 Jul 2023 15:13:01 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=82=B9=E5=87=BB?=
 =?UTF-8?q?=E8=81=9A=E5=90=88marker=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../omqs/ui/activity/map/MainActivity.kt      |  33 +--
 .../omqs/ui/activity/map/MainViewModel.kt     |  44 ++--
 .../library/map/handler/MarkHandler.kt        | 229 +++++++-----------
 vtm                                           |   2 +-
 4 files changed, 130 insertions(+), 178 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
index 01d35864..db09aa62 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt
@@ -176,7 +176,7 @@ class MainActivity : BaseActivity() {
         //给xml传递viewModel对象
         binding.viewModel = viewModel
 
-       binding.mainActivityVoice.setOnTouchListener { v, event ->
+        binding.mainActivityVoice.setOnTouchListener { v, event ->
             when (event?.action) {
                 MotionEvent.ACTION_DOWN -> {
                     voiceOnTouchStart()//Do Something
@@ -206,7 +206,7 @@ class MainActivity : BaseActivity() {
             }
         }
         //捕捉列表变化回调
-        viewModel.liveDataNoteIdList.observe(this) {
+        viewModel.liveDataNoteId.observe(this) {
             //跳转到质检数据页面
             //获取右侧fragment容器
             val naviController = findNavController(R.id.main_activity_right_fragment)
@@ -214,11 +214,9 @@ class MainActivity : BaseActivity() {
             naviController.currentDestination?.let { navDestination ->
                 when (navDestination.id) {
                     R.id.RightEmptyFragment -> {
-                        if (it.size == 1) {
-                            val bundle = Bundle()
-                            bundle.putString("NoteId", it[0])
-                            naviController.navigate(R.id.NoteFragment, bundle)
-                        }
+                        val bundle = Bundle()
+                        bundle.putString("NoteId", it)
+                        naviController.navigate(R.id.NoteFragment, bundle)
                     }
                 }
             }
@@ -235,8 +233,8 @@ class MainActivity : BaseActivity() {
 
         //捕捉列表变化回调
         viewModel.liveDataNILocationList.observe(this) {
-            if(viewModel.isSelectTrace()){
-                Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show()
+            if (viewModel.isSelectTrace()) {
+                Toast.makeText(this, "轨迹被点击了", Toast.LENGTH_LONG).show()
             }
         }
 
@@ -544,8 +542,8 @@ class MainActivity : BaseActivity() {
     @RequiresApi(Build.VERSION_CODES.N)
     fun tracePointsOnclick() {
         viewModel.setSelectTrace(!viewModel.isSelectTrace())
-        if(viewModel.isSelectTrace()){
-            Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show()
+        if (viewModel.isSelectTrace()) {
+            Toast.makeText(this, "请选择轨迹点!", Toast.LENGTH_LONG).show()
         }
         binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace()
     }
@@ -628,7 +626,12 @@ class MainActivity : BaseActivity() {
             mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65)
         }
         mapController.mMapView.vtmMap.animator()
-            .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude))
+            .animateTo(
+                GeoPoint(
+                    mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,
+                    mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude
+                )
+            )
     }
 
     @RequiresApi(Build.VERSION_CODES.N)
@@ -689,14 +692,14 @@ class MainActivity : BaseActivity() {
      */
     fun showIndoorDataLayout() {
         binding.mainActivityMenuIndoorGroup.visibility = View.VISIBLE
-        if(Constant.INDOOR_IP.isNotEmpty()){
+        if (Constant.INDOOR_IP.isNotEmpty()) {
             setIndoorGroupEnable(true)
-        }else{
+        } else {
             setIndoorGroupEnable(false)
         }
     }
 
-    private fun setIndoorGroupEnable(enable: Boolean){
+    private fun setIndoorGroupEnable(enable: Boolean) {
         binding.mainActivitySnapshotFinish.isEnabled = enable
         binding.mainActivityTraceSnapshotPoints.isEnabled = enable
         binding.mainActivitySnapshotMediaFlag.isEnabled = enable
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
index 877bc561..a8402389 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt
@@ -75,7 +75,7 @@ class MainViewModel @Inject constructor(
     val liveDataQsRecordIdList = MutableLiveData<List<String>>()
 
     //地图点击捕捉到的标签ID列表
-    val liveDataNoteIdList = MutableLiveData<List<String>>()
+    val liveDataNoteId = MutableLiveData<String>()
 
     //地图点击捕捉到的轨迹列表
     val liveDataNILocationList = MutableLiveData<NiLocation>()
@@ -159,8 +159,8 @@ class MainViewModel @Inject constructor(
                 liveDataQsRecordIdList.value = list
             }
 
-            override fun onNoteList(list: MutableList<String>) {
-                liveDataNoteIdList.value = list
+            override fun onNote(id: String) {
+                liveDataNoteId.value = id
             }
 
             override fun onNiLocation(item: NiLocation) {
@@ -182,9 +182,7 @@ class MainViewModel @Inject constructor(
 //                testPoint = it
                 //线选择状态
                 if (bSelectRoad) {
-                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-                        captureLink(it)
-                    }
+                    captureLink(it)
                 } else {
                     captureItem(it)
                 }
@@ -249,8 +247,7 @@ class MainViewModel @Inject constructor(
         //加载轨迹数据
         val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1)
         val list: List<NiLocation>? = TraceDataBase.getDatabase(
-            mapController.mMapView.context,
-            Constant.USER_DATA_PATH
+            mapController.mMapView.context, Constant.USER_DATA_PATH
         ).niLocationDao.findToTaskIdAll(id.toString())
         if (list != null) {
             for (location in list) {
@@ -268,11 +265,13 @@ class MainViewModel @Inject constructor(
         viewModelScope.launch(Dispatchers.Default) {
             //用于定位点捕捉道路
             mapController.locationLayerHandler.niLocationFlow.collectLatest { location ->
-                if (!isSelectRoad()&&!GeometryTools.isCheckError(location.longitude,location.latitude)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                if (!isSelectRoad() && !GeometryTools.isCheckError(
+                        location.longitude, location.latitude
+                    )
+                ) {
                     captureLink(
                         GeoPoint(
-                            location.latitude,
-                            location.longitude
+                            location.latitude, location.longitude
                         )
                     )
                 }
@@ -280,7 +279,7 @@ class MainViewModel @Inject constructor(
             mapController.locationLayerHandler.niLocationFlow.collect { location ->
 
                 //过滤掉无效点
-                if(!GeometryTools.isCheckError(location.longitude,location.latitude)){
+                if (!GeometryTools.isCheckError(location.longitude, location.latitude)) {
                     val geometry = GeometryTools.createGeometry(
                         GeoPoint(
                             location.latitude, location.longitude
@@ -309,8 +308,11 @@ class MainViewModel @Inject constructor(
                     //增加间距判断
                     if (lastNiLocaion != null) {
                         val disance = GeometryTools.getDistance(
-                            location.latitude, location.longitude,
-                            lastNiLocaion!!.latitude, lastNiLocaion!!.longitude)
+                            location.latitude,
+                            location.longitude,
+                            lastNiLocaion!!.latitude,
+                            lastNiLocaion!!.longitude
+                        )
                         //相距差距大于2.5米以上进行存储
                         if (disance > 2.5) {
                             traceDataBase.niLocationDao.insert(location)
@@ -345,11 +347,11 @@ class MainViewModel @Inject constructor(
      */
     @RequiresApi(Build.VERSION_CODES.N)
     private suspend fun captureLink(point: GeoPoint) {
-        if(captureLinkState){
+        if (captureLinkState) {
             return
         }
 
-        try{
+        try {
             captureLinkState = true
 
             val linkList = realmOperateHelper.queryLink(
@@ -447,9 +449,9 @@ class MainViewModel @Inject constructor(
                 liveDataRoadName.postValue(null)
             }
 
-        }catch (e:Exception){
+        } catch (e: Exception) {
 
-        }finally {
+        } finally {
             captureLinkState = false
         }
 
@@ -501,12 +503,10 @@ class MainViewModel @Inject constructor(
             try {
                 if (!mCameraDialog!!.getmShareUtil().connectstate) {
                     mCameraDialog!!.updateCameraResources(
-                        1,
-                        mCameraDialog!!.getmDeviceNum()
+                        1, mCameraDialog!!.getmDeviceNum()
                     )
                 }
-                TakePhotoManager.getInstance()
-                    .getCameraVedioClent(mCameraDialog!!.getmDeviceNum())
+                TakePhotoManager.getInstance().getCameraVedioClent(mCameraDialog!!.getmDeviceNum())
                     .StopSearch()
             } catch (e: Exception) {
             }
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
index fd6c367a..4b1a65e0 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt
@@ -1,16 +1,13 @@
 package com.navinfo.collect.library.map.handler
 
 import android.content.Context
-import android.content.SharedPreferences
 import android.graphics.BitmapFactory
 import android.graphics.Canvas
 import android.graphics.Color
 import android.util.Log
 import androidx.appcompat.app.AppCompatActivity
 import androidx.core.content.res.ResourcesCompat
-import androidx.lifecycle.lifecycleScope
 import com.navinfo.collect.library.R
-import com.navinfo.collect.library.data.dao.impl.TraceDataBase
 import com.navinfo.collect.library.data.entity.NiLocation
 import com.navinfo.collect.library.data.entity.NoteBean
 import com.navinfo.collect.library.data.entity.QsRecordBean
@@ -21,11 +18,6 @@ import com.navinfo.collect.library.map.layers.MyItemizedLayer
 import com.navinfo.collect.library.map.layers.NoteLineLayer
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.StringUtil
-import io.realm.Realm
-import io.realm.kotlin.where
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 import org.locationtech.jts.geom.Geometry
 import org.locationtech.jts.geom.LineString
 import org.locationtech.jts.geom.Polygon
@@ -34,19 +26,11 @@ import org.oscim.backend.CanvasAdapter
 import org.oscim.backend.canvas.Bitmap
 import org.oscim.backend.canvas.Paint
 import org.oscim.core.GeoPoint
-import org.oscim.layers.marker.ItemizedLayer
+import org.oscim.layers.marker.*
 import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener
-import org.oscim.layers.marker.MarkerInterface
-import org.oscim.layers.marker.MarkerItem
-import org.oscim.layers.marker.MarkerRendererFactory
-import org.oscim.layers.marker.MarkerSymbol
-import org.oscim.layers.vector.geometries.Drawable
-import org.oscim.layers.vector.geometries.LineDrawable
-import org.oscim.layers.vector.geometries.PointDrawable
-import org.oscim.layers.vector.geometries.PolygonDrawable
-import org.oscim.layers.vector.geometries.Style
+import org.oscim.layers.vector.geometries.*
 import org.oscim.map.Map
-import java.util.Locale
+import java.util.*
 
 /**
  * marker 操作
@@ -74,9 +58,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
     /**
      *  画布
      */
-    private val canvas: org.oscim.backend.canvas.Canvas by lazy {
-        CanvasAdapter.newCanvas()
-    }
+    private val canvas: org.oscim.backend.canvas.Canvas = CanvasAdapter.newCanvas()
 
     /**
      * 默认marker图层
@@ -88,36 +70,72 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
 
         val markerSymbol = MarkerSymbol(
             mDefaultBitmap,
-            MarkerSymbol.HotspotPlace.BOTTOM_CENTER
+            MarkerSymbol.HotspotPlace.CENTER
         )
         val layer = ItemizedLayer(
             mapView.vtmMap,
-            ArrayList(),
             markerSymbol,
-            object : OnItemGestureListener<MarkerInterface> {
-                override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean {
-                    return false
-                }
-
-                override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean {
-                    return false
-                }
-
-            }
         )
         addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER)
         layer
     }
 
-    private var niLocationBitmap: Bitmap? = null
-    private var niLocationBitmap1: Bitmap? = null
-    private var niLocationBitmap2: Bitmap? = null
-    private var niLocationBitmap3: Bitmap? = null
+    private val niLocationBitmap: Bitmap by lazy {
+        AndroidBitmap(
+            BitmapFactory.decodeResource(
+                context.resources,
+                R.mipmap.icon_gps
+            )
+        )
+    }
+    private val niLocationBitmap1: Bitmap by lazy {
+        AndroidBitmap(
+            BitmapFactory.decodeResource(
+                context.resources,
+                R.mipmap.icon_gps_1
+            )
+        )
+    }
+    private val niLocationBitmap2: Bitmap by lazy {
+        AndroidBitmap(
+            BitmapFactory.decodeResource(
+                context.resources,
+                R.mipmap.icon_nilocation
+            )
+        )
+    }
+    private val niLocationBitmap3: Bitmap by lazy {
+        AndroidBitmap(
+            BitmapFactory.decodeResource(
+                context.resources,
+                R.mipmap.icon_nilocation_1
+            )
+        )
+    }
 
     /**
      * 评测数据marker 图层
      */
     private val qsRecordItemizedLayer: MyItemizedLayer by lazy {
+        val bitmapPoi: Bitmap = AndroidBitmap(
+            BitmapFactory.decodeResource(
+                mContext.resources,
+                R.mipmap.map_icon_blue2
+            )
+        )
+        val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER)
+        val markerRendererFactory = MarkerRendererFactory { markerLayer ->
+            object : ClusterMarkerRenderer(
+                mContext,
+                markerLayer,
+                symbol,
+                ClusterStyle(
+                    org.oscim.backend.canvas.Color.WHITE,
+                    org.oscim.backend.canvas.Color.BLUE
+                )
+            ) {
+            }
+        }
         val layer = MyItemizedLayer(
             mMapView.vtmMap,
             mutableListOf(),
@@ -160,37 +178,24 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
      */
     private val niLocationItemizedLayer: ItemizedLayer by lazy {
 
-        niLocationBitmap =
-            AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps))
-        niLocationBitmap1 =
-            AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps_1))
-        niLocationBitmap2 =
-            AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_nilocation))
-        niLocationBitmap3 = AndroidBitmap(
-            BitmapFactory.decodeResource(
-                context.resources,
-                R.mipmap.icon_nilocation_1
-            )
-        )
-
+        val symbol = MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER)
         val layer = ItemizedLayer(
             mapView.vtmMap,
-            mutableListOf(),
-            markerRendererFactory,
-            object : OnItemGestureListener<MarkerInterface> {
-                override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean {
-                    itemListener?.let {
-                        it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation)
-                    }
-                    return true
+            symbol,
+        )
+        layer.setOnItemGestureListener(object : OnItemGestureListener<MarkerInterface> {
+            override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean {
+                itemListener?.let {
+                    it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation)
                 }
+                return true
+            }
 
-                override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean {
-                    return true
-                }
-
-            })
+            override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean {
+                return true
+            }
 
+        })
         addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER)
         layer
     }
@@ -207,69 +212,33 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
     /**
      * 便签图标图层
      */
-    private val noteLayer: MyItemizedLayer by lazy {
-
-        val layer = MyItemizedLayer(
+    private val noteLayer: ItemizedLayer by lazy {
+        val bitmap =
+            AndroidBitmap(BitmapFactory.decodeResource(context.resources, noteResId))
+        val symbol = MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER)
+        val layer = ItemizedLayer(
             mMapView.vtmMap,
-            mutableListOf(),
-            markerRendererFactory,
-            object : MyItemizedLayer.OnItemGestureListener {
-                override fun onItemSingleTapUp(
-                    list: MutableList<Int>,
-                    nearest: Int
-                ): Boolean {
-                    itemListener?.let {
-                        val idList = mutableListOf<String>()
-                        if (list.size == 0) {
-
-                        } else {
-                            for (i in list) {
-                                val markerInterface: MarkerInterface =
-                                    noteLayer.itemList[i]
-                                if (markerInterface is MarkerItem) {
-                                    idList.add(markerInterface.title)
-                                }
-                            }
-                            it.onNoteList(idList.distinct().toMutableList())
-                        }
-                    }
-                    return true
+            symbol,
+        )
+        layer.setOnItemGestureListener(object : OnItemGestureListener<MarkerInterface> {
+            override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean {
+                itemListener?.let {
+                    val marker = layer.itemList[index]
+                    if (marker is MarkerItem)
+                        it.onNote(marker.title)
                 }
+                return true
+            }
 
-                override fun onItemLongPress(
-                    list: MutableList<Int>?,
-                    nearest: Int
-                ): Boolean {
-                    return true
-                }
-            })
-
+            override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean {
+                return true
+            }
+        })
         addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER)
         layer
     }
 
 
-    private val markerRendererFactory: MarkerRendererFactory by lazy {
-        val bitmapPoi: Bitmap = AndroidBitmap(
-            BitmapFactory.decodeResource(
-                mContext.resources,
-                R.mipmap.map_icon_blue2
-            )
-        )
-        val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER)
-        MarkerRendererFactory { markerLayer ->
-            object : ClusterMarkerRenderer(
-                mContext,
-                markerLayer,
-                symbol,
-                ClusterStyle(
-                    org.oscim.backend.canvas.Color.WHITE,
-                    org.oscim.backend.canvas.Color.BLUE
-                )
-            ) {
-            }
-        }
-    }
     private val resId = R.mipmap.map_icon_report
     private val noteResId = R.drawable.icon_note_marker
     private var itemListener: OnQsRecordItemClickListener? = null
@@ -436,26 +405,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
     }
 
 
-//    /**
-//     * 初始话质检数据图层
-//     */
-//    private fun initQsRecordDataLayer() {
-//
-//        mContext.lifecycleScope.launch(Dispatchers.IO) {
-//            var list = mutableListOf<QsRecordBean>()
-//            val realm = Realm.getDefaultInstance()
-//            realm.executeTransaction {
-//                val objects = realm.where<QsRecordBean>().findAll()
-//                list = realm.copyFromRealm(objects)
-//            }
-//            for (item in list) {
-//                createMarkerItem(item)
-//            }
-//        }
-//
-//    }
-
-
     /**
      * 添加质检数据marker
      */
@@ -808,6 +757,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
 
 interface OnQsRecordItemClickListener {
     fun onQsRecordList(list: MutableList<String>)
-    fun onNoteList(list: MutableList<String>)
+    fun onNote(noteId: String)
     fun onNiLocation(it: NiLocation)
 }
diff --git a/vtm b/vtm
index dd13e533..1ee201a4 160000
--- a/vtm
+++ b/vtm
@@ -1 +1 @@
-Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323
+Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a