From 884ec8a583d2761d4f66a7e058ea2a5552dcf564 Mon Sep 17 00:00:00 2001
From: qiji4215 <qiji4215@navinfo.com>
Date: Wed, 18 Oct 2023 14:13:55 +0800
Subject: [PATCH 1/5] merge code

---
 .../ui/fragment/tasklist/TaskListFragment.kt  | 23 ++++++--
 .../ui/fragment/tasklist/TaskViewModel.kt     | 56 +++++++++++++++++++
 2 files changed, 73 insertions(+), 6 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt
index 6d70679d..5fa3f914 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt
@@ -89,8 +89,15 @@ class TaskListFragment : BaseFragment() {
             deleteItem.background = requireContext().getDrawable(R.color.red)
             deleteItem.setTextColor(requireContext().resources.getColor(R.color.white))
             rightMenu.addMenuItem(deleteItem)
-        }
 
+            val resetDownLoad = SwipeMenuItem(context)
+            resetDownLoad.height = Util.convertDpToPx(requireContext(), 60)
+            resetDownLoad.width = Util.convertDpToPx(requireContext(), 80)
+            resetDownLoad.text = "重新下载"
+            resetDownLoad.background = requireContext().getDrawable(R.color.btn_bg_blue)
+            resetDownLoad.setTextColor(requireContext().resources.getColor(R.color.white))
+            rightMenu.addMenuItem(resetDownLoad)
+        }
 
         val layoutManager = LinearLayoutManager(context)
         //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能
@@ -104,11 +111,15 @@ class TaskListFragment : BaseFragment() {
         binding.taskListRecyclerview.setOnItemMenuClickListener { menuBridge, position ->
             menuBridge.closeMenu()
             val taskBean = adapter.data[position]
-            if (taskBean.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
-                Toast.makeText(context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT)
-                    .show()
-            } else {
-                viewModel.removeTask(requireContext(), taskBean)
+            if(menuBridge.position==0){
+                if (taskBean.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
+                    Toast.makeText(context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT)
+                        .show()
+                } else {
+                    viewModel.removeTask(requireContext(), taskBean)
+                }
+            }else{
+                viewModel.resetDownload(requireContext(), taskBean)
             }
         }
 
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
index 358f63c7..682849a0 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
@@ -410,6 +410,62 @@ class TaskViewModel @Inject constructor(
         }
     }
 
+    /**
+     * 重新下载数据任务
+     */
+    fun resetDownload(context: Context, taskBean: TaskBean){
+        val mDialog = FirstDialog(context)
+        mDialog.setTitle("提示?")
+        mDialog.setMessage("是否重置下载状态,请确认!")
+        mDialog.setPositiveButton(
+            "确定"
+        ) { dialog, _ ->
+            dialog.dismiss()
+            viewModelScope.launch(Dispatchers.IO) {
+                //删除已下载的数据
+                val fileTemp = File("${Constant.DOWNLOAD_PATH}${taskBean.evaluationTaskName}_${taskBean.dataVersion}.zip")
+                if(fileTemp.exists()){
+                    fileTemp.deleteOnExit()
+                }
+                val taskFileTemp = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
+                //重命名
+                if(taskFileTemp.exists()){
+                    taskFileTemp.renameTo(File(Constant.USER_DATA_PATH + "/${taskBean.id}-back-${DateTimeUtil.getNowDate().time}"))
+                }
+                //将下载状态修改已下载
+                val realm = realmOperateHelper.getRealmDefaultInstance()
+                taskBean.syncStatus = FileManager.Companion.FileUploadStatus.NONE
+                taskBean.status = FileManager.Companion.FileDownloadStatus.NONE
+                realm.executeTransaction { r ->
+                    r.copyToRealmOrUpdate(taskBean)
+                }
+                val nowTime: Long = DateTimeUtil.getNowDate().time
+                val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
+                val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
+                val objects =
+                    realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or()
+                        .between("operationTime", beginNowTime, nowTime)
+                        .equalTo("syncStatus", syncUpload).findAll()
+                val taskList = realm.copyFromRealm(objects)
+                for (item in taskList) {
+                    FileManager.checkOMDBFileInfo(item)
+                }
+                liveDataTaskList.postValue(taskList)
+                realm.close()
+                withContext(Dispatchers.Main) {
+                    setSelectTaskBean(taskBean)
+                }
+            }
+        }
+        mDialog.setNegativeButton(
+            "取消"
+        ) { _, _ ->
+            liveDataCloseTask.postValue(false)
+            mDialog.dismiss()
+        }
+        mDialog.show()
+    }
+
     /**
      * 关闭任务
      */

From 172d84f8c2f80406f33172d5ee97ac224be000cd Mon Sep 17 00:00:00 2001
From: qiji4215 <qiji4215@navinfo.com>
Date: Tue, 24 Oct 2023 17:53:46 +0800
Subject: [PATCH 2/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BD=A8=E8=BF=B9?=
 =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/src/main/assets/omdb_config.json          |  13 +-
 .../main/java/com/navinfo/omqs/Constant.kt    |  10 +
 .../java/com/navinfo/omqs/OMQSApplication.kt  |   2 +
 .../com/navinfo/omqs/db/ImportOMDBHelper.kt   |   4 +
 .../com/navinfo/omqs/db/ImportPreProcess.kt   |  10 +-
 .../omqs/ui/activity/login/LoginViewModel.kt  |   3 +
 .../omqs/ui/activity/map/MainViewModel.kt     |   8 +-
 .../omqs/ui/activity/map/SignAdapter.kt       |   2 +
 .../personalcenter/PersonalCenterFragment.kt  |  20 +-
 .../ui/fragment/tasklist/TaskViewModel.kt     |  18 +-
 .../java/com/navinfo/omqs/util/CMLog.java     | 349 ++++++++++++++++++
 .../java/com/navinfo/omqs/util/NaviEngine.kt  |   1 +
 .../java/com/navinfo/omqs/util/SignUtil.kt    |  10 +-
 .../main/res/menu/personal_center_menu.xml    |   9 +-
 .../src/main/assets/editormarker.xml          |  16 +-
 .../src/main/assets/omdb/icon_2013_0.svg      |  19 +-
 .../src/main/assets/omdb/icon_2013_1.svg      |  19 +-
 .../src/main/assets/omdb/icon_2013_2.svg      |  19 +-
 .../src/main/assets/omdb/icon_2013_6.svg      |  19 +-
 .../src/main/assets/omdb/icon_2013_7.svg      |  19 +-
 .../collect/library/enums/DataCodeEnum.kt     |   1 +
 .../map/handler/LocationLayerHandler.kt       |   2 +-
 .../library/map/handler/MarkHandler.kt        |  42 ++-
 23 files changed, 520 insertions(+), 95 deletions(-)
 create mode 100644 app/src/main/java/com/navinfo/omqs/util/CMLog.java

diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json
index fd12c971..ef5df669 100644
--- a/app/src/main/assets/omdb_config.json
+++ b/app/src/main/assets/omdb_config.json
@@ -125,11 +125,6 @@
 				"zoomMin": 15,
 				"zoomMax": 17
 			},
-			"2041":{
-				"table": "OMDB_LANE_NUM",
-				"code": 2041,
-				"name": "车道数"
-			},
 			"2097":{
 				"table": "OMDB_PHY_LANENUM",
 				"code": 2097,
@@ -533,12 +528,6 @@
 				"zoomMin": 15,
 				"zoomMax": 17,
 				"transformer": [
-					{
-						"k": "geometry",
-						"v": "~",
-						"klib": "geometry",
-						"vlib": "translateRight(direct=3)"
-					},
 					{
 						"k": "geometry",
 						"v": "~",
@@ -643,4 +632,4 @@
 
 		}
 	}
-]
\ No newline at end of file
+]
diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt
index a0decc44..9ee9f307 100644
--- a/app/src/main/java/com/navinfo/omqs/Constant.kt
+++ b/app/src/main/java/com/navinfo/omqs/Constant.kt
@@ -79,6 +79,11 @@ class Constant {
          */
         lateinit var DOWNLOAD_PATH: String
 
+        /**
+         * 日志目录
+         */
+        lateinit var USER_DATA_LOG_PATH: String
+
         /**
          * 图层管理对应的配置
          * */
@@ -107,6 +112,11 @@ class Constant {
          */
         var MapMarkerCloseEnable = false
 
+        /**
+         * 轨迹显隐
+         */
+        var MapTraceCloseEnable = false
+
         /**
          * 是否开启线捕捉
          */
diff --git a/app/src/main/java/com/navinfo/omqs/OMQSApplication.kt b/app/src/main/java/com/navinfo/omqs/OMQSApplication.kt
index 2a35c533..5e2238e4 100644
--- a/app/src/main/java/com/navinfo/omqs/OMQSApplication.kt
+++ b/app/src/main/java/com/navinfo/omqs/OMQSApplication.kt
@@ -8,6 +8,7 @@ import android.view.Surface
 import android.view.WindowManager
 import com.navinfo.omqs.tools.FileManager
 import com.navinfo.omqs.ui.manager.TakePhotoManager
+import com.navinfo.omqs.util.CMLog
 import com.navinfo.omqs.util.NetUtils
 import com.umeng.commonsdk.UMConfigure
 import dagger.hilt.android.HiltAndroidApp
@@ -20,6 +21,7 @@ class OMQSApplication : Application() {
         super.onCreate()
         FileManager.initRootDir(this)
         Util.getInstance().init(applicationContext)
+        CMLog.getInstance().init(applicationContext)
         NetUtils.getInstance().init(this)
         TakePhotoManager.getInstance().init(this, 1)
         // 初始化友盟统计
diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
index 5bffc6d3..2a26856d 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
@@ -327,6 +327,10 @@ class ImportOMDBHelper @AssistedInject constructor(
                                                 }
 
                                                 DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> {
+                                                    var featurePid = renderEntity.properties["featurePid"]
+                                                    if(featurePid!="135340259623248665"){
+                                                        continue
+                                                    }
                                                     var boundaryType = renderEntity.properties["boundaryType"]
                                                     if (boundaryType != null) {
                                                         when (boundaryType.toInt()) {
diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
index c2e842ef..3e3c0cb7 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -485,10 +485,12 @@ class ImportPreProcess {
                                         renderEntityTemp.catchEnable = renderEntity.catchEnable
                                         var dis = -lateralOffset.toDouble() / 100000000
                                         //最小值取10厘米,否正渲染太近无法显示
-                                        if (dis > 0 && dis < 0.0000028) {
-                                            dis = 0.0000028
-                                        } else if (dis > -0.0000028 && dis < 0) {
-                                            dis = -0.0000028
+                                        if (dis > 0 && dis < 0.000005) {
+                                            dis = 0.000005
+                                            Log.d("lateralOffset", "$dis")
+                                        } else if (dis > -0.000005 && dis < 0) {
+                                            dis = -0.000005
+                                            Log.d("lateralOffset", "$dis")
                                         }
                                         renderEntityTemp.geometry = GeometryTools.computeLine(
                                             dis,
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt
index 037b2e97..fe1007b4 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt
@@ -418,12 +418,15 @@ class LoginViewModel @Inject constructor(
         Constant.VERSION_ID = userId
         Constant.USER_DATA_PATH = Constant.DATA_PATH + Constant.USER_ID + "/" + Constant.VERSION_ID
         Constant.USER_DATA_ATTACHEMNT_PATH = Constant.USER_DATA_PATH + "/attachment/"
+        Constant.USER_DATA_LOG_PATH = Constant.USER_DATA_PATH + "/log/"
         // 在SD卡创建用户目录,解压资源等
         val userFolder = File(Constant.USER_DATA_PATH)
         if (!userFolder.exists()) userFolder.mkdirs()
         //创建附件目录
         val userAttachmentFolder = File(Constant.USER_DATA_ATTACHEMNT_PATH)
         if (!userAttachmentFolder.exists()) userAttachmentFolder.mkdirs()
+        val userLogFolder = File(Constant.USER_DATA_LOG_PATH)
+        if (!userLogFolder.exists()) userLogFolder.mkdirs()
         // 初始化Realm
         Realm.init(context.applicationContext)
         // 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
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 de2cde10..2d628cbf 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,6 +23,7 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import androidx.navigation.findNavController
 import com.blankj.utilcode.util.ToastUtils
+import com.google.gson.Gson
 import com.navinfo.collect.library.data.dao.impl.TraceDataBase
 import com.navinfo.collect.library.data.entity.*
 import com.navinfo.collect.library.enums.DataCodeEnum
@@ -535,6 +536,7 @@ class MainViewModel @Inject constructor(
      * 初始化定位信息
      */
     private fun initLocation() {
+        var gson = Gson();
 
         //用于定位点存储到数据库
         viewModelScope.launch(Dispatchers.Default) {
@@ -590,10 +592,14 @@ class MainViewModel @Inject constructor(
                     }
                     //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米
                     if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) {
+                        Log.e("jingo", "轨迹插入开始")
+                        CMLog.writeLogtoFile(MainViewModel::class.java.name,"insertTrace","开始")
                         traceDataBase.niLocationDao.insert(location)
                         mapController.markerHandle.addNiLocationMarkerItem(location)
                         mapController.mMapView.vtmMap.updateMap(true)
                         lastNiLocaion = location
+                        CMLog.writeLogtoFile(MainViewModel::class.java.name,"insertTrace",gson.toJson(location))
+                        Log.e("jingo", "轨迹插入结束")
                     }
                 }
             }
@@ -980,7 +986,7 @@ class MainViewModel @Inject constructor(
     fun onClickLocationButton() {
         val mapPosition: MapPosition = mapController.mMapView.vtmMap.getMapPosition()
         mapPosition.setBearing(0f) // 锁定角度,自动将地图旋转到正北方向
-        mapController.mMapView.vtmMap.setMapPosition(mapPosition)
+        mapController.mMapView.vtmMap.mapPosition = mapPosition
         mapController.locationLayerHandler.animateToCurrentPosition()
     }
 
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
index a12f81a1..9c09dce6 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
@@ -37,6 +37,8 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) :
     override fun getItemViewType(position: Int): Int {
         if (data.isNotEmpty() && data[position].renderEntity.code == DataCodeEnum.OMDB_LANEINFO.code) {
             return 4601
+        }else if (data.isNotEmpty() && data[position].renderEntity.code == DataCodeEnum.OMDB_CLM_LANEINFO.code) {
+            return 4602
         } else if (data.isNotEmpty() && data[position].renderEntity.code == DataCodeEnum.OMDB_TOLLGATE.code) {
             return 4023
         }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt
index ddf80f33..d4fac71e 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt
@@ -151,7 +151,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
                         val mapPosition: MapPosition =
                             niMapController.mMapView.vtmMap.getMapPosition()
                         mapPosition.setBearing(0f) // 锁定角度,自动将地图旋转到正北方向
-                        niMapController.mMapView.vtmMap.setMapPosition(mapPosition)
+                        niMapController.mMapView.vtmMap.mapPosition = mapPosition
                         it.title = "开启地图旋转及视角"
                     } else {
                         it.title = "锁定地图旋转及视角"
@@ -168,6 +168,17 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
                         it.title = "隐藏Marker"
                     }
                 }
+                R.id.personal_center_menu_trace -> {
+                    Constant.MapTraceCloseEnable = !Constant.MapTraceCloseEnable
+                    //增加开关控制
+                    niMapController.markerHandle.setTraceMarkEnable(!Constant.MapTraceCloseEnable)
+                    //增加开关控制
+                    if (Constant.MapTraceCloseEnable) {
+                        it.title = "显示轨迹"
+                    } else {
+                        it.title = "隐藏轨迹"
+                    }
+                }
                 R.id.personal_center_menu_catch_all -> {
                     Constant.CATCH_ALL = !Constant.CATCH_ALL
                     if (Constant.CATCH_ALL) {
@@ -258,6 +269,13 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
                         it.title = "隐藏Marker"
                     }
                 }
+                R.id.personal_center_menu_trace -> {
+                    if (Constant.MapTraceCloseEnable) {
+                        it.title = "显示轨迹"
+                    } else {
+                        it.title = "隐藏轨迹"
+                    }
+                }
             }
         }
     }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
index 682849a0..04416272 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
@@ -425,12 +425,20 @@ class TaskViewModel @Inject constructor(
                 //删除已下载的数据
                 val fileTemp = File("${Constant.DOWNLOAD_PATH}${taskBean.evaluationTaskName}_${taskBean.dataVersion}.zip")
                 if(fileTemp.exists()){
-                    fileTemp.deleteOnExit()
+                    fileTemp.delete()
                 }
                 val taskFileTemp = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
                 //重命名
                 if(taskFileTemp.exists()){
-                    taskFileTemp.renameTo(File(Constant.USER_DATA_PATH + "/${taskBean.id}-back-${DateTimeUtil.getNowDate().time}"))
+                    var currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
+                    var currentSelectTaskConfig =
+                        RealmConfiguration.Builder().directory(currentSelectTaskFolder)
+                            .name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true)
+                            .schemaVersion(2).build()
+                    //删除已有所有数据
+                    Realm.getInstance(currentSelectTaskConfig).deleteAll()
+                    Realm.getInstance(currentSelectTaskConfig).refresh()
+                    Realm.getInstance(currentSelectTaskConfig).close()
                 }
                 //将下载状态修改已下载
                 val realm = realmOperateHelper.getRealmDefaultInstance()
@@ -453,7 +461,11 @@ class TaskViewModel @Inject constructor(
                 liveDataTaskList.postValue(taskList)
                 realm.close()
                 withContext(Dispatchers.Main) {
-                    setSelectTaskBean(taskBean)
+                    if(taskBean.id== currentSelectTaskBean?.id ?: 0){
+                        mapController.layerManagerHandler.updateOMDBVectorTileLayer()
+                    }else{
+                        setSelectTaskBean(taskBean)
+                    }
                 }
             }
         }
diff --git a/app/src/main/java/com/navinfo/omqs/util/CMLog.java b/app/src/main/java/com/navinfo/omqs/util/CMLog.java
new file mode 100644
index 00000000..4dff58e0
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/util/CMLog.java
@@ -0,0 +1,349 @@
+package com.navinfo.omqs.util;
+
+import android.app.ActivityManager;
+import android.app.ActivityManager.MemoryInfo;
+import android.content.Context;
+import android.util.Log;
+
+import com.navinfo.omqs.Constant;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 带日志文件输入的,又可控开关的日志调试
+ *
+ * @author qj
+ * @version 1.0
+ * @data 2016-8-23
+ */
+public class CMLog {
+    //CrashHandler实例    
+    /**
+     *
+     */
+    private static CMLog instance;
+    /**
+     *
+     */
+    private static Boolean MYLOG_SWITCH = true; //日志文件总开关
+    /**
+     *
+     */
+    private static Boolean MYLOG_WRITE_TO_FILE = true;//日志写入文件开关
+    /**
+     *
+     */
+    private static char MYLOG_TYPE = 'v';//输入日志类型,w代表只输出告警信息等,v代表输出所有信息
+//    private static String MYLOG_PATH_SDCARD_DIR = FMConstant.USER_DATA_LOG_PATH;// 日志文件在sdcard中的路径
+    /**
+     *
+     */
+    private static int SDCARD_LOG_FILE_SAVE_DAYS = 0;// sd卡中日志文件的最多保存天数
+    /**
+     *
+     */
+    private static String MYLOGFILEName = "Log.txt";// 本类输出的日志文件名称
+    /**
+     *
+     */
+    private static String STACKLOGFILEName = "StackLog.txt";// 本类输出的日志文件名称
+    /**
+     *
+     */
+    private static SimpleDateFormat myLogSdf   = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//日志的输出格式
+    /**
+     *
+     */
+    private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd-HH");//日志文件格式
+    /**
+     *
+     */
+    private static Context mContext;
+    /**
+     *
+     */
+    private static boolean flag;
+    /**
+     *
+     */
+    private static int count = 0;
+    /**
+     *
+     */
+    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
+
+    /**
+     * 获取CrashHandler实例 ,单例模式
+     * @return
+     */
+    public static CMLog getInstance() {
+        if (instance == null)
+            instance = new CMLog();
+        return instance;
+    }
+
+    /**
+     * 初始化
+     * @param context
+     */
+    public void init(Context context) {
+        mContext = context;
+    }
+
+    /**
+     * @param tag
+     * @param msg
+     */
+    public static void w(String tag, Object msg) {//警告信息
+        log(tag, msg.toString(), 'w');
+    }
+
+    /**
+     * @param tag
+     * @param msg
+     */
+    public static void e(String tag, Object msg) {//错误信息
+        log(tag, msg.toString(), 'e');
+    }
+
+    /**
+     * @param tag
+     * @param msg
+     */
+    public static void d(String tag, Object msg) {//调试信息
+        log(tag, msg.toString(), 'd');
+    }
+
+    /**
+     * @param tag
+     * @param msg
+     */
+    public static void i(String tag, Object msg) {//
+        log(tag, msg.toString(), 'i');
+    }
+
+    /**
+     * @param tag
+     * @param msg
+     */
+    public static void v(String tag, Object msg) {
+        log(tag, msg.toString(), 'v');
+    }
+
+    /**
+     * @param tag
+     * @param text
+     */
+    public static void w(String tag, String text) {
+        log(tag, text, 'w');
+    }
+
+    /**
+     * @param tag
+     * @param text
+     */
+    public static void e(String tag, String text) {
+        log(tag, text, 'e');
+    }
+
+    /**
+     * @param tag
+     * @param text
+     */
+    public static void d(String tag, String text) {
+        log(tag, text, 'd');
+    }
+
+    /**
+     * @param tag
+     * @param text
+     */
+    public static void i(String tag, String text) {
+        log(tag, text, 'i');
+    }
+
+    /**
+     * @param tag
+     * @param text
+     */
+    public static void v(String tag, String text) {
+        log(tag, text, 'v');
+    }
+
+    /**
+     * 根据tag, msg和等级,输出日志
+     *
+     * @param tag
+     * @param msg
+     * @param level
+     * @return void
+     * @since v 1.0
+     */
+    private static void log(String tag, String msg, char level) {
+        if (MYLOG_SWITCH) {
+            if ('e' == level && ('e' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) { // 输出错误信息
+                Log.e(tag, msg);
+            } else if ('w' == level && ('w' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
+                Log.w(tag, msg);
+            } else if ('d' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
+                Log.d(tag, msg);
+            } else if ('i' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) {
+                Log.i(tag, msg);
+            } else {
+                Log.v(tag, msg);
+            }
+            if (MYLOG_WRITE_TO_FILE)
+                writeLogtoFile(String.valueOf(level), tag, msg);
+        }
+    }
+
+    /**
+     * 打开日志文件并写入日志
+     *
+     * @param mylogtype
+     * @param tag
+     * @param text
+     **/
+    public static void writeLogtoFile(String mylogtype, String tag, String text) {
+        if (!flag&&MYLOG_WRITE_TO_FILE) {
+            flag = true;
+            try {
+                Log.e("jingo", "日志写入0");
+                // 新建或打开日志文件
+                Date nowtime = new Date();
+                String needWriteFiel = logfile.format(nowtime);
+               // String needWriteMessage = myLogSdf.format(nowtime) + "    " + mylogtype
+                String needWriteMessage =  simpleDateFormat.format(nowtime) + "    " + mylogtype
+                        + "    " + count + "  " + tag + "    " + text + "\r\n";
+                //输出内存使用情况
+                ActivityManager activityManager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
+                MemoryInfo memoryInfo = new MemoryInfo();
+                activityManager.getMemoryInfo(memoryInfo);
+/*                needWriteMessage += " 系统剩余内存: " + (memoryInfo.availMem / 1024) + "(KB)\n";
+                needWriteMessage += " 系统是否处于低内存运行: " + memoryInfo.lowMemory + "\n";
+                needWriteMessage += " 当系统剩余内存低于: " + (memoryInfo.threshold / 1024) + "(KB)\n";*/
+                if (new File(Constant.USER_DATA_LOG_PATH).exists() == false) {
+                    new File(Constant.USER_DATA_LOG_PATH).mkdirs();
+                }
+                File file = new File(Constant.USER_DATA_LOG_PATH, needWriteFiel + MYLOGFILEName);
+                Log.e("jingo", "日志写入1");
+
+                if (!file.exists())
+                    file.createNewFile();
+                Log.e("jingo", "日志写入2");
+
+                FileWriter filerWriter = new FileWriter(file, true);//后面这个参数代表是不是要接上文件中原来的数据,不进行覆盖
+                BufferedWriter bufWriter = new BufferedWriter(filerWriter);
+                bufWriter.write(needWriteMessage);
+                bufWriter.newLine();
+                bufWriter.close();
+                filerWriter.close();
+                Log.e("jingo", "日志写入结束");
+            } catch (Exception e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            } finally {
+                flag = false;
+            }
+        }
+
+        count ++;
+
+        if(count>10000){
+            count = 0;
+        }
+    }
+
+    /**
+     * 写入调用栈的信息,包括文件名,行号,接口名称
+     *
+     * @param extMsg 扩展信息,如果不为NULL,则输出到栈信息之前
+     */
+    public static void writeStackLogtoFile(String extMsg) {// 新建或打开日志文件
+        StackTraceElement[] eles = Thread.currentThread().getStackTrace();
+        Date nowtime = new Date();
+        String needWriteFiel = logfile.format(nowtime);
+        String needWriteMessage = "[Java Stack]:" + myLogSdf.format(nowtime) + "\n";
+
+        if(eles!=null&&eles.length>3){
+            needWriteMessage += "\t file name :" + eles[3].getFileName() + "\n";
+            needWriteMessage += "\t line num  :" + eles[3].getLineNumber() + "\n";
+            needWriteMessage += "\t class name:" + eles[3].getClassName() + "\n";
+            needWriteMessage += "\t method    :" + eles[3].getMethodName() + "\n";
+        }
+
+        if (extMsg != null && extMsg.length() > 0) {
+            needWriteMessage += "\t extMsg    :" + extMsg + "\n";
+        }
+
+        if (new File(Constant.USER_DATA_LOG_PATH).exists() == false) {
+            new File(Constant.USER_DATA_LOG_PATH).mkdirs();
+        }
+        File file = new File(Constant.USER_DATA_LOG_PATH, needWriteFiel
+                + STACKLOGFILEName);
+        try {
+            FileWriter filerWriter = new FileWriter(file, true);//后面这个参数代表是不是要接上文件中原来的数据,不进行覆盖
+            BufferedWriter bufWriter = new BufferedWriter(filerWriter);
+            bufWriter.write(needWriteMessage);
+            bufWriter.newLine();
+            bufWriter.close();
+            filerWriter.close();
+
+        } catch (IOException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 删除制定的日志文件
+     */
+    public static void delFile() {// 删除日志文件
+        String needDelFiel = logfile.format(getDateBefore());
+        File file = new File(Constant.USER_DATA_LOG_PATH, needDelFiel + MYLOGFILEName);
+        if (file.exists()) {
+            file.delete();
+        }
+    }
+
+    /**
+     * 得到现在时间前的几天日期,用来得到需要删除的日志文件名
+     * @return
+     */
+    private static Date getDateBefore() {
+        Date nowtime = new Date();
+        Calendar now = Calendar.getInstance();
+        now.setTime(nowtime);
+        now.set(Calendar.DATE, now.get(Calendar.DATE)
+                - SDCARD_LOG_FILE_SAVE_DAYS);
+        return now.getTime();
+    }
+
+    //输出错误日志
+
+    /**
+     * 得到现在时间前的几天日期,用来得到需要删除的日志文件名
+     * @param e
+     * @param TAG
+     */
+    public static void writeStackLogtoFile(Exception e, String TAG) {
+        String errorInfo = "";
+        for (int i = 0; i < e.getStackTrace().length; i++) {
+            errorInfo += e.getStackTrace()[i];
+        }
+        writeLogtoFile("异常崩溃", "异常", "异常信息:" + errorInfo);
+    }
+
+    /**
+     * @param mylogWriteToFile
+     */
+    public static void setMylogWriteToFile(Boolean mylogWriteToFile) {
+        MYLOG_WRITE_TO_FILE = mylogWriteToFile;
+    }
+}
diff --git a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt
index d2613b24..b388ed73 100644
--- a/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt
+++ b/app/src/main/java/com/navinfo/omqs/util/NaviEngine.kt
@@ -73,6 +73,7 @@ class NaviEngine(
         DataCodeEnum.OMDB_TRAFFICLIGHT.name,
 //        DataCodeEnum.OMDB_RESTRICTION.name,
         DataCodeEnum.OMDB_LANEINFO.name,
+        DataCodeEnum.OMDB_CLM_LANEINFO.name,
         DataCodeEnum.OMDB_TRAFFIC_SIGN.name,
         DataCodeEnum.OMDB_WARNINGSIGN.name,
         DataCodeEnum.OMDB_TOLLGATE.name
diff --git a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt
index 81d67890..01516528 100644
--- a/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt
+++ b/app/src/main/java/com/navinfo/omqs/util/SignUtil.kt
@@ -107,7 +107,7 @@ class SignUtil {
                 //物理车道数OMDB_PHY_LANENUM
                 DataCodeEnum.OMDB_LANE_NUM.code,
                 DataCodeEnum.OMDB_PHY_LANENUM.code -> {
-                    "${data.properties["laneNum"]}|${data.properties["laneS2e"]}|${data.properties["laneE2s"]}"
+                    "${data.properties["laneS2e"]}|${data.properties["laneE2s"]}"
                 }
 
                 //常规点限速,条件点限速
@@ -286,11 +286,11 @@ class SignUtil {
                 //车道数//增加物理车道数DataCodeEnum.OMDB_PHY_LANENUM.code
                 DataCodeEnum.OMDB_PHY_LANENUM.code,
                 DataCodeEnum.OMDB_LANE_NUM.code -> {
-                    list.add(
+/*                    list.add(
                         TwoItemAdapterItem(
                             title = "车道总数", text = "${data.properties["laneNum"]}"
                         )
-                    )
+                    )*/
                     list.add(
                         TwoItemAdapterItem(
                             title = "顺方向车道数", text = "${data.properties["laneS2e"]}"
@@ -1426,14 +1426,14 @@ class SignUtil {
                     )
                     DataCodeEnum.OMDB_RD_LINK_KIND.code -> stringBuffer.append("种别${item.iconText},")
                     DataCodeEnum.OMDB_LINK_DIRECT.code -> stringBuffer.append("${item.iconText},")
-                    DataCodeEnum.OMDB_PHY_LANENUM.code,//物理车道数
+/*                    DataCodeEnum.OMDB_PHY_LANENUM.code,//物理车道数
                     DataCodeEnum.OMDB_LANE_NUM.code -> stringBuffer.append(
                         "${
                             item.iconText.substringBefore(
                                 "|"
                             )
                         }车道"
-                    )
+                    )*/
                 }
             }
             return stringBuffer.toString()
diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml
index f065497c..0b568fcd 100644
--- a/app/src/main/res/menu/personal_center_menu.xml
+++ b/app/src/main/res/menu/personal_center_menu.xml
@@ -48,12 +48,17 @@
             android:title="锁定地图旋转及视角" />
         <item
             android:id="@+id/personal_center_menu_marker"
-            android:icon="@drawable/baseline_person_24"
+            android:icon="@drawable/baseline_map_24"
             android:visible="true"
             android:title="隐藏Marker" />
+        <item
+            android:id="@+id/personal_center_menu_trace"
+            android:icon="@drawable/baseline_map_24"
+            android:visible="true"
+            android:title="隐藏轨迹" />
         <item
             android:id="@+id/personal_center_menu_catch_all"
-            android:icon="@drawable/baseline_person_24"
+            android:icon="@drawable/baseline_map_24"
             android:visible="true"
             android:title="全要素捕捉" />
         <item
diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml
index 07c7eb43..ecd516d0 100644
--- a/collect-library/src/main/assets/editormarker.xml
+++ b/collect-library/src/main/assets/editormarker.xml
@@ -1558,7 +1558,11 @@
             <symbol repeat="false" repeat-start="0" repeat-gap="2000"
                 src="@symbol" symbol-height="24" degree="90"></symbol>
         </m>
-
+        <!-- 车信CLM -->
+        <m v="OMDB_CLM_LANEINFO" >
+            <symbol repeat="false" repeat-start="0" repeat-gap="2000"
+                src="@symbol" symbol-height="24" degree="90"></symbol>
+        </m>
         <!-- 杆状物 -->
         <m v="OMDB_POLE">
             <symbol src="assets:omdb/icon_pole_3006.svg" symbol-height="56" symbol-width="56"></symbol>
@@ -1720,22 +1724,22 @@
                 <m k="markType" v="6">
                     <!--其他|实线-->
                     <m k="markColor" v="1">
-                        <symbol repeat="true" repeat-start="0" repeat-gap="24" src="assets:omdb/icon_2013_1.svg"/>
+                        <symbol repeat="true" repeat-start="0" repeat-gap="32" symbol-height="8" symbol-width="8" src="assets:omdb/icon_2013_1.svg"/>
                     </m>
                     <m k="markColor" v="2">
-                        <symbol repeat="true" repeat-start="0" repeat-gap="24" src="assets:omdb/icon_2013_2.svg"></symbol>
+                        <symbol repeat="true" repeat-start="0" repeat-gap="32" symbol-height="8" symbol-width="8" src="assets:omdb/icon_2013_2.svg"></symbol>
                     </m>
 
                     <m k="markColor" v="6">
-                        <symbol repeat="true" repeat-start="0" repeat-gap="24" src="assets:omdb/icon_2013_6.svg"></symbol>
+                        <symbol repeat="true" repeat-start="0" repeat-gap="32" symbol-height="8" symbol-width="8" src="assets:omdb/icon_2013_6.svg"></symbol>
                     </m>
 
                     <m k="markColor" v="7">
-                        <symbol repeat="true" repeat-start="0" repeat-gap="24" src="assets:omdb/icon_2013_7.svg"></symbol>
+                        <symbol repeat="true" repeat-start="0" repeat-gap="32" symbol-height="8" symbol-width="8" src="assets:omdb/icon_2013_7.svg"></symbol>
                     </m>
 
                     <m k="markColor" v="0|9">
-                        <symbol repeat="true" repeat-start="0" repeat-gap="24" src="assets:omdb/icon_2013_0.svg"></symbol>
+                        <symbol repeat="true" repeat-start="0" repeat-gap="32" symbol-height="8" symbol-width="8" src="assets:omdb/icon_2013_0.svg"></symbol>
                     </m>
                 </m>
             </m>
diff --git a/collect-library/src/main/assets/omdb/icon_2013_0.svg b/collect-library/src/main/assets/omdb/icon_2013_0.svg
index bcb9b125..1a97174a 100644
--- a/collect-library/src/main/assets/omdb/icon_2013_0.svg
+++ b/collect-library/src/main/assets/omdb/icon_2013_0.svg
@@ -1,11 +1,10 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1695622778812" class="icon" viewBox="0 0 1024 1024" version="1.1"
-    xmlns="http://www.w3.org/2000/svg" p-id="8830" xmlns:xlink="http://www.w3.org/1999/xlink"
-    width="48" height="48">
-    <path
-        d="M284.444444 227.555556h739.555556L739.555556 796.444444H0L284.444444 227.555556z m26.368 42.666666l-241.777777 483.555556h644.152889l241.777777-483.555556H310.812444z"
-        fill="#8e44ad" p-id="8831"></path>
-    <path d="M310.812444 270.222222l-241.777777 483.555556h644.152889l241.777777-483.555556z"
-        fill="#8e44ad" fill-opacity=".99" p-id="8832"></path>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="b" xmlns="http://www.w3.org/2000/svg" width="136.1" height="113.4"
+    viewBox="0 0 136.1 113.4">
+    <g id="c">
+        <g>
+            <rect width="136.1" height="113.4" style="fill:none;" />
+            <polygon points="109.7 56.7 0 56.7 26.4 0 136.1 0 109.7 56.7" style="fill:#8e44ad;" />
+        </g>
+    </g>
 </svg>
\ No newline at end of file
diff --git a/collect-library/src/main/assets/omdb/icon_2013_1.svg b/collect-library/src/main/assets/omdb/icon_2013_1.svg
index bd3e6b1e..ac4fd446 100644
--- a/collect-library/src/main/assets/omdb/icon_2013_1.svg
+++ b/collect-library/src/main/assets/omdb/icon_2013_1.svg
@@ -1,11 +1,10 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1695622778812" class="icon" viewBox="0 0 1024 1024" version="1.1"
-    xmlns="http://www.w3.org/2000/svg" p-id="8830" xmlns:xlink="http://www.w3.org/1999/xlink"
-    width="48" height="48">
-    <path
-        d="M284.444444 227.555556h739.555556L739.555556 796.444444H0L284.444444 227.555556z m26.368 42.666666l-241.777777 483.555556h644.152889l241.777777-483.555556H310.812444z"
-        fill="#ffffff" p-id="8831"></path>
-    <path d="M310.812444 270.222222l-241.777777 483.555556h644.152889l241.777777-483.555556z"
-        fill="#ffffff" fill-opacity=".99" p-id="8832"></path>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="b" xmlns="http://www.w3.org/2000/svg" width="136.1" height="113.4"
+    viewBox="0 0 136.1 113.4">
+    <g id="c">
+        <g>
+            <rect width="136.1" height="113.4" style="fill:none;" />
+            <polygon points="109.7 56.7 0 56.7 26.4 0 136.1 0 109.7 56.7" style="fill:#fff;" />
+        </g>
+    </g>
 </svg>
\ No newline at end of file
diff --git a/collect-library/src/main/assets/omdb/icon_2013_2.svg b/collect-library/src/main/assets/omdb/icon_2013_2.svg
index eeb06059..9b4e18f7 100644
--- a/collect-library/src/main/assets/omdb/icon_2013_2.svg
+++ b/collect-library/src/main/assets/omdb/icon_2013_2.svg
@@ -1,11 +1,10 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1695622778812" class="icon" viewBox="0 0 1024 1024" version="1.1"
-    xmlns="http://www.w3.org/2000/svg" p-id="8830" xmlns:xlink="http://www.w3.org/1999/xlink"
-    width="48" height="48">
-    <path
-        d="M284.444444 227.555556h739.555556L739.555556 796.444444H0L284.444444 227.555556z m26.368 42.666666l-241.777777 483.555556h644.152889l241.777777-483.555556H310.812444z"
-        fill="#eccc68" p-id="8831"></path>
-    <path d="M310.812444 270.222222l-241.777777 483.555556h644.152889l241.777777-483.555556z"
-        fill="#eccc68" fill-opacity=".99" p-id="8832"></path>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="b" xmlns="http://www.w3.org/2000/svg" width="136.1" height="113.4"
+    viewBox="0 0 136.1 113.4">
+    <g id="c">
+        <g>
+            <rect width="136.1" height="113.4" style="fill:none;" />
+            <polygon points="109.7 56.7 0 56.7 26.4 0 136.1 0 109.7 56.7" style="fill:#eccc68;" />
+        </g>
+    </g>
 </svg>
\ No newline at end of file
diff --git a/collect-library/src/main/assets/omdb/icon_2013_6.svg b/collect-library/src/main/assets/omdb/icon_2013_6.svg
index ad834913..8f5ad291 100644
--- a/collect-library/src/main/assets/omdb/icon_2013_6.svg
+++ b/collect-library/src/main/assets/omdb/icon_2013_6.svg
@@ -1,11 +1,10 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1695622778812" class="icon" viewBox="0 0 1024 1024" version="1.1"
-    xmlns="http://www.w3.org/2000/svg" p-id="8830" xmlns:xlink="http://www.w3.org/1999/xlink"
-    width="48" height="48">
-    <path
-        d="M284.444444 227.555556h739.555556L739.555556 796.444444H0L284.444444 227.555556z m26.368 42.666666l-241.777777 483.555556h644.152889l241.777777-483.555556H310.812444z"
-        fill="#0000ff" p-id="8831"></path>
-    <path d="M310.812444 270.222222l-241.777777 483.555556h644.152889l241.777777-483.555556z"
-        fill="#0000ff" fill-opacity=".99" p-id="8832"></path>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="b" xmlns="http://www.w3.org/2000/svg" width="136.1" height="113.4"
+    viewBox="0 0 136.1 113.4">
+    <g id="c">
+        <g>
+            <rect width="136.1" height="113.4" style="fill:none;" />
+            <polygon points="109.7 56.7 0 56.7 26.4 0 136.1 0 109.7 56.7" style="fill:#0000ff;" />
+        </g>
+    </g>
 </svg>
\ No newline at end of file
diff --git a/collect-library/src/main/assets/omdb/icon_2013_7.svg b/collect-library/src/main/assets/omdb/icon_2013_7.svg
index 4528138f..305c101d 100644
--- a/collect-library/src/main/assets/omdb/icon_2013_7.svg
+++ b/collect-library/src/main/assets/omdb/icon_2013_7.svg
@@ -1,11 +1,10 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
-    "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg t="1695622778812" class="icon" viewBox="0 0 1024 1024" version="1.1"
-    xmlns="http://www.w3.org/2000/svg" p-id="8830" xmlns:xlink="http://www.w3.org/1999/xlink"
-    width="48" height="48">
-    <path
-        d="M284.444444 227.555556h739.555556L739.555556 796.444444H0L284.444444 227.555556z m26.368 42.666666l-241.777777 483.555556h644.152889l241.777777-483.555556H310.812444z"
-        fill="#00ff00" p-id="8831"></path>
-    <path d="M310.812444 270.222222l-241.777777 483.555556h644.152889l241.777777-483.555556z"
-        fill="#00ff00" fill-opacity=".99" p-id="8832"></path>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg id="b" xmlns="http://www.w3.org/2000/svg" width="136.1" height="113.4"
+    viewBox="0 0 136.1 113.4">
+    <g id="c">
+        <g>
+            <rect width="136.1" height="113.4" style="fill:none;" />
+            <polygon points="109.7 56.7 0 56.7 26.4 0 136.1 0 109.7 56.7" style="fill:#00ff00;" />
+        </g>
+    </g>
 </svg>
\ No newline at end of file
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt b/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt
index 511c9b77..68d28973 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/enums/DataCodeEnum.kt
@@ -81,6 +81,7 @@ enum class DataCodeEnum(var tableName: String, var code: String) {
     OMDB_TRAFFICLIGHT("交通灯", "4022"),
     OMDB_TOLLGATE("收费站", "4023"),
     OMDB_LANEINFO("车信", "4601"),
+    OMDB_CLM_LANEINFO("车信CLM", "4602"),
     OMDB_LANE_LINK_LG("车道中心线", "5001");
 
     companion object {
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 a44d100f..e83ad7af 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
@@ -171,7 +171,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) :
         mCurrentLocation?.run {
             val mapPosition = mMapView.vtmMap.mapPosition
             mapPosition.setPosition(this.latitude, this.longitude)
-            mMapView.vtmMap.animator().animateTo(300, mapPosition)
+            mMapView.vtmMap.animator().animateTo(800, mapPosition)
         }
     }
 
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 b7e38784..74a48a0c 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
@@ -43,8 +43,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
      */
     private val mDefaultTextColor = "#4E55AF"
 
+    /**
+     * 默认Marker可用状态
+     */
     private var markerEnable = true
 
+    /**
+     * 默认轨迹可用状态
+     */
+    private var traceMarkerEnable = true
+
     /**
      * 文字画笔
      */
@@ -277,13 +285,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
         // 设置矢量图层均在12级以上才显示
         mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
             if (e == Map.SCALE_EVENT) {
-                if(markerEnable){
+                if (markerEnable) {
                     qsRecordItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12
-                }else{
+                } else {
                     qsRecordItemizedLayer.isEnabled = false
                 }
-
-                niLocationItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12
+                if (traceMarkerEnable) {
+                    niLocationItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12
+                } else {
+                    niLocationItemizedLayer.isEnabled = false
+                }
             }
         })
     }
@@ -379,13 +390,26 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
         mMapView.updateMap(true)
     }
 
-    fun setQsRecordMarkEnable(enable:Boolean){
+    /**
+     * Marker是否显示
+     */
+    fun setQsRecordMarkEnable(enable: Boolean) {
         qsRecordItemizedLayer.isEnabled = enable
         markerEnable = enable
         qsRecordItemizedLayer.populate()
         mMapView.updateMap(true)
     }
 
+    /**
+     * 轨迹是否显示
+     */
+    fun setTraceMarkEnable(enable: Boolean) {
+        niLocationItemizedLayer.isEnabled = enable
+        traceMarkerEnable = enable
+        niLocationItemizedLayer.populate()
+        mMapView.updateMap(true)
+    }
+
 
     /**
      * 增加或更新便签
@@ -520,11 +544,9 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
      * 添加质检数据marker
      */
     fun addNiLocationMarkerItem(niLocation: NiLocation) {
-        synchronized(this) {
-            var geoMarkerItem = createNILocationBitmap(niLocation)
-            niLocationItemizedLayer.addItem(geoMarkerItem)
-            niLocationItemizedLayer.update()
-        }
+        var geoMarkerItem = createNILocationBitmap(niLocation)
+        niLocationItemizedLayer.addItem(geoMarkerItem)
+        niLocationItemizedLayer.update()
     }
 
     private fun createNILocationBitmap(niLocation: NiLocation): MarkerItem {

From 40d07cc32941d028d65e23b8fd60421e4419cc7b Mon Sep 17 00:00:00 2001
From: qiji4215 <qiji4215@navinfo.com>
Date: Thu, 26 Oct 2023 09:43:40 +0800
Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=BB=E5=8A=A1?=
 =?UTF-8?q?=E6=96=B0=E5=A2=9Elink=E5=88=B7=E6=96=B0=E5=88=97=E8=A1=A8?=
 =?UTF-8?q?=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

---
 .../com/navinfo/omqs/db/ImportOMDBHelper.kt   |   4 -
 .../omqs/ui/activity/login/LoginViewModel.kt  |  10 +-
 .../omqs/ui/fragment/tasklist/TaskFragment.kt |   2 +
 .../ui/fragment/tasklist/TaskListFragment.kt  |  22 ++++
 .../ui/fragment/tasklist/TaskViewModel.kt     | 120 ++++++++++++------
 .../library/data/entity/HadLinkDvoBean.kt     |   6 +
 6 files changed, 123 insertions(+), 41 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
index f05caa67..1d307a3f 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
@@ -327,10 +327,6 @@ class ImportOMDBHelper @AssistedInject constructor(
                                                 }
 
                                                 DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> {
-                                                    var featurePid = renderEntity.properties["featurePid"]
-                                                    if(featurePid!="135340259623248665"){
-                                                        continue
-                                                    }
                                                     var boundaryType = renderEntity.properties["boundaryType"]
                                                     if (boundaryType != null) {
                                                         when (boundaryType.toInt()) {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt
index fe1007b4..0f986a25 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt
@@ -282,6 +282,12 @@ class LoginViewModel @Inject constructor(
                                     task.fileSize = item.fileSize
                                     task.status = item.status
                                     task.currentSize = item.currentSize
+                                    //增加mesh==null兼容性处理
+                                    for (hadLink in item.hadLinkDvoList) {
+                                        if(hadLink.mesh==null){
+                                            hadLink.mesh = ""
+                                        }
+                                    }
                                     task.hadLinkDvoList = item.hadLinkDvoList
                                     task.syncStatus = item.syncStatus
                                     //已上传后不在更新操作时间
@@ -293,8 +299,10 @@ class LoginViewModel @Inject constructor(
                                     }
                                 } else {
                                     for (hadLink in task.hadLinkDvoList) {
-                                        if(hadLink.geometry==null||hadLink.mesh==null){
+                                        if(hadLink.geometry==null){
                                             inSertData = false
+                                        }else if(hadLink.mesh==null){
+                                            hadLink.mesh = ""
                                         }else{
                                             hadLink.taskId = task.id
                                         }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt
index 34bf24f0..b40efbc1 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt
@@ -79,7 +79,9 @@ class TaskFragment : BaseFragment() {
         viewModel.liveDataAddLinkDialog.observe(viewLifecycleOwner){
             viewModel.addTaskLink(requireContext(),it)
         }
+        viewModel.liveDataUpdateTask.observe(viewLifecycleOwner) {
 
+        }
 
         //注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单
         val mSwipeMenuCreator = SwipeMenuCreator { _, rightMenu, _ ->
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt
index 5fa3f914..320137b5 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt
@@ -145,6 +145,28 @@ class TaskListFragment : BaseFragment() {
             binding.taskListRecyclerview.smoothScrollToPosition(position)
         }
 
+        viewModel.liveDataCloseTask.observe(viewLifecycleOwner){
+            when(it){
+                TaskDelStatus.TASK_DEL_STATUS_BEGIN->{
+                    showLoadingDialog("正在重置...")
+                }
+                TaskDelStatus.TASK_DEL_STATUS_LOADING->{
+                    showLoadingDialog("正在重置...")
+                }
+                TaskDelStatus.TASK_DEL_STATUS_SUCCESS->{
+                    hideLoadingDialog()
+                    Toast.makeText(context,"成功重置",Toast.LENGTH_LONG).show()
+
+                }
+                TaskDelStatus.TASK_DEL_STATUS_FAILED->{
+                    hideLoadingDialog()
+                }
+                TaskDelStatus.TASK_DEL_STATUS_CANCEL->{
+
+                }
+            }
+        }
+
         //监听并调用上传
         viewModel.liveDataTaskUpload.observe(viewLifecycleOwner) {
             for ((key, value) in it) {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
index 04416272..97ab87e3 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
@@ -4,6 +4,7 @@ import android.content.Context
 import android.content.SharedPreferences
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener
 import android.os.Build
+import android.util.Log
 import android.view.View
 import android.widget.Toast
 import androidx.annotation.RequiresApi
@@ -31,6 +32,32 @@ import org.oscim.core.GeoPoint
 import java.io.File
 import javax.inject.Inject
 
+enum class TaskDelStatus {
+    /**
+     * 删除开始
+     */
+    TASK_DEL_STATUS_BEGIN,
+
+    /**
+     * 删除中
+     */
+    TASK_DEL_STATUS_LOADING,
+
+    /**
+     * 删除成功
+     */
+    TASK_DEL_STATUS_SUCCESS,
+
+    /**
+     * 删除失败
+     */
+    TASK_DEL_STATUS_FAILED,
+
+    /**
+     * 取消删除
+     */
+    TASK_DEL_STATUS_CANCEL,
+}
 
 @HiltViewModel
 class TaskViewModel @Inject constructor(
@@ -61,7 +88,12 @@ class TaskViewModel @Inject constructor(
     /**
      * 用来确定是否关闭
      */
-    val liveDataCloseTask = MutableLiveData<Boolean>()
+    val liveDataCloseTask = MutableLiveData<TaskDelStatus>()
+
+    /**
+     * 用来更新任务
+     */
+    val liveDataUpdateTask = MutableLiveData<TaskBean>()
 
     /**
      * 提示信息
@@ -107,7 +139,8 @@ class TaskViewModel @Inject constructor(
                             if (currentSelectTaskBean == null) {
                                 liveDataToastMessage.postValue("还没有开启任何任务")
                             } else {
-                                val links = realmOperateHelper.queryLink(realm,
+                                val links = realmOperateHelper.queryLink(
+                                    realm,
                                     point = point,
                                 )
                                 if (links.isNotEmpty()) {
@@ -125,7 +158,8 @@ class TaskViewModel @Inject constructor(
                     } else {
                         viewModelScope.launch(Dispatchers.IO) {
                             val realm = realmOperateHelper.getSelectTaskRealmInstance()
-                            val links = realmOperateHelper.queryLink(realm,
+                            val links = realmOperateHelper.queryLink(
+                                realm,
                                 point = point,
                             )
                             if (links.isNotEmpty()) {
@@ -178,22 +212,34 @@ class TaskViewModel @Inject constructor(
                                         task.fileSize = item.fileSize
                                         task.status = item.status
                                         task.currentSize = item.currentSize
+                                        //增加mesh==null兼容性处理
+                                        for (hadLink in item.hadLinkDvoList) {
+                                            if (hadLink.mesh == null) {
+                                                hadLink.mesh = ""
+                                                Log.e("qj", "${task.id}==null")
+                                            }
+                                        }
                                         task.hadLinkDvoList = item.hadLinkDvoList
                                         task.syncStatus = item.syncStatus
                                         //已上传后不在更新操作时间
                                         if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) {
                                             //赋值时间,用于查询过滤
                                             task.operationTime = DateTimeUtil.getNowDate().time
-                                        }else{//已上传数据不做更新
+                                        } else {//已上传数据不做更新
                                             continue
                                         }
                                     } else {
                                         for (hadLink in task.hadLinkDvoList) {
                                             hadLink.taskId = task.id
+                                            if (hadLink.mesh == null) {
+                                                hadLink.mesh = ""
+                                                Log.e("qj", "${task.id}==新增==null")
+                                            }
                                         }
                                         //赋值时间,用于查询过滤
                                         task.operationTime = DateTimeUtil.getNowDate().time
                                     }
+                                    Log.e("qj", "${task.id}")
                                     realm.copyToRealmOrUpdate(task)
                                 }
                             }
@@ -413,7 +459,7 @@ class TaskViewModel @Inject constructor(
     /**
      * 重新下载数据任务
      */
-    fun resetDownload(context: Context, taskBean: TaskBean){
+    fun resetDownload(context: Context, taskBean: TaskBean) {
         val mDialog = FirstDialog(context)
         mDialog.setTitle("提示?")
         mDialog.setMessage("是否重置下载状态,请确认!")
@@ -421,58 +467,55 @@ class TaskViewModel @Inject constructor(
             "确定"
         ) { dialog, _ ->
             dialog.dismiss()
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_BEGIN)
             viewModelScope.launch(Dispatchers.IO) {
                 //删除已下载的数据
-                val fileTemp = File("${Constant.DOWNLOAD_PATH}${taskBean.evaluationTaskName}_${taskBean.dataVersion}.zip")
-                if(fileTemp.exists()){
+                val fileTemp =
+                    File("${Constant.DOWNLOAD_PATH}${taskBean.evaluationTaskName}_${taskBean.dataVersion}.zip")
+                if (fileTemp.exists()) {
                     fileTemp.delete()
                 }
                 val taskFileTemp = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
                 //重命名
-                if(taskFileTemp.exists()){
-                    var currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
+                if (taskFileTemp.exists()) {
+/*                    var currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
                     var currentSelectTaskConfig =
                         RealmConfiguration.Builder().directory(currentSelectTaskFolder)
-                            .name("OMQS.realm").encryptionKey(Constant.PASSWORD).allowQueriesOnUiThread(true)
+                            .name("OMQS.realm").encryptionKey(Constant.PASSWORD)
+                            .allowQueriesOnUiThread(true)
                             .schemaVersion(2).build()
-                    //删除已有所有数据
-                    Realm.getInstance(currentSelectTaskConfig).deleteAll()
-                    Realm.getInstance(currentSelectTaskConfig).refresh()
-                    Realm.getInstance(currentSelectTaskConfig).close()
+                    Realm.getInstance(currentSelectTaskConfig).executeTransaction { r ->
+                        //删除已有所有数据
+                        r.delete(RenderEntity::class.java)
+                        r.delete(ReferenceEntity::class.java)
+                    }
+                    Realm.getInstance(currentSelectTaskConfig).close()*/
                 }
                 //将下载状态修改已下载
                 val realm = realmOperateHelper.getRealmDefaultInstance()
                 taskBean.syncStatus = FileManager.Companion.FileUploadStatus.NONE
                 taskBean.status = FileManager.Companion.FileDownloadStatus.NONE
-                realm.executeTransaction { r ->
-                    r.copyToRealmOrUpdate(taskBean)
-                }
-                val nowTime: Long = DateTimeUtil.getNowDate().time
-                val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L
-                val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE
-                val objects =
-                    realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or()
-                        .between("operationTime", beginNowTime, nowTime)
-                        .equalTo("syncStatus", syncUpload).findAll()
-                val taskList = realm.copyFromRealm(objects)
-                for (item in taskList) {
-                    FileManager.checkOMDBFileInfo(item)
-                }
-                liveDataTaskList.postValue(taskList)
+                realm.beginTransaction()
+                realm.copyToRealmOrUpdate(taskBean)
+                realm.commitTransaction()
                 realm.close()
+                liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_SUCCESS)
                 withContext(Dispatchers.Main) {
-                    if(taskBean.id== currentSelectTaskBean?.id ?: 0){
+                    if (taskBean.id == currentSelectTaskBean?.id ?: 0) {
                         mapController.layerManagerHandler.updateOMDBVectorTileLayer()
-                    }else{
+                    } else {
                         setSelectTaskBean(taskBean)
                     }
+                    realmOperateHelper.getRealmDefaultInstance().refresh()
+                    //重新加载数据
+                    getLocalTaskList()
                 }
             }
         }
         mDialog.setNegativeButton(
             "取消"
         ) { _, _ ->
-            liveDataCloseTask.postValue(false)
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_CANCEL)
             mDialog.dismiss()
         }
         mDialog.show()
@@ -489,7 +532,9 @@ class TaskViewModel @Inject constructor(
             "确定"
         ) { dialog, _ ->
             dialog.dismiss()
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_BEGIN)
             viewModelScope.launch(Dispatchers.IO) {
+                liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_LOADING)
                 val realm = realmOperateHelper.getRealmDefaultInstance()
                 realm.executeTransaction {
                     val objects =
@@ -523,14 +568,14 @@ class TaskViewModel @Inject constructor(
                     FileManager.checkOMDBFileInfo(item)
                 }
                 liveDataTaskList.postValue(taskList)
-                liveDataCloseTask.postValue(true)
+                liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_SUCCESS)
                 realm.close()
             }
         }
         mDialog.setNegativeButton(
             "取消"
         ) { _, _ ->
-            liveDataCloseTask.postValue(false)
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_CANCEL)
             mDialog.dismiss()
         }
         mDialog.show()
@@ -641,7 +686,7 @@ class TaskViewModel @Inject constructor(
                 }
                 //根据Link数据查询对应数据上要素,对要素进行显示重置
                 data.properties["linkPid"]?.let {
-                    realmOperateHelper.queryLinkToMutableRenderEntityList(realm,it)
+                    realmOperateHelper.queryLinkToMutableRenderEntityList(realm, it)
                         ?.forEach { renderEntity ->
                             if (renderEntity.enable != 1) {
                                 renderEntity.enable = 1
@@ -696,7 +741,10 @@ class TaskViewModel @Inject constructor(
 
                     //重置数据为隐藏
                     if (hadLinkDvoBean.linkStatus == 2) {
-                        realmOperateHelper.queryLinkToMutableRenderEntityList(realm,hadLinkDvoBean.linkPid)
+                        realmOperateHelper.queryLinkToMutableRenderEntityList(
+                            realm,
+                            hadLinkDvoBean.linkPid
+                        )
                             ?.forEach { renderEntity ->
                                 if (renderEntity.enable == 1) {
                                     renderEntity.enable = 0
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 8b486d45..d85d5dd3 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,5 +1,7 @@
 package com.navinfo.collect.library.data.entity
 
+import com.navinfo.collect.library.utils.GeometryTools
+import com.navinfo.collect.library.utils.GeometryToolsKt
 import io.realm.RealmObject
 import io.realm.annotations.PrimaryKey
 
@@ -12,11 +14,13 @@ open class HadLinkDvoBean @JvmOverloads constructor(
      * 图幅号
      */
     var mesh: String = "",
+
     /**
      * linkPid
      */
     @PrimaryKey
     var linkPid: String = "",
+
     /**
      * (几何)加偏后
      */
@@ -31,10 +35,12 @@ open class HadLinkDvoBean @JvmOverloads constructor(
      * 1:源库link,2:选择link 3:现场新增
      */
     var linkStatus: Int = 1,
+
     /**
      * 详细属性
      */
     var linkInfo: LinkInfoBean? = null,
+
     /**
      * 长度(米)
      */

From d3398ae7558135ff866beb8c0e2804fa5ee731cf Mon Sep 17 00:00:00 2001
From: qiji4215 <qiji4215@navinfo.com>
Date: Thu, 26 Oct 2023 14:58:43 +0800
Subject: [PATCH 4/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BD=A8=E8=BF=B9?=
 =?UTF-8?q?=E5=A4=9A=E5=B1=82=E6=98=BE=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../main/java/com/navinfo/omqs/Constant.kt    |  7 ++
 .../omqs/ui/activity/map/MainActivity.kt      |  3 +-
 .../omqs/ui/activity/map/MainViewModel.kt     | 13 +++
 .../personalcenter/PersonalCenterFragment.kt  |  5 +-
 .../ui/fragment/tasklist/TaskViewModel.kt     | 27 ++++--
 .../collect/library/map/NIMapView.java        |  1 +
 .../library/map/handler/MarkHandler.kt        | 94 ++++++++++++++++++-
 7 files changed, 136 insertions(+), 14 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt
index 9ee9f307..5d685185 100644
--- a/app/src/main/java/com/navinfo/omqs/Constant.kt
+++ b/app/src/main/java/com/navinfo/omqs/Constant.kt
@@ -40,6 +40,13 @@ class Constant {
          */
         lateinit var USER_DATA_PATH: String
 
+        /**
+         * 轨迹渲染个数统计
+         */
+        var TRACE_COUNT : Int = 0
+
+        var TRACE_COUNT_TIME : Int = 10
+
         /**
          * 当前安装任务
          */
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 e19683fe..6202bde2 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
@@ -344,7 +344,7 @@ class MainActivity : BaseActivity() {
             }
         }
         viewModel.liveDataAutoLocation.observe(this) {
-            if (it == true) {
+            if (it == true&&Constant.INDOOR_IP==null|| Constant.INDOOR_IP == "") {
                 onClickLocation()
             }
         }
@@ -844,6 +844,7 @@ class MainActivity : BaseActivity() {
      */
     fun setTopMenuButtonVisibility(visibility: Int) {
         binding.mainActivityMenu.visibility = visibility
+        binding.mainActivityStatusCamera.visibility = visibility
         if (visibility != View.VISIBLE) {
             binding.mainActivityMenuGroup.visibility = View.INVISIBLE
             binding.mainActivityMenu.isSelected = false
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 2d628cbf..fb1cecb0 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
@@ -246,6 +246,8 @@ class MainViewModel @Inject constructor(
     // 定义一个互斥锁
     private val naviMutex = Mutex()
 
+    private var traceCount = 0
+
     init {
         mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
             when (e) {
@@ -527,7 +529,14 @@ class MainViewModel @Inject constructor(
         ).niLocationDao.findToTaskIdAll(id.toString())
         if (list != null) {
             for (location in list) {
+                Constant.TRACE_COUNT++
+
                 mapController.markerHandle.addNiLocationMarkerItem(location)
+
+                if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_TIME==0){
+                    mapController.markerHandle.addNiLocationMarkerItemSimple(location)
+                    Log.e("qj","$traceCount===轨迹")
+                }
             }
         }
     }
@@ -592,10 +601,14 @@ class MainViewModel @Inject constructor(
                     }
                     //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米
                     if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) {
+                        traceCount ++
                         Log.e("jingo", "轨迹插入开始")
                         CMLog.writeLogtoFile(MainViewModel::class.java.name,"insertTrace","开始")
                         traceDataBase.niLocationDao.insert(location)
                         mapController.markerHandle.addNiLocationMarkerItem(location)
+                        if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_TIME==0){
+                            mapController.markerHandle.addNiLocationMarkerItemSimple(location)
+                        }
                         mapController.mMapView.vtmMap.updateMap(true)
                         lastNiLocaion = location
                         CMLog.writeLogtoFile(MainViewModel::class.java.name,"insertTrace",gson.toJson(location))
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt
index 6d06c911..d8c9f121 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt
@@ -7,6 +7,7 @@ import android.net.Uri
 import android.os.Build
 import android.os.Bundle
 import android.view.LayoutInflater
+import android.view.MenuItem
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TimePicker
@@ -21,6 +22,7 @@ import com.blankj.utilcode.util.UriUtils
 import com.github.k1rakishou.fsaf.FileChooser
 import com.github.k1rakishou.fsaf.callback.FSAFActivityCallbacks
 import com.github.k1rakishou.fsaf.callback.FileChooserCallback
+import com.google.android.material.internal.NavigationMenuItemView
 import com.google.android.material.timepicker.MaterialTimePicker
 import com.navinfo.collect.library.enums.DataLayerEnum
 import com.navinfo.collect.library.map.NIMapController
@@ -40,6 +42,7 @@ import com.permissionx.guolindev.PermissionX
 import dagger.hilt.android.AndroidEntryPoint
 import org.oscim.core.GeoPoint
 import org.oscim.core.MapPosition
+import org.oscim.utils.MinHeap.Item
 import javax.inject.Inject
 
 /**
@@ -73,7 +76,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
 
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
         super.onViewCreated(view, savedInstanceState)
-        binding.root.setNavigationItemSelectedListener {
+        binding.root.setNavigationItemSelectedListener { it ->
             when (it.itemId) {
                 R.id.personal_center_menu_offline_map ->
                     findNavController().navigate(R.id.OfflineMapFragment)
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
index 97ab87e3..d4849aba 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
@@ -318,6 +318,23 @@ class TaskViewModel @Inject constructor(
 
         liveDataTaskLinks.value = taskBean.hadLinkDvoList
         showTaskLinks(taskBean)
+        //重新加载轨迹
+        viewModelScope.launch(Dispatchers.IO) {
+            Constant.TRACE_COUNT = 0
+            val list: List<NiLocation>? = TraceDataBase.getDatabase(
+                mapController.mMapView.context, Constant.USER_DATA_PATH
+            ).niLocationDao.findToTaskIdAll(taskBean.id.toString())
+            list!!.forEach {
+
+                Constant.TRACE_COUNT ++
+
+                mapController.markerHandle.addNiLocationMarkerItem(it)
+
+                if(Constant.TRACE_COUNT%Constant.TRACE_COUNT_TIME==0){
+                    mapController.markerHandle.addNiLocationMarkerItemSimple(it)
+                }
+            }
+        }
         MapParamUtils.setTaskId(taskBean.id)
         Constant.currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
         Constant.currentSelectTaskConfig =
@@ -365,16 +382,6 @@ class TaskViewModel @Inject constructor(
                 )
             }
         }
-
-        //重新加载轨迹
-        viewModelScope.launch(Dispatchers.IO) {
-            val list: List<NiLocation>? = TraceDataBase.getDatabase(
-                mapController.mMapView.context, Constant.USER_DATA_PATH
-            ).niLocationDao.findToTaskIdAll(taskBean.id.toString())
-            list!!.forEach {
-                mapController.markerHandle.addNiLocationMarkerItem(it)
-            }
-        }
     }
 
     /**
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java
index 423f1e96..a6b6858d 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java
@@ -608,6 +608,7 @@ public final class NIMapView extends RelativeLayout {
         LABEL(4)/*图标,文字图层*/,
         OPERATE_LINE(5)/*操作图层组*/,
         OPERATE_MARKER(6)/*操作图层组*/;
+
         int groupIndex;
 
         LAYER_GROUPS(int groupIndex) {
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 74a48a0c..91d3a010 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
@@ -28,6 +28,8 @@ import org.oscim.backend.canvas.Paint
 import org.oscim.core.GeoPoint
 import org.oscim.layers.marker.*
 import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener
+import org.oscim.layers.tile.vector.VectorTileLayer
+import org.oscim.layers.vector.VectorLayer
 import org.oscim.layers.vector.geometries.*
 import org.oscim.map.Map
 import java.util.*
@@ -53,6 +55,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
      */
     private var traceMarkerEnable = true
 
+
     /**
      * 文字画笔
      */
@@ -187,6 +190,45 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
         layer
     }
 
+    /**
+     * 评测精简数据marker 图层
+     */
+    private val niLocationItemizedLayerSimple: ItemizedLayer by lazy {
+
+        val symbol = MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER)
+        val layerSimple = ItemizedLayer(
+            mapView.vtmMap,
+            symbol,
+        )
+        layerSimple.setOnItemGestureListener(object : OnItemGestureListener<MarkerInterface> {
+            override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean {
+                val tag = mMapView.listenerTagList.last()
+                val listenerList = mMapView.listenerList[tag]
+                if (listenerList != null) {
+                    for (listener in listenerList) {
+/*                        if (listener is OnNiLocationItemListener) {
+                            listener.onNiLocation(
+                                tag,
+                                index,
+                                (niLocationItemizedLayerSimple.itemList[index] as MarkerItem).uid as NiLocation
+                            )
+                            break
+                        }*/
+                    }
+                }
+                return true
+            }
+
+            override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean {
+                return true
+            }
+
+        })
+        addLayer(layerSimple, NIMapView.LAYER_GROUPS.OPERATE_MARKER)
+        layerSimple
+    }
+
+
     /**
      * 评测数据marker 图层
      */
@@ -221,7 +263,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
             }
 
         })
-
+        layer.isEnabled = false
         addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER)
         layer
     }
@@ -291,9 +333,11 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
                     qsRecordItemizedLayer.isEnabled = false
                 }
                 if (traceMarkerEnable) {
-                    niLocationItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12
+                    niLocationItemizedLayer.isEnabled = mapPosition.getZoomLevel() in 17..20
+                    niLocationItemizedLayerSimple.isEnabled = mapPosition.getZoomLevel() in 12..16
                 } else {
                     niLocationItemizedLayer.isEnabled = false
+                    niLocationItemizedLayerSimple.isEnabled = false
                 }
             }
         })
@@ -405,8 +449,10 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
      */
     fun setTraceMarkEnable(enable: Boolean) {
         niLocationItemizedLayer.isEnabled = enable
+        niLocationItemizedLayerSimple.isEnabled = enable
         traceMarkerEnable = enable
         niLocationItemizedLayer.populate()
+        niLocationItemizedLayerSimple.populate()
         mMapView.updateMap(true)
     }
 
@@ -549,6 +595,15 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
         niLocationItemizedLayer.update()
     }
 
+    /**
+     * 添加质检数据marker
+     */
+    fun addNiLocationMarkerItemSimple(niLocation: NiLocation) {
+        var geoMarkerItem = createNILocationBitmap(niLocation)
+        niLocationItemizedLayerSimple.addItem(geoMarkerItem)
+        niLocationItemizedLayerSimple.update()
+    }
+
     private fun createNILocationBitmap(niLocation: NiLocation): MarkerItem {
 
         val direction: Double = niLocation.direction
@@ -813,6 +868,8 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
     fun clearNiLocationLayer() {
         niLocationItemizedLayer.removeAllItems()
         niLocationItemizedLayer.update()
+        niLocationItemizedLayerSimple.removeAllItems()
+        niLocationItemizedLayerSimple.update()
     }
 
     /**
@@ -827,6 +884,18 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
         return niLocationItemizedLayer.itemList.size
     }
 
+    fun getNILocationItemizedLayerSimpleSize(): Int {
+        return niLocationItemizedLayerSimple.itemList.size
+    }
+
+    fun getNILocationSimple(index: Int): NiLocation? {
+        return if (index > -1 && index < getNILocationItemizedLayerSimpleSize()) {
+            ((niLocationItemizedLayerSimple.itemList[index]) as MarkerItem).uid as NiLocation
+        } else {
+            null
+        }
+    }
+
     fun getNILocation(index: Int): NiLocation? {
         return if (index > -1 && index < getNILocationItemizedLayerSize()) {
             ((niLocationItemizedLayer.itemList[index]) as MarkerItem).uid as NiLocation
@@ -855,6 +924,27 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
 
         return -1
     }
+
+    fun getNILocationSimpleIndex(niLocation: NiLocation): Int? {
+
+        var list = niLocationItemizedLayerSimple.itemList
+
+        if (niLocation != null && list.isNotEmpty()) {
+
+            var index = -1
+
+            list.forEach {
+
+                index += 1
+
+                if (((it as MarkerItem).uid as NiLocation).id.equals(niLocation.id)) {
+                    return index
+                }
+            }
+        }
+
+        return -1
+    }
 }
 
 interface OnQsRecordItemClickListener : BaseClickListener {

From b40a9e2ebb61815d78e6d85cc12194b584d01d61 Mon Sep 17 00:00:00 2001
From: qiji4215 <qiji4215@navinfo.com>
Date: Fri, 27 Oct 2023 14:05:59 +0800
Subject: [PATCH 5/5] merge codew

---
 .../com/navinfo/omqs/db/ImportOMDBHelper.kt   | 994 ++++++++----------
 .../com/navinfo/omqs/db/ImportPreProcess.kt   |   7 +-
 .../ui/fragment/tasklist/TaskViewModel.kt     |  71 +-
 vtm                                           |   2 +-
 4 files changed, 516 insertions(+), 558 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
index 4a273c82..11adb7c2 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
@@ -21,6 +21,7 @@ import com.navinfo.omqs.Constant.Companion.installTaskid
 import com.navinfo.omqs.bean.ImportConfig
 import com.navinfo.omqs.db.deep.LinkList
 import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory
+import com.navinfo.omqs.util.CMLog
 import dagger.assisted.Assisted
 import dagger.assisted.AssistedInject
 import io.realm.Realm
@@ -210,623 +211,514 @@ class ImportOMDBHelper @AssistedInject constructor(
 
                     // 遍历解压后的文件,读取该数据返回
 //                    Log.d("ImportOMDBHelper", "表解析===开始时间$dataImportTime===")
-
+                    CMLog.writeLogtoFile(
+                        ImportOMDBHelper::class.java.name,
+                        "importOmdbZipFile",
+                        "开始"
+                    )
                     for (importConfig in importConfigList) {
 
                         for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) {
                             processIndex += 1
-//                            Log.d(
-//                                "ImportOMDBHelper",
-//                                "表解析===开始时间$tableImportTime===${currentEntry.value.table}"
-//                            )
-//                            Log.d(
-//                                "ImportOMDBHelper",
-//                                "表解析===processIndex${processIndex}====${processIndex}/${tableNum}"
-//                            )
-//                            val listResult = mutableListOf<RenderEntity>()
+
                             val currentConfig = currentEntry.value
+
+                            CMLog.writeLogtoFile(
+                                ImportOMDBHelper::class.java.name,
+                                "importOmdbZipFile",
+                                "${currentConfig.table}开始"
+                            )
+
                             val txtFile = unZipFiles.find {
                                 it.name == currentConfig.table
                             }
-                            if (txtFile != null) {
-                                val fileReader = FileReader(txtFile)
-                                val bufferedReader = BufferedReader(fileReader)
-                                var line: String? = bufferedReader.readLine()
-                                while (line != null) {
-                                    if (line == null || line.trim() == "") {
-                                        line = bufferedReader.readLine()
-                                        continue
-                                    }
-                                    elementIndex += 1
-                                    dataIndex += 1
-//                                        Log.d("ImportOMDBHelper", "解析第:${index + 1}行")
-                                    val map = gson.fromJson<Map<String, Any>>(
-                                        line, object : TypeToken<Map<String, Any>>() {}.type
-                                    ).toMutableMap()
-                                    map["qi_table"] = currentConfig.table
-                                    map["qi_name"] = currentConfig.name
-                                    map["qi_code"] =
-                                        if (currentConfig.code == 0) currentConfig.code else currentEntry.key
-                                    map["qi_zoomMin"] = currentConfig.zoomMin
-                                    map["qi_zoomMax"] = currentConfig.zoomMax
+                            Log.e("qj", "开始遍历文件==${currentConfig.table}")
+                            if (txtFile != null && txtFile.exists()) {
+                                try {
 
-                                    // 先查询这个mesh下有没有数据,如果有则跳过即可
-                                    val renderEntity = RenderEntity()
-                                    renderEntity.code = map["qi_code"].toString()
-                                    renderEntity.name = map["qi_name"].toString()
-                                    renderEntity.table = map["qi_table"].toString()
-                                    renderEntity.taskId = task.id
-                                    renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt()
-                                    renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt()
+                                    Log.e("qj", "开始遍历文件1")
+                                    val fileReader = FileReader(txtFile)
+                                    val bufferedReader = BufferedReader(fileReader)
+                                    var line: String? = bufferedReader.readLine()
 
-                                    // 在外层记录当前数据的linkPid
-                                    if (map.containsKey("linkPid")) {
-                                        renderEntity.linkPid =
-                                            map["linkPid"].toString().split(",")[0]
-                                    } else if (map.containsKey("linkList")) {
-                                        val linkList = map["linkList"].toString()
-                                        if (!linkList.isNullOrEmpty() && linkList != "null") {
-                                            val list: List<LinkList> = gson.fromJson(
-                                                linkList,
-                                                object : TypeToken<List<LinkList>>() {}.type
-                                            )
-                                            renderEntity.linkPid = list[0].linkPid
-                                        }
-                                    }
-
-                                    Log.e(
-                                        "jingo",
-                                        "安装数据 ${renderEntity.table} ${renderEntity.linkPid} ${elementIndex} ${insertIndex}"
-                                    )
-                                    renderEntity.geometry = map["geometry"].toString()
-//                                        Log.d("ImportOMDBHelper", "解析===1处理3D")
-                                    // 其他数据插入到Properties中
-                                    /*                                        if (!currentConfig.is3D) { // 如果是非3d要素,则自动将Z轴坐标全部置为0
-                                                                                val coordinates =
-                                                                                    renderEntity.wkt?.coordinates?.map { coordinate ->
-                                                                                        coordinate.z = 0.0
-                                                                                        coordinate
-                                                                                    }?.toTypedArray()
-                                                                                var newGeometry: Geometry? = null
-                                                                                if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POINT) {
-                                                                                    newGeometry = GeometryTools.createPoint(
-                                                                                        coordinates!![0].x,
-                                                                                        coordinates!![0].y
-                                                                                    )
-                                                                                } else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_LINESTRING) {
-                                                                                    newGeometry =
-                                                                                        GeometryTools.createLineString(coordinates)
-                                                                                } else if (renderEntity.wkt?.geometryType == Geometry.TYPENAME_POLYGON) {
-                                                                                    newGeometry =
-                                                                                        GeometryTools.createLineString(coordinates)
-                                                                                }
-                                                                                if (newGeometry != null) {
-                                                                                    renderEntity.geometry = newGeometry.toString()
-                                                                                }
-                                                                            }*/
-//                                        Log.d("ImportOMDBHelper", "解析===2处理3D")
-//                                        Log.d("ImportOMDBHelper", "解析===1处理属性")
-                                    for ((key, value) in map) {
-                                        when (value) {
-                                            is String -> renderEntity.properties[key] = value
-                                            is Int -> renderEntity.properties[key] =
-                                                value.toInt().toString()
-
-                                            is Double -> renderEntity.properties[key] =
-                                                value.toDouble().toString()
-
-                                            else -> renderEntity.properties[key] = value.toString()
-                                        }
-                                    }
-//                                        Log.d("ImportOMDBHelper", "解析===2处理属性")
-//                                        Log.d("ImportOMDBHelper", "解析===1处理name")
-                                    // 如果properties中不包含name,那么自动将要素名称添加进properties中
-                                    if (!renderEntity.properties.containsKey("name")) {
-                                        renderEntity.properties["name"] = renderEntity.name;
-                                    }
-//                                        Log.d("ImportOMDBHelper", "解析===2处理name")
-//                                        Log.d("ImportOMDBHelper", "解析===1处理杆状物")
-
-                                    if (currentConfig.filterData) {
-                                        when (renderEntity.code.toInt()) {
-
-                                            DataCodeEnum.OMDB_POLE.code.toInt() -> {
-                                                //过滤树类型的杆状物,无需导入到数据库中
-                                                val poleType = renderEntity.properties["poleType"]
-                                                if (poleType != null && poleType.toInt() == 2) {
-                                                    line = bufferedReader.readLine()
-                                                    continue
-                                                }
-                                            }
-
-                                            DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> {
-                                                val boundaryType =
-                                                    renderEntity.properties["boundaryType"]
-                                                if (boundaryType != null) {
-                                                    when (boundaryType.toInt()) {
-                                                        0, 1, 6, 8, 9 -> {
-                                                            renderEntity.enable = 0
-//                                                                Log.e(
-//                                                                    "qj",
-//                                                                    "过滤不显示数据${renderEntity.table}"
-//                                                                )
-                                                            line = bufferedReader.readLine()
-                                                            continue
-                                                        }
-                                                    }
-                                                }
-                                            }
-
-                                            DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code.toInt() -> {
-                                                val boundaryType =
-                                                    renderEntity.properties["boundaryType"]
-                                                if (boundaryType != null) {
-                                                    when (boundaryType.toInt()) {
-                                                        0, 1, 3, 4, 5, 7, 9 -> {
-                                                            renderEntity.enable = 0
-//                                                                Log.e(
-//                                                                    "qj",
-//                                                                    "过滤不显示数据${renderEntity.table}"
-//                                                                )
-                                                            line = bufferedReader.readLine()
-                                                            continue
-                                                        }
-                                                    }
-                                                }
-                                            }
-
-                                            DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code.toInt() -> {
-                                                val locationType =
-                                                    renderEntity.properties["locationType"]
-                                                if (locationType != null) {
-                                                    when (locationType.toInt()) {
-                                                        3, 4 -> {
-                                                            renderEntity.enable = 0
-//                                                                Log.e(
-//                                                                    "qj",
-//                                                                    "过滤不显示数据${renderEntity.table}"
-//                                                                )
-                                                            line = bufferedReader.readLine()
-                                                            continue
-                                                        }
-                                                    }
-                                                }
-                                            }
-
-                                            DataCodeEnum.OMDB_RESTRICTION.code.toInt() -> {
-                                                if (renderEntity.properties.containsKey("linkIn") && renderEntity.properties.containsKey(
-                                                        "linkOut"
-                                                    )
-                                                ) {
-                                                    val linkIn = renderEntity.properties["linkIn"]
-                                                    val linkOut = renderEntity.properties["linkOut"]
-                                                    if (linkIn != null && linkOut != null) {
-                                                        val checkMsg = "$linkIn$linkOut"
-                                                        if (resHashMap.containsKey(checkMsg)) {
-//                                                                Log.e(
-//                                                                    "qj",
-//                                                                    "${renderEntity.name}==过滤交限linkin与linkout相同且存在多条数据"
-//                                                                )
-                                                            line = bufferedReader.readLine()
-                                                            continue
-                                                        } else {
-                                                            resHashMap[checkMsg] = renderEntity
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        }
-
-                                    }
-
-//                                        Log.d("ImportOMDBHelper", "解析===2处理杆状物")
-//                                        Log.d("ImportOMDBHelper", "解析===1任务路线匹配")
-
-                                    //遍历判断只显示与任务Link相关的任务数据
-                                    if (currentConfig.checkLinkId) {
-
-                                        if (renderEntity.linkPid.isNotEmpty()) {
-
-                                            val currentLinkPid = renderEntity.linkPid
-
-//                                                Log.d(
-//                                                    "ImportOMDBHelper",
-//                                                    "解析===1任务路线匹配${currentLinkPid}"
-//                                                )
-
-                                            if (!currentLinkPid.isNullOrEmpty() && currentLinkPid != "null") {
-
-                                                val list = currentLinkPid.split(",")
-
-                                                if (list.isNotEmpty()) {
-
-//                                                        Log.d(
-//                                                            "ImportOMDBHelper",
-//                                                            "解析===1任务路线匹配${list.size}"
-//                                                        )
-
-                                                    m@ for (linkPid in list) {
-                                                        if (hashMap.containsKey(linkPid.toLong())) {
-                                                            renderEntity.enable = 1
-//                                                                Log.e(
-//                                                                    "qj",
-//                                                                    "${renderEntity.name}==包括任务link"
-//                                                                )
-                                                            break@m
-                                                        }
-                                                    }
-                                                }
-                                            }
-
-                                            } else if (renderEntity.code.toInt() == DataCodeEnum.OMDB_INTERSECTION.code.toInt()||renderEntity.code.toInt() == DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() && renderEntity.properties.containsKey(
-                                                    "linkList"
-                                                )
-                                            ) {
-
-                                            if (renderEntity.properties["linkList"] != null) {
-
-//                                                    Log.e(
-//                                                        "qj",
-//                                                        "linkList==开始${renderEntity.name}==${renderEntity.properties["linkList"]}}"
-//                                                    )
-
-                                                val linkList = renderEntity.properties["linkList"]
-
-                                                if (!linkList.isNullOrEmpty() && linkList != "null") {
-
-//                                                        Log.e(
-//                                                            "qj",
-//                                                            "linkList==${renderEntity.name}==${renderEntity.properties["linkList"]}}"
-//                                                        )
-
-                                                    val list: List<LinkList> = gson.fromJson(
-                                                        linkList,
-                                                        object : TypeToken<List<LinkList>>() {}.type
-                                                    )
-
-                                                    m@ for (link in list) {
-                                                        if (hashMap.containsKey(link.linkPid.toLong())) {
-                                                            renderEntity.enable = 1
-//                                                                    Log.e(
-//                                                                        "qj",
-//                                                                        "${renderEntity.name}==包括任务link"
-//                                                                    )
-                                                            break@m
-                                                        }
-                                                    }
-                                                }
-                                            }
-                                        } else {
-                                            //不包括linkPid直接过滤
+                                    while (line != null) {
+                                        if (line == null || line.trim() == "") {
                                             line = bufferedReader.readLine()
                                             continue
                                         }
-                                        //过滤掉非任务路线上的数据
-                                        if (renderEntity.enable != 1) {
-//                                                Log.e(
-//                                                    "qj",
-//                                                    "${renderEntity.name}==过滤不包括任务路线上的数据"
-//                                                )
-                                            line = bufferedReader.readLine()
-                                            continue
+                                        elementIndex += 1
+                                        dataIndex += 1
+                                        val map = gson.fromJson<Map<String, Any>>(
+                                            line, object : TypeToken<Map<String, Any>>() {}.type
+                                        ).toMutableMap()
+                                        map["qi_table"] = currentConfig.table
+                                        map["qi_name"] = currentConfig.name
+                                        map["qi_code"] =
+                                            if (currentConfig.code == 0) currentConfig.code else currentEntry.key
+                                        map["qi_zoomMin"] = currentConfig.zoomMin
+                                        map["qi_zoomMax"] = currentConfig.zoomMax
+
+                                        // 先查询这个mesh下有没有数据,如果有则跳过即可
+                                        val renderEntity = RenderEntity()
+                                        renderEntity.code = map["qi_code"].toString()
+                                        renderEntity.name = map["qi_name"].toString()
+                                        renderEntity.table = map["qi_table"].toString()
+                                        renderEntity.taskId = task.id
+                                        renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt()
+                                        renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt()
+
+                                        Log.e(
+                                            "jingo",
+                                            "安装数据 ${renderEntity.table} ${renderEntity.linkPid} $elementIndex $insertIndex"
+                                        )
+
+                                        renderEntity.geometry = map["geometry"].toString()
+                                        Log.e("jingo", "map解析开始")
+                                        for ((key, value) in map) {
+                                            when (value) {
+                                                is String -> renderEntity.properties[key] = value
+                                                is Int -> renderEntity.properties[key] =
+                                                    value.toInt().toString()
+
+                                                is Double -> renderEntity.properties[key] =
+                                                    value.toDouble().toString()
+
+                                                else -> renderEntity.properties[key] =
+                                                    value.toString()
+                                            }
                                         }
 
-                                    } else {
-                                        renderEntity.enable = 1
+                                        // 如果properties中不包含name,那么自动将要素名称添加进properties中
+                                        if (!renderEntity.properties.containsKey("name")) {
+                                            renderEntity.properties["name"] = renderEntity.name;
+                                        }
 
-                                        /*                                            var geometry = GeometryTools.createGeometry(renderEntity.geometry)
-                                                                                                            if(multipLine.intersects(geometry)){
-                                                                                                                renderEntity.enable = 1
-                                                                                                            }else{
-                                                                                                                val dis = multipLine.distance(GeometryTools.createGeometry(renderEntity.geometry))
-                                                                                                                if(dis>36){
-                                                                                                                    continue
-                                                                                                                }else{
-                                                                                                                    renderEntity.enable = 1
-                                                                                                                }
-                                                                                                            }*/
-//                                            Log.e("qj", "${renderEntity.name}==不包括任务linkPid")
-                                    }
-//                                        Log.d("ImportOMDBHelper", "解析===2任务路线匹配")
-//                                        Log.d("ImportOMDBHelper", "解析===1预处理")
+                                        Log.e("jingo", "map解析结束")
 
-                                    if (currentConfig.catch) {
-                                        renderEntity.catchEnable = 1
-                                    } else {
-                                        renderEntity.catchEnable = 0
-                                    }
-
-                                    // 对renderEntity做预处理后再保存
-                                    val resultEntity =
-                                        importConfig.transformProperties(renderEntity, realm)
-//                                        Log.d("ImportOMDBHelper", "解析===2预处理")
-                                    if (resultEntity != null) {
-
-//                                            Log.d("ImportOMDBHelper", "解析===1子code处理")
-                                        //对code编码需要特殊处理 存在多个属性值时,渲染优先级:SA>PA,存在多个属性值时,渲染优先级:FRONTAGE>MAIN_SIDE_A CCESS
-
-                                        if (currentConfig.existSubCode) {
+                                        if (currentConfig.filterData) {
                                             when (renderEntity.code.toInt()) {
-                                                DataCodeEnum.OMDB_LINK_ATTRIBUTE.code.toInt() -> {
 
-//                                                        Log.e("qj", "道路属性===0")
+                                                DataCodeEnum.OMDB_POLE.code.toInt() -> {
+                                                    //过滤树类型的杆状物,无需导入到数据库中
+                                                    val poleType =
+                                                        renderEntity.properties["poleType"]
+                                                    if (poleType != null && poleType.toInt() == 2) {
+                                                        line = bufferedReader.readLine()
+                                                        continue
+                                                    }
+                                                }
 
-                                                    var type = renderEntity.properties["sa"]
-
-                                                    if (type != null && type == "1") {
-                                                        renderEntity.code =
-                                                            DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code
-//                                                            Log.e("qj", "道路属性===1")
-                                                    } else {
-                                                        type = renderEntity.properties["pa"]
-                                                        if (type != null && type == "1") {
-                                                            renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code
-//                                                                Log.e("qj", "道路属性===2")
-                                                        } else {
-                                                            type =
-                                                                renderEntity.properties["frontage"]
-                                                            if (type != null && type == "1") {
-                                                                renderEntity.code =
-                                                                    DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code
-                                                                renderEntity.zoomMin = 15
-                                                                renderEntity.zoomMax = 17
-//                                                                    Log.e("qj", "道路属性===3")
-                                                            } else {
-                                                                type =
-                                                                    renderEntity.properties["mainSideAccess"]
-                                                                if (type != null && type == "1") {
-                                                                    renderEntity.code =
-                                                                        DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code
-                                                                    renderEntity.zoomMin = 15
-                                                                    renderEntity.zoomMax = 17
-//                                                                        Log.e("qj", "道路属性===4")
-                                                                } else {
-                                                                    renderEntity.enable = 0
-                                                                    renderEntity.zoomMin = 15
-                                                                    renderEntity.zoomMax = 17
-//                                                                        Log.e(
-//                                                                            "qj",
-//                                                                            "过滤不显示数据${renderEntity.table}"
-//                                                                        )
-//                                                                        Log.e("qj", "道路属性===5")
-                                                                    line = bufferedReader.readLine()
-                                                                    continue
-                                                                }
+                                                DataCodeEnum.OMDB_LANE_MARK_BOUNDARYTYPE.code.toInt() -> {
+                                                    val boundaryType =
+                                                        renderEntity.properties["boundaryType"]
+                                                    if (boundaryType != null) {
+                                                        when (boundaryType.toInt()) {
+                                                            0, 1, 6, 8, 9 -> {
+                                                                renderEntity.enable = 0
+                                                                line = bufferedReader.readLine()
+                                                                continue
                                                             }
                                                         }
                                                     }
                                                 }
-                                                //桥
-                                                DataCodeEnum.OMDB_BRIDGE.code.toInt() -> {
-                                                    when (renderEntity.properties["bridgeType"]) {
-                                                        "1" -> renderEntity.code =
-                                                            DataCodeEnum.OMDB_BRIDGE_1.code
-                                                        "2" -> renderEntity.code =
-                                                            DataCodeEnum.OMDB_BRIDGE_2.code
-                                                        //                                                            "3" -> renderEntity.code = DataCodeEnum.OMDB_BRIDGE_3.code
-                                                        else -> DataCodeEnum.OMDB_BRIDGE.code
-                                                    }
-                                                }
 
-                                                DataCodeEnum.OMDB_RAMP.code.toInt() -> {
-                                                    /*匝道*/
-                                                    val formWay =
-                                                        renderEntity.properties["formOfWay"]
-                                                    if (formWay != null) {
-                                                        when (formWay.toInt()) {
-                                                            93 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_RAMP_1.code
-
-                                                            98 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_RAMP_2.code
-
-                                                            99 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_RAMP_3.code
-
-                                                            100 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_RAMP_4.code
-
-                                                            102 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_RAMP_5.code
-
-                                                            103 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_RAMP_6.code
-
-                                                            104 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_RAMP_7.code
+                                                DataCodeEnum.OMDB_RDBOUND_BOUNDARYTYPE.code.toInt() -> {
+                                                    val boundaryType =
+                                                        renderEntity.properties["boundaryType"]
+                                                    if (boundaryType != null) {
+                                                        when (boundaryType.toInt()) {
+                                                            0, 1, 3, 4, 5, 7, 9 -> {
+                                                                renderEntity.enable = 0
+                                                                line = bufferedReader.readLine()
+                                                                continue
+                                                            }
                                                         }
                                                     }
                                                 }
 
-                                                DataCodeEnum.OMDB_LINK_FORM1.code.toInt() -> {
-                                                    /*道路形态1*/
-                                                    val formWay =
-                                                        renderEntity.properties["formOfWay"]
-                                                    if (formWay != null) {
-                                                        when (formWay.toInt()) {
-                                                            35 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM1_1.code
-
-                                                            37 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM1_2.code
-
-                                                            38 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM1_3.code
+                                                DataCodeEnum.OMDB_OBJECT_STOPLOCATION.code.toInt() -> {
+                                                    val locationType =
+                                                        renderEntity.properties["locationType"]
+                                                    if (locationType != null) {
+                                                        when (locationType.toInt()) {
+                                                            3, 4 -> {
+                                                                renderEntity.enable = 0
+                                                                line = bufferedReader.readLine()
+                                                                continue
+                                                            }
                                                         }
                                                     }
                                                 }
 
-                                                DataCodeEnum.OMDB_LINK_FORM2.code.toInt() -> {
-//                                                        Log.e(
-//                                                            "qj",
-//                                                            "道路形态2${renderEntity.properties["formOfWay"]}"
-//                                                        )
-                                                    /*道路形态2*/
-                                                    val formWay =
-                                                        renderEntity.properties["formOfWay"]
-                                                    if (formWay != null) {
-                                                        when (formWay.toInt()) {
-                                                            10 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_1.code
+                                                DataCodeEnum.OMDB_RESTRICTION.code.toInt() -> {
+                                                    if (renderEntity.properties.containsKey("linkIn") && renderEntity.properties.containsKey(
+                                                            "linkOut"
+                                                        )
+                                                    ) {
+                                                        val linkIn =
+                                                            renderEntity.properties["linkIn"]
+                                                        val linkOut =
+                                                            renderEntity.properties["linkOut"]
+                                                        if (linkIn != null && linkOut != null) {
+                                                            val checkMsg = "$linkIn$linkOut"
+                                                            if (resHashMap.containsKey(checkMsg)) {
+                                                                line = bufferedReader.readLine()
+                                                                continue
+                                                            } else {
+                                                                resHashMap[checkMsg] = renderEntity
+                                                            }
+                                                        }
+                                                    }
+                                                }
+                                            }
+                                        }
 
-                                                            11 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_2.code
+                                        //遍历判断只显示与任务Link相关的任务数据
+                                        if (currentConfig.checkLinkId) {
 
-                                                            17 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_3.code
+                                            if (renderEntity.linkPid.isNotEmpty()) {
 
-                                                            18 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_4.code
+                                                val currentLinkPid = renderEntity.linkPid
 
-                                                            20 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_5.code
 
-                                                            22 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_6.code
+                                                if (!currentLinkPid.isNullOrEmpty() && currentLinkPid != "null") {
 
-                                                            36 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_7.code
+                                                    val list = currentLinkPid.split(",")
 
-                                                            52 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_8.code
+                                                    if (list.isNotEmpty()) {
 
-                                                            53 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_9.code
-
-                                                            54 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_10.code
-
-                                                            60 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_11.code
-
-                                                            84 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_12.code
-
-                                                            85 -> renderEntity.code =
-                                                                DataCodeEnum.OMDB_LINK_FORM2_13.code
+                                                        m@ for (linkPid in list) {
+                                                            if (hashMap.containsKey(linkPid.toLong())) {
+                                                                renderEntity.enable = 1
+                                                                break@m
+                                                            }
                                                         }
                                                     }
                                                 }
 
-                                                DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() -> {
-                                                    //特殊处理空数据,渲染原则使用
-                                                    val startTime =
-                                                        renderEntity.properties["startTime"]
-                                                    if (startTime == null || startTime == "") {
-                                                        renderEntity.properties["startTime"] =
-                                                            "null"
+                                            } else if (renderEntity.code.toInt() == DataCodeEnum.OMDB_INTERSECTION.code.toInt() || renderEntity.code.toInt() == DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() && renderEntity.properties.containsKey(
+                                                    "linkList"
+                                                )
+                                            ) {
+
+                                                if (renderEntity.properties["linkList"] != null) {
+
+                                                    val linkList =
+                                                        renderEntity.properties["linkList"]
+
+                                                    if (!linkList.isNullOrEmpty() && linkList != "null") {
+
+                                                        val list: List<LinkList> = gson.fromJson(
+                                                            linkList,
+                                                            object :
+                                                                TypeToken<List<LinkList>>() {}.type
+                                                        )
+
+                                                        m@ for (link in list) {
+                                                            if (hashMap.containsKey(link.linkPid.toLong())) {
+                                                                renderEntity.enable = 1
+                                                                break@m
+                                                            }
+                                                        }
+                                                    }
+                                                }
+                                            } else {
+                                                //不包括linkPid直接过滤
+                                                line = bufferedReader.readLine()
+                                                continue
+                                            }
+                                            //过滤掉非任务路线上的数据
+                                            if (renderEntity.enable != 1) {
+                                                line = bufferedReader.readLine()
+                                                continue
+                                            }
+
+                                        } else {
+                                            renderEntity.enable = 1
+                                        }
+
+                                        if (currentConfig.catch) {
+                                            renderEntity.catchEnable = 1
+                                        } else {
+                                            renderEntity.catchEnable = 0
+                                        }
+
+                                        var resultEntity = importConfig.transformProperties(renderEntity, realm)
+
+                                        if (resultEntity != null) {
+
+                                            if (currentConfig.existSubCode) {
+                                                when (renderEntity.code.toInt()) {
+                                                    DataCodeEnum.OMDB_LINK_ATTRIBUTE.code.toInt() -> {
+                                                        var type = renderEntity.properties["sa"]
+
+                                                        if (type != null && type == "1") {
+                                                            renderEntity.code =
+                                                                DataCodeEnum.OMDB_LINK_ATTRIBUTE_SA.code
+                                                        } else {
+                                                            type = renderEntity.properties["pa"]
+                                                            if (type != null && type == "1") {
+                                                                renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_ATTRIBUTE_PA.code
+                                                            } else {
+                                                                type =
+                                                                    renderEntity.properties["frontage"]
+                                                                if (type != null && type == "1") {
+                                                                    renderEntity.code =
+                                                                        DataCodeEnum.OMDB_LINK_ATTRIBUTE_FORNTAGE.code
+                                                                    renderEntity.zoomMin = 15
+                                                                    renderEntity.zoomMax = 17
+                                                                } else {
+                                                                    type =
+                                                                        renderEntity.properties["mainSideAccess"]
+                                                                    if (type != null && type == "1") {
+                                                                        renderEntity.code =
+                                                                            DataCodeEnum.OMDB_LINK_ATTRIBUTE_MAIN_SIDE_ACCESS.code
+                                                                        renderEntity.zoomMin = 15
+                                                                        renderEntity.zoomMax = 17
+                                                                    } else {
+                                                                        renderEntity.enable = 0
+                                                                        renderEntity.zoomMin = 15
+                                                                        renderEntity.zoomMax = 17
+                                                                        line =
+                                                                            bufferedReader.readLine()
+                                                                        continue
+                                                                    }
+                                                                }
+                                                            }
+                                                        }
+                                                    }
+                                                    //桥
+                                                    DataCodeEnum.OMDB_BRIDGE.code.toInt() -> {
+                                                        when (renderEntity.properties["bridgeType"]) {
+                                                            "1" -> renderEntity.code =
+                                                                DataCodeEnum.OMDB_BRIDGE_1.code
+
+                                                            "2" -> renderEntity.code =
+                                                                DataCodeEnum.OMDB_BRIDGE_2.code
+
+                                                            else -> DataCodeEnum.OMDB_BRIDGE.code
+                                                        }
+                                                    }
+
+                                                    DataCodeEnum.OMDB_RAMP.code.toInt() -> {
+                                                        //*匝道*//*
+                                                        val formWay =
+                                                            renderEntity.properties["formOfWay"]
+                                                        if (formWay != null) {
+                                                            when (formWay.toInt()) {
+                                                                93 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_RAMP_1.code
+
+                                                                98 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_RAMP_2.code
+
+                                                                99 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_RAMP_3.code
+
+                                                                100 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_RAMP_4.code
+
+                                                                102 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_RAMP_5.code
+
+                                                                103 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_RAMP_6.code
+
+                                                                104 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_RAMP_7.code
+                                                            }
+                                                        }
+                                                    }
+
+                                                    DataCodeEnum.OMDB_LINK_FORM1.code.toInt() -> {
+                                                        //*道路形态1*//*
+                                                        val formWay =
+                                                            renderEntity.properties["formOfWay"]
+                                                        if (formWay != null) {
+                                                            when (formWay.toInt()) {
+                                                                35 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM1_1.code
+
+                                                                37 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM1_2.code
+
+                                                                38 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM1_3.code
+                                                            }
+                                                        }
+                                                    }
+
+                                                    DataCodeEnum.OMDB_LINK_FORM2.code.toInt() -> {
+                                                        //*道路形态2*//*
+                                                        val formWay =
+                                                            renderEntity.properties["formOfWay"]
+                                                        if (formWay != null) {
+                                                            when (formWay.toInt()) {
+                                                                10 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_1.code
+
+                                                                11 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_2.code
+
+                                                                17 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_3.code
+
+                                                                18 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_4.code
+
+                                                                20 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_5.code
+
+                                                                22 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_6.code
+
+                                                                36 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_7.code
+
+                                                                52 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_8.code
+
+                                                                53 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_9.code
+
+                                                                54 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_10.code
+
+                                                                60 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_11.code
+
+                                                                84 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_12.code
+
+                                                                85 -> renderEntity.code =
+                                                                    DataCodeEnum.OMDB_LINK_FORM2_13.code
+                                                            }
+                                                        }
+                                                    }
+
+                                                    DataCodeEnum.OMDB_LANE_CONSTRUCTION.code.toInt() -> {
+                                                        //特殊处理空数据,渲染原则使用
+                                                        val startTime =
+                                                            renderEntity.properties["startTime"]
+                                                        if (startTime == null || startTime == "") {
+                                                            renderEntity.properties["startTime"] =
+                                                                "null"
+                                                        }
+                                                    }
+                                                }
+
+                                                if (renderEntity.table == DataCodeEnum.OMDB_NODE_FORM.name) {//特殊处理,因为code相同,使用表名判断
+                                                    //过滤不需要渲染的要素
+                                                    val formOfWay =
+                                                        renderEntity.properties["formOfWay"]
+                                                    if (formOfWay != null && formOfWay.toInt() == 30) {
+                                                        renderEntity.enable = 2
+                                                        renderEntity.code =
+                                                            DataCodeEnum.OMDB_NODE_FORM.code
+                                                    } else {
+                                                        line = bufferedReader.readLine()
+                                                        continue
+                                                    }
+                                                } else if (renderEntity.table == DataCodeEnum.OMDB_NODE_PA.name) {//特殊处理,因为code相同,使用表名判断
+                                                    //过滤不需要渲染的要素
+                                                    val attributeType =
+                                                        renderEntity.properties["attributeType"]
+                                                    if (attributeType != null && attributeType.toInt() == 30) {
+                                                        renderEntity.enable = 2
+                                                        renderEntity.code =
+                                                            DataCodeEnum.OMDB_NODE_PA.code
+                                                    } else {
+                                                        line = bufferedReader.readLine()
+                                                        continue
                                                     }
                                                 }
                                             }
 
-                                            if (renderEntity.table == DataCodeEnum.OMDB_NODE_FORM.name) {//特殊处理,因为code相同,使用表名判断
-                                                //过滤不需要渲染的要素
-                                                val formOfWay = renderEntity.properties["formOfWay"]
-                                                if (formOfWay != null && formOfWay.toInt() == 30) {
-                                                    renderEntity.enable = 2
-                                                    renderEntity.code =
-                                                        DataCodeEnum.OMDB_NODE_FORM.code
-                                                } else {
-//                                                        Log.e(
-//                                                            "qj",
-//                                                            "过滤不显示数据${renderEntity.table}"
-//                                                        )
-                                                    line = bufferedReader.readLine()
-                                                    continue
-                                                }
-                                            } else if (renderEntity.table == DataCodeEnum.OMDB_NODE_PA.name) {//特殊处理,因为code相同,使用表名判断
-                                                //过滤不需要渲染的要素
-                                                val attributeType =
-                                                    renderEntity.properties["attributeType"]
-                                                if (attributeType != null && attributeType.toInt() == 30) {
-                                                    renderEntity.enable = 2
-                                                    renderEntity.code =
-                                                        DataCodeEnum.OMDB_NODE_PA.code
-                                                } else {
-//                                                        Log.e(
-//                                                            "qj",
-//                                                            "过滤不显示数据${renderEntity.table}"
-//                                                        )
-                                                    line = bufferedReader.readLine()
-                                                    continue
-                                                }
+                                            ++insertIndex
+
+                                            //移除该字段,减少数据量
+                                            if (renderEntity.properties.containsKey("geometry")) {
+                                                renderEntity.properties.remove("geometry")
                                             }
-                                        }
 
-//                                            Log.d("ImportOMDBHelper", "解析===2子code处理")
-                                        ++insertIndex
-                                        Log.e("qj", "统计==${insertIndex}")
-
-                                        //移除该字段,减少数据量
-                                        if (renderEntity.properties.containsKey("geometry")) {
-                                            renderEntity.properties.remove("geometry")
-                                        }
-
-                                        //移除该字段,减少数据量
-                                        if (renderEntity.properties.containsKey("linkPid")) {
-                                            renderEntity.properties.remove("linkPid")
-                                        }
-
-                                        // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用
-                                        if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) {
-                                            if (renderEntity.linkRelation == null) {
-                                                renderEntity.linkRelation = LinkRelation()
+                                            //移除该字段,减少数据量
+                                            if (renderEntity.properties.containsKey("linkPid")) {
+                                                renderEntity.properties.remove("linkPid")
                                             }
-                                            renderEntity.linkRelation!!.linkPid =
-                                                renderEntity.linkPid
-                                            renderEntity.linkRelation!!.sNodeId =
-                                                renderEntity.properties["snodePid"]
-                                            renderEntity.linkRelation!!.eNodeId =
-                                                renderEntity.properties["enodePid"]
-                                        }
-                                        renderEntity.propertiesDb = StrZipUtil.compress(
-                                            gson.toJson(renderEntity.properties).toString()
-                                        )
 
-                                        listRenderEntity.add(renderEntity)
+                                            // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用
+                                            if (currentConfig.code == DataCodeEnum.OMDB_RD_LINK.code.toInt()) {
+                                                if (renderEntity.linkRelation == null) {
+                                                    renderEntity.linkRelation = LinkRelation()
+                                                }
+                                                renderEntity.linkRelation!!.linkPid =
+                                                    renderEntity.linkPid
+                                                renderEntity.linkRelation!!.sNodeId =
+                                                    renderEntity.properties["snodePid"]
+                                                renderEntity.linkRelation!!.eNodeId =
+                                                    renderEntity.properties["enodePid"]
+                                            }
+
+                                            //去掉暂用控件较大的字段多余属性字段
+                                            if (renderEntity.properties.containsKey("shapeList")) {
+                                                renderEntity.properties.remove("shapeList")
+                                            }
+
+                                            var gsonStr = gson.toJson(renderEntity.properties).toString()
+                                            renderEntity.propertiesDb = StrZipUtil.compress(gsonStr)
+
+                                            listRenderEntity.add(renderEntity)
+                                        }
+
+                                        if (listRenderEntity.size > 50000) {
+                                            Log.e("jingo", "50000刷新")
+                                            realm.copyToRealmOrUpdate(listRenderEntity)
+                                            realm.commitTransaction()
+                                            realm.close()
+                                            listRenderEntity.clear()
+                                            insertIndex = 0
+                                            realm = Realm.getInstance(currentInstallTaskConfig)
+                                            realm.beginTransaction()
+                                        }
+                                        line = bufferedReader.readLine()
                                     }
 
-
-                                    if (listRenderEntity.size > 10000) {
-                                        Log.e(
-                                            "jingo", "10000刷新"
-                                        )
-                                        realm.copyToRealm(listRenderEntity)
-                                        realm.commitTransaction()
-                                        realm.close()
-                                        listRenderEntity.clear()
-                                        insertIndex = 0
-//                                        Realm.compactRealm(currentInstallTaskConfig)
-                                        realm = Realm.getInstance(currentInstallTaskConfig)
-                                        realm.beginTransaction()
-                                    }
-                                    line = bufferedReader.readLine()
+                                    bufferedReader.close()
+                                } catch (e: Exception) {
+                                    CMLog.writeLogtoFile(
+                                        ImportOMDBHelper::class.java.name,
+                                        "importOmdbZipFile",
+                                        "${currentConfig.table}安装异常"
+                                    )
                                 }
-                                bufferedReader.close()
+                            } else {
+                                CMLog.writeLogtoFile(
+                                    ImportOMDBHelper::class.java.name,
+                                    "importOmdbZipFile",
+                                    "文件不存在"
+                                )
                             }
                             // 1个文件发送一次flow流
                             emit("${processIndex}/${tableNum}")
-//                            Log.d("ImportOMDBHelper", "表解析===2${currentConfig.table}")
-//                            Log.d(
-//                                "ImportOMDBHelper",
-//                                "表解析===结束用时时间${(System.currentTimeMillis() - tableImportTime)}===${currentEntry.value.table}===$elementIndex"
-//                            )
+                            CMLog.writeLogtoFile(
+                                ImportOMDBHelper::class.java.name,
+                                "importOmdbZipFile",
+                                "${currentConfig.table}结束==$elementIndex"
+                            )
                             elementIndex = 0
-//                            tableImportTime = System.currentTimeMillis()
-
                         }
                     }
+                    CMLog.writeLogtoFile(
+                        ImportOMDBHelper::class.java.name,
+                        "importOmdbZipFile",
+                        "结束===总量$dataIndex"
+                    )
 
-                    realm.copyToRealm(listRenderEntity)
+                    realm.copyToRealmOrUpdate(listRenderEntity)
                     realm.commitTransaction()
-
                     realm.close()
                     listRenderEntity.clear()
-//                    Log.d(
-//                        "ImportOMDBHelper",
-//                        "表解析===结束用时时间${(System.currentTimeMillis() - dataImportTime)}===$dataIndex===插入$insertIndex"
-//                    )
                     Log.e("qj", "安装结束")
                 } catch (e: Exception) {
                     if (realm.isInTransaction) {
diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
index 871db6ee..c71508c0 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -740,9 +740,11 @@ class ImportPreProcess {
        // angleReference.renderEntityId = renderEntity.id
         angleReference.name = "${renderEntity.name}车道中线面"
         angleReference.table = renderEntity.table
+        Log.e("jingo", "几何转换开始")
         angleReference.geometry =
-            GeometryTools.createGeometry(renderEntity.geometry).buffer(0.000035)
+            GeometryTools.createGeometry(renderEntity.geometry).buffer(0.000010)
                 .toString()//GeometryTools.computeLine(0.000035,0.000035,renderEntity.geometry)
+        Log.e("jingo", "几何转换结束")
         angleReference.properties["qi_table"] = renderEntity.table
         angleReference.properties["widthProperties"] = "3"
         angleReference.zoomMin = renderEntity.zoomMin
@@ -750,9 +752,6 @@ class ImportPreProcess {
         angleReference.taskId = renderEntity.taskId
         angleReference.enable = renderEntity.enable
         val listResult = mutableListOf<ReferenceEntity>()
-        angleReference.propertiesDb = StrZipUtil.compress(
-            gson.toJson(angleReference.properties).toString()
-        )
         listResult.add(angleReference)
         insertData(listResult)
     }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
index 67fac786..9e17469e 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt
@@ -473,6 +473,71 @@ class TaskViewModel @Inject constructor(
         }
     }
 
+    /**
+     * 重新下载数据任务
+     */
+    fun resetDownload(context: Context, taskBean: TaskBean) {
+        val mDialog = FirstDialog(context)
+        mDialog.setTitle("提示?")
+        mDialog.setMessage("是否重置下载状态,请确认!")
+        mDialog.setPositiveButton(
+            "确定"
+        ) { dialog, _ ->
+            dialog.dismiss()
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_BEGIN)
+            viewModelScope.launch(Dispatchers.IO) {
+                //删除已下载的数据
+                val fileTemp =
+                    File("${Constant.DOWNLOAD_PATH}${taskBean.evaluationTaskName}_${taskBean.dataVersion}.zip")
+                if (fileTemp.exists()) {
+                    fileTemp.delete()
+                }
+                val taskFileTemp = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
+                //重命名
+                if (taskFileTemp.exists()) {
+                    /*                    var currentSelectTaskFolder = File(Constant.USER_DATA_PATH + "/${taskBean.id}")
+                                        var currentSelectTaskConfig =
+                                            RealmConfiguration.Builder().directory(currentSelectTaskFolder)
+                                                .name("OMQS.realm").encryptionKey(Constant.PASSWORD)
+                                                .allowQueriesOnUiThread(true)
+                                                .schemaVersion(2).build()
+                                        Realm.getInstance(currentSelectTaskConfig).executeTransaction { r ->
+                                            //删除已有所有数据
+                                            r.delete(RenderEntity::class.java)
+                                            r.delete(ReferenceEntity::class.java)
+                                        }
+                                        Realm.getInstance(currentSelectTaskConfig).close()*/
+                }
+                //将下载状态修改已下载
+                val realm = realmOperateHelper.getRealmDefaultInstance()
+                taskBean.syncStatus = FileManager.Companion.FileUploadStatus.NONE
+                taskBean.status = FileManager.Companion.FileDownloadStatus.NONE
+                realm.beginTransaction()
+                realm.copyToRealmOrUpdate(taskBean)
+                realm.commitTransaction()
+                realm.close()
+                liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_SUCCESS)
+                withContext(Dispatchers.Main) {
+                    if (taskBean.id == currentSelectTaskBean?.id ?: 0) {
+                        mapController.layerManagerHandler.updateOMDBVectorTileLayer()
+                    } else {
+                        setSelectTaskBean(taskBean)
+                    }
+                    realmOperateHelper.getRealmDefaultInstance().refresh()
+                    //重新加载数据
+                    getLocalTaskList()
+                }
+            }
+        }
+        mDialog.setNegativeButton(
+            "取消"
+        ) { _, _ ->
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_CANCEL)
+            mDialog.dismiss()
+        }
+        mDialog.show()
+    }
+
     /**
      * 关闭任务
      */
@@ -484,7 +549,9 @@ class TaskViewModel @Inject constructor(
             "确定"
         ) { dialog, _ ->
             dialog.dismiss()
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_BEGIN)
             viewModelScope.launch(Dispatchers.IO) {
+                liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_LOADING)
                 val realm = realmOperateHelper.getRealmDefaultInstance()
                 realm.executeTransaction {
                     val objects =
@@ -518,14 +585,14 @@ class TaskViewModel @Inject constructor(
                     FileManager.checkOMDBFileInfo(item)
                 }
                 liveDataTaskList.postValue(taskList)
-                liveDataCloseTask.postValue(true)
+                liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_SUCCESS)
                 realm.close()
             }
         }
         mDialog.setNegativeButton(
             "取消"
         ) { _, _ ->
-            liveDataCloseTask.postValue(false)
+            liveDataCloseTask.postValue(TaskDelStatus.TASK_DEL_STATUS_CANCEL)
             mDialog.dismiss()
         }
         mDialog.show()
diff --git a/vtm b/vtm
index c046e788..9e0cc6dc 160000
--- a/vtm
+++ b/vtm
@@ -1 +1 @@
-Subproject commit c046e788f5c739612a31c308639fca2de639669a
+Subproject commit 9e0cc6dcdce04d1082ed6459e8810d6329e8cfdc