From 5defa32f03f47647a81234db7320ff845ff48eaf Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Wed, 26 Apr 2023 10:53:38 +0800
Subject: [PATCH 1/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=AF=BC=E5=85=A5?=
 =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/build.gradle                                              | 2 +-
 .../java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt    | 4 +++-
 collect-library/{ => src/main/res}/resources/rendertheme.xsd  | 0
 3 files changed, 4 insertions(+), 2 deletions(-)
 rename collect-library/{ => src/main/res}/resources/rendertheme.xsd (100%)

diff --git a/app/build.gradle b/app/build.gradle
index 525a541d..f8b483bb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -33,7 +33,7 @@ android {
 
     signingConfigs {
         debug {
-            storeFile file('D:/WrokSpace/OneMapQS/fastmap.keystore')
+            storeFile file('../fastmap.keystore')
             storePassword "navinfo"
             keyAlias "fastmap"
             keyPassword "navinfo"
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 92fa6dd0..8d4f0a39 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
@@ -123,7 +123,9 @@ class MainViewModel @Inject constructor(
                             context,
                             Constant.USER_DATA_PATH + "/trace.sqlite"
                         ).niLocationDao.insert(niLocation)
-                        niLocationList.removeAt(0)
+                        if (niLocationList.isNotEmpty()) {
+                            niLocationList.removeAt(0)
+                        }
                         Log.e("qj", "saveTrace")
                     }
                     Thread.sleep(30)
diff --git a/collect-library/resources/rendertheme.xsd b/collect-library/src/main/res/resources/rendertheme.xsd
similarity index 100%
rename from collect-library/resources/rendertheme.xsd
rename to collect-library/src/main/res/resources/rendertheme.xsd

From c4812eada4c0a46eb3884cbccd7c0db9b6eeb181 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Wed, 26 Apr 2023 11:32:30 +0800
Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9ManiFest=E6=96=87?=
 =?UTF-8?q?=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/src/main/AndroidManifest.xml             | 1 +
 collect-library/src/main/AndroidManifest.xml | 1 +
 2 files changed, 2 insertions(+)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ee25edab..39d3b5bc 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -58,6 +58,7 @@
             android:name=".ui.activity.map.MainActivity"
             android:launchMode="singleTask"
             android:screenOrientation="landscape"
+            android:exported="false"
             android:theme="@style/Theme.OMQualityInspection" />
 
         <meta-data
diff --git a/collect-library/src/main/AndroidManifest.xml b/collect-library/src/main/AndroidManifest.xml
index 0cc633b5..2ffd93be 100644
--- a/collect-library/src/main/AndroidManifest.xml
+++ b/collect-library/src/main/AndroidManifest.xml
@@ -24,6 +24,7 @@
 
         <service
             android:name="com.baidu.location.f"
+            android:exported="true"
             android:enabled="true"
             android:process=":remote">
             <intent-filter>

From c4ee38d70313fb928bbb7d312bc85e45207476b1 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Thu, 27 Apr 2023 10:18:11 +0800
Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E9=81=93=E8=B7=AF?=
 =?UTF-8?q?=E9=9D=A2=E7=9A=84=E6=B8=B2=E6=9F=93?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/build.gradle                              |  4 +-
 .../com/navinfo/omqs/bean/HadLinkDvoBean.kt   |  1 -
 .../java/com/navinfo/omqs/bean/TaskBean.kt    |  1 -
 .../com/navinfo/omqs/db/ImportOMDBHelper.kt   | 14 ++---
 .../omqs/ui/activity/map/MainViewModel.kt     |  4 +-
 .../personalcenter/PersonalCenterFragment.kt  |  2 +-
 .../src/main/assets/editormarker.xml          | 55 +++++++++++++++++--
 .../library/data/entity/RenderEntity.kt       |  5 +-
 8 files changed, 63 insertions(+), 23 deletions(-)

diff --git a/app/build.gradle b/app/build.gradle
index 35154f67..ca7aa1cc 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -12,8 +12,8 @@ android {
 
     defaultConfig {
         applicationId "com.navinfo.omqs"
-        minSdk 26
-        targetSdk 32
+        minSdk 21
+        targetSdk 21
         versionCode 1
         versionName "1.0"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
diff --git a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt b/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt
index 110307dc..28373667 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt
@@ -3,7 +3,6 @@ package com.navinfo.omqs.bean
 import io.realm.RealmObject
 import io.realm.annotations.RealmClass
 
-@RealmClass
 open class HadLinkDvoBean @JvmOverloads constructor(
     /**
      * 图幅号
diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
index 86265253..ce2ff849 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
@@ -9,7 +9,6 @@ import io.realm.annotations.Ignore
 import io.realm.annotations.PrimaryKey
 import io.realm.annotations.RealmClass
 
-@RealmClass
 open class TaskBean @JvmOverloads constructor(
     /**
      * 测评任务id
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 0e287e21..55f7e545 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
@@ -136,13 +136,13 @@ class ImportOMDBHelper @AssistedInject constructor(
                     it.name == currentConfig.table
                 }
 
-                val listResult = mutableListOf<Map<String, Any?>>()
+                val listResult = mutableListOf<Map<String, Any>>()
                 currentConfig?.let {
                     val list = FileIOUtils.readFile2List(txtFile, "UTF-8")
                     if (list != null) {
                         // 将list数据转换为map
                         for (line in list) {
-                            val map = gson.fromJson<Map<String, Any?>>(line, object:TypeToken<Map<String, Any?>>(){}.getType())
+                            val map = gson.fromJson<Map<String, Any>>(line, object:TypeToken<Map<String, Any>>(){}.getType())
                                 .toMutableMap()
                             map["qi_table"] = currentConfig.table
                             map["qi_name"] = currentConfig.name
@@ -162,13 +162,13 @@ class ImportOMDBHelper @AssistedInject constructor(
                     renderEntity.geometry = map["geometry"].toString()
                     for ((key, value) in map) {
                         when (value) {
-                            is String -> renderEntity.properties[key.toString()] = value
-                            is Int -> renderEntity.properties[key.toString()] = value.toInt().toString()
-                            is Double -> renderEntity.properties[key.toString()] = value.toDouble().toString()
-                            else -> renderEntity.properties[key.toString()] = value.toString()
+                            is String -> renderEntity.properties.put(key, value)
+                            is Int -> renderEntity.properties.put(key, value.toInt().toString())
+                            is Double -> renderEntity.properties.put(key, value.toDouble().toString())
+                            else -> renderEntity.properties.put(key, value.toString())
                         }
                     }
-                    Realm.getDefaultInstance().insert(renderEntity)
+                    Realm.getDefaultInstance().copyToRealm(renderEntity)
                 }
                 // 1个文件发送一次flow流
                 emit("${index + 1}/${importConfig.tables.size}")
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 28dde80d..6e8895ca 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
@@ -120,9 +120,7 @@ class MainViewModel @Inject constructor(
                         }
 
                         TraceDataBase.getDatabase(context, Constant.USER_DATA_PATH + "/trace.sqlite").niLocationDao.insert(niLocation)
-                        if (niLocationList.isNotEmpty()) {
-                            niLocationList.remove(niLocation)
-                        }
+                        niLocationList.remove(niLocation)
 
                         Log.e("qj", "saveTrace==${niLocationList.size}")
                     }
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 0365731f..a068562b 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
@@ -106,7 +106,7 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks {
                 R.id.personal_center_menu_test -> {
                     viewModel.readRealmData()
                     // 定位到指定位置
-                    niMapController.mMapView.vtmMap.animator().animateTo(GeoPoint(30.270367985798032, 113.83513667119433))
+                    niMapController.mMapView.vtmMap.animator().animateTo(GeoPoint(30.226256855699773, 113.84660523913344))
                 }
                 R.id.personal_center_menu_task_list -> {
                     findNavController().navigate(R.id.TaskListFragment)
diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml
index 81dba275..4e45ee2a 100644
--- a/collect-library/src/main/assets/editormarker.xml
+++ b/collect-library/src/main/assets/editormarker.xml
@@ -52,7 +52,7 @@
     <style-text style="bold" fill="#606060" id="ferry" k="name" size="12" stroke="#ffffff"
         stroke-width="2.0" />
     <!--speedlimit-->
-    <style-text fill="#ffffff" id="max-speed-limit" k="name" size="15" stroke="#ffffff"
+    <style-text fill="#ffffff" id="max-speed-limit" k="name" size="14" stroke="#ffffff"
         stroke-width="0.1" />
 
 
@@ -1618,18 +1618,18 @@
         <m v="OMDB_SPEEDLIMIT">
             <m k="speedFlag">
                 <m v="0">
-                    <circle fill="#0000ff" radius="26" scale-radius="true" stroke="#ff0000" stroke-width="2"/>
+                    <circle fill="#0000ff" radius="28" scale-radius="true" stroke="#ff0000" stroke-width="2"/>
                     <m select="any">
                         <text k="maxSpeed" use="max-speed-limit"></text>
-                        <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="15" stroke="#ffffff"
+                        <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="14" stroke="#ffffff"
                             stroke-width="1.0"></caption>
                     </m>
                 </m>
                 <m v="1">
-                    <circle fill="#0000ff" radius="26" scale-radius="true" stroke="#ff0000" stroke-width="2"/>
+                    <circle fill="#0000ff" radius="28" scale-radius="true" stroke="#ff0000" stroke-width="2"/>
                     <m select="any">
                         <text k="maxSpeed" use="max-speed-limit"></text>
-                        <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="15" stroke="#ffffff"
+                        <caption k="minSpeed" dy="-28" fill="#000000" priority="5" size="14" stroke="#ffffff"
                             stroke-width="1.0"></caption>
                     </m>
                 </m>
@@ -1641,5 +1641,50 @@
         <!--可变点限速-->
         <m v="OMDB_SPEEDLIMIT_VAR">
         </m>
+        <!--车道数-->
+        <m v="OMDB_LANE_NUM">
+            <m k="laneNum">
+                <m v="1">
+                    <line stroke="#545D6C" width="3"/>
+                </m>
+                <m v="2">
+                    <line stroke="#545D6C" width="6"/>
+                </m>
+                <m v="3">
+                    <line stroke="#545D6C" width="9"/>
+                </m>
+                <m v="4">
+                    <line stroke="#545D6C" width="12"/>
+                </m>
+                <m v="5">
+                    <line stroke="#545D6C" width="15"/>
+                </m>
+                <m v="6">
+                    <line stroke="#545D6C" width="18"/>
+                </m>
+                <m v="7">
+                    <line stroke="#545D6C" width="21"/>
+                </m>
+                <m v="8">
+                    <line stroke="#545D6C" width="24"/>
+                </m>
+                <m v="9">
+                    <line stroke="#545D6C" width="27"/>
+                </m>
+                <m v="10">
+                    <line stroke="#545D6C" width="30"/>
+                </m>
+                <m v="11">
+                    <line stroke="#545D6C" width="33"/>
+                </m>
+                <m v="12">
+                    <line stroke="#545D6C" width="36"/>
+                </m>
+            </m>
+        </m>
+        <!--车道中心线-->
+        <m v="OMDB_LANE_LG_LINK">
+            <line stroke="#ecf0f1" width="0.1" dasharray="35,35"/>
+        </m>
     </m>
 </rendertheme>
\ No newline at end of file
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt
index 3f7f0df0..b9d3e94e 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt
@@ -41,12 +41,11 @@ open class RenderEntity(): RealmObject() {
         }
     @Ignore
     var wkt: Geometry? = null
-    var properties: RealmDictionary<String?> = RealmDictionary()
+    var properties: RealmDictionary<String> = RealmDictionary()
     var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码
     var tileY: RealmSet<Int> = RealmSet()  // y方向的tile编码
 
-    constructor(name: String, properties: RealmDictionary<String?>): this() {
+    constructor(name: String): this() {
         this.name = name
-        this.properties = properties
     }
 }
\ No newline at end of file

From b0289752219d3facb199ed18682963cf37f86017 Mon Sep 17 00:00:00 2001
From: squallzhjch <zhangjingchao@navinfo.com>
Date: Thu, 27 Apr 2023 15:01:57 +0800
Subject: [PATCH 4/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=AB=98=E4=BA=AE?=
 =?UTF-8?q?=E5=9B=BE=E5=B1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/navinfo/omqs/bean/TaskBean.kt    |  2 +-
 .../com/navinfo/omqs/db/RealmOperateHelper.kt | 99 +++++++++++++++----
 .../EvaluationResultFragment.kt               |  2 +-
 .../EvaluationResultViewModel.kt              | 67 +++++++++----
 .../library/data/entity/RenderEntity.kt       | 28 +++++-
 .../map/handler/LayerManagerHandler.kt        | 36 +------
 .../library/map/handler/LineHandler.kt        | 85 ++++++++--------
 .../map/handler/LocationLayerHandler.kt       |  1 +
 8 files changed, 201 insertions(+), 119 deletions(-)

diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
index a036cabf..cd3ab3ac 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
@@ -68,6 +68,6 @@ open class TaskBean @JvmOverloads constructor(
     var message: String = ""
 ) : RealmObject() {
     fun getDownLoadUrl(): String {
-        return "${Constant.SERVER_ADDRESS}devcp/download?fileStr=26"
+        return "${Constant.SERVER_ADDRESS}devcp/download?fileStr=$id"
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
index a00873d3..56ea0bd8 100644
--- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
@@ -1,7 +1,10 @@
 package com.navinfo.omqs.db
 
+import android.os.Build
 import android.util.Log
+import androidx.annotation.RequiresApi
 import com.navinfo.collect.library.data.entity.RenderEntity
+import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
 import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.GeometryToolsKt
@@ -17,10 +20,11 @@ import org.oscim.core.MercatorProjection
 import javax.inject.Inject
 import kotlin.streams.toList
 
-
+@RequiresApi(Build.VERSION_CODES.N)
 class RealmOperateHelper() {
     @Inject
     lateinit var niMapController: NIMapController
+
     /**
      * 根据当前点位查询匹配的Link数据
      * @param point 点位经纬度信息
@@ -28,7 +32,12 @@ class RealmOperateHelper() {
      * @param bufferType 点位外扩距离的单位: 米-Meter,像素-PIXEL
      * @param sort 是否需要排序
      * */
-    suspend fun queryLink(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, sort: Boolean = false): MutableList<RenderEntity> {
+    suspend fun queryLink(
+        point: Point,
+        buffer: Double = DEFAULT_BUFFER,
+        bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE,
+        sort: Boolean = true
+    ): MutableList<RenderEntity> {
         val result = mutableListOf<RenderEntity>()
         withContext(Dispatchers.IO) {
             val polygon = getPolygonFromPoint(point, buffer, bufferType)
@@ -45,25 +54,49 @@ class RealmOperateHelper() {
             val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null)
             val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null)
             // 查询realm中对应tile号的数据
-            val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java)
+            val realm = Realm.getDefaultInstance()
+            val realmList = realm.where(RenderEntity::class.java)
                 .equalTo("table", "OMDB_RD_LINK")
                 .and()
                 .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd")
                 .findAll()
             // 将获取到的数据和查询的polygon做相交,只返回相交的数据
-            val queryResult = realmList?.stream()?.filter {
+            val dataList = realm.copyFromRealm(realmList)
+            val queryResult = dataList?.stream()?.filter {
                 polygon.intersects(it.wkt)
             }?.toList()
+
             queryResult?.let {
-                result.addAll(queryResult)
-            }
-            if (sort) {
-                result.clear()
-                result.addAll(sortRenderEntity(point, result))
+                if (sort) {
+                    result.addAll(sortRenderEntity(point, it))
+                } else {
+                    result.addAll(it)
+                }
             }
+
         }
         return result
     }
+
+
+    suspend fun queryLink(
+        linkPid: String,
+    ): RenderEntity? {
+        var link: RenderEntity? = null
+        withContext(Dispatchers.IO) {
+            val realm = Realm.getDefaultInstance()
+            val realmR = realm.where(RenderEntity::class.java)
+                .equalTo("table", "OMDB_RD_LINK")
+                .and()
+                .rawPredicate("properties['${LinkTable.linkPid}']=$linkPid")
+                .findFirst()
+            if (realmR != null) {
+                link = realm.copyFromRealm(realmR)
+            }
+        }
+        return link
+    }
+
     /**
      * 根据当前点位查询匹配的除Link外的其他要素数据
      * @param point 点位经纬度信息
@@ -71,7 +104,12 @@ class RealmOperateHelper() {
      * @param bufferType 点位外扩距离的单位: 米-Meter,像素-PIXEL
      * @param sort 是否需要排序
      * */
-    suspend fun queryElement(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, sort: Boolean = false): MutableList<RenderEntity> {
+    suspend fun queryElement(
+        point: Point,
+        buffer: Double = DEFAULT_BUFFER,
+        bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE,
+        sort: Boolean = true
+    ): MutableList<RenderEntity> {
         val result = mutableListOf<RenderEntity>()
         withContext(Dispatchers.IO) {
             val polygon = getPolygonFromPoint(point, buffer, bufferType)
@@ -121,7 +159,7 @@ class RealmOperateHelper() {
             val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java)
                 .notEqualTo("table", "OMDB_RD_LINK")
                 .and()
-                .equalTo("properties['LINK_PID']", linkPid)
+                .equalTo("properties['${LinkTable.linkPid}']", linkPid)
                 .findAll()
             result.addAll(realmList)
         }
@@ -134,15 +172,19 @@ class RealmOperateHelper() {
      * @param unSortList 未排序的数据
      * @return 排序后的数据
      * */
-    fun sortRenderEntity(point: Point, unSortList: MutableList<RenderEntity>): List<RenderEntity> {
+    fun sortRenderEntity(point: Point, unSortList: List<RenderEntity>): List<RenderEntity> {
         val sortList = unSortList.stream().sorted { renderEntity, renderEntity2 ->
             val near = point.distance(renderEntity.wkt) - point.distance(renderEntity2.wkt)
-            if (near<0) -1 else 1
+            if (near < 0) -1 else 1
         }.toList()
         return sortList
     }
 
-    private fun getPolygonFromPoint(point: Point, buffer: Double = DEFAULT_BUFFER, bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE): Polygon {
+    private fun getPolygonFromPoint(
+        point: Point,
+        buffer: Double = DEFAULT_BUFFER,
+        bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE
+    ): Polygon {
         // 首先计算当前点位的buffer组成的geometry
         val wkt: Polygon = if (bufferType == BUFFER_TYPE.METER) { // 如果单位是米
             val distanceDegrees = GeometryTools.convertDistanceToDegree(buffer, point.y)
@@ -151,14 +193,30 @@ class RealmOperateHelper() {
         } else { // 如果单位是像素,需要根据当前屏幕像素计算出经纬度变化
             val currentMapScale = niMapController.mMapView.vtmMap.mapPosition.scale
             // 转换为屏幕坐标
-            val pixelPoint = MercatorProjection.getPixelWithScale(GeoPoint(point.y, point.x), currentMapScale)
+            val pixelPoint =
+                MercatorProjection.getPixelWithScale(
+                    GeoPoint(point.y, point.x),
+                    currentMapScale
+                )
             // 将屏幕坐标外扩指定距离
             // 计算外扩矩形
             val envelope = Envelope(
-                MercatorProjection.pixelXToLongitudeWithScale(pixelPoint.x - buffer, currentMapScale),
-                MercatorProjection.pixelXToLongitudeWithScale(pixelPoint.x + buffer, currentMapScale),
-                MercatorProjection.pixelYToLatitudeWithScale(pixelPoint.y - buffer, currentMapScale),
-                MercatorProjection.pixelYToLatitudeWithScale(pixelPoint.y + buffer, currentMapScale),
+                MercatorProjection.pixelXToLongitudeWithScale(
+                    pixelPoint.x - buffer,
+                    currentMapScale
+                ),
+                MercatorProjection.pixelXToLongitudeWithScale(
+                    pixelPoint.x + buffer,
+                    currentMapScale
+                ),
+                MercatorProjection.pixelYToLatitudeWithScale(
+                    pixelPoint.y - buffer,
+                    currentMapScale
+                ),
+                MercatorProjection.pixelYToLatitudeWithScale(
+                    pixelPoint.y + buffer,
+                    currentMapScale
+                ),
             )
             // 将Envelope对象转换为Polygon对象
             val geometryFactory = GeometryFactory()
@@ -178,7 +236,8 @@ class RealmOperateHelper() {
 
 enum class BUFFER_TYPE(val index: Int) {
     METER(0)/*米*/, PIXEL(1)/*像素*/;
-    fun getBufferTypeByIndex(index: Int): BUFFER_TYPE{
+
+    fun getBufferTypeByIndex(index: Int): BUFFER_TYPE {
         for (item in BUFFER_TYPE.values()) {
             if (item.index == index) {
                 return item;
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt
index 65ca7324..f99ceed1 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt
@@ -59,7 +59,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
         if (arguments != null) {
             val id = requireArguments().getString("QsId")
             if (id != null) {
-                viewModel.loadData(id)
+                viewModel.initData(id)
             } else {
                 viewModel.initNewData()
             }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
index f1914053..e059f3e5 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
@@ -1,10 +1,14 @@
 package com.navinfo.omqs.ui.fragment.evaluationresult
 
+import android.os.Build
 import android.util.Log
+import androidx.annotation.RequiresApi
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.navinfo.collect.library.data.entity.QsRecordBean
+import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
+import com.navinfo.collect.library.map.GeoPoint
 import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.omqs.db.RealmOperateHelper
@@ -14,10 +18,10 @@ import io.realm.Realm
 import io.realm.kotlin.where
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
-import org.locationtech.jts.geom.Point
 import java.util.*
 import javax.inject.Inject
 
+@RequiresApi(Build.VERSION_CODES.N)
 @HiltViewModel
 class EvaluationResultViewModel @Inject constructor(
     private val roomAppDatabase: RoomAppDatabase,
@@ -60,15 +64,7 @@ class EvaluationResultViewModel @Inject constructor(
                 liveDataQsRecordBean.value!!.geometry = it.toGeometry()
                 addMarker(it, markerTitle)
                 viewModelScope.launch {
-                    val linkList = realmOperateHelper.queryLink(
-                        point = GeometryTools.createPoint(
-                            it.longitude,
-                            it.latitude
-                        ), sort = true
-                    )
-                    if (linkList.isNotEmpty()) {
-                        liveDataQsRecordBean.value!!.linkId = linkList[0].id
-                    }
+                    captureLink(it.longitude, it.latitude)
                 }
             }
         }
@@ -80,6 +76,7 @@ class EvaluationResultViewModel @Inject constructor(
         Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}")
         mapController.markerHandle.removeMarker(markerTitle)
         mapController.markerHandle.removeOnMapClickListener()
+        mapController.lineHandler.removeLine()
     }
 
 
@@ -96,15 +93,29 @@ class EvaluationResultViewModel @Inject constructor(
             liveDataQsRecordBean.value!!.geometry = it.toGeometry()
             mapController.markerHandle.addMarker(geoPoint, markerTitle)
             viewModelScope.launch {
-                val linkList = realmOperateHelper.queryLink(
-                    GeometryTools.createPoint(
-                        geoPoint.longitude,
-                        geoPoint.latitude
-                    )
-                )
-                if (linkList.isNotEmpty()) {
-                    liveDataQsRecordBean.value!!.linkId = linkList[0].id
-                }
+                captureLink(geoPoint.longitude, geoPoint.latitude)
+            }
+        }
+    }
+
+    /**
+     * 捕捉到路
+     */
+    private suspend fun captureLink(longitude: Double, latitude: Double) {
+        val linkList = realmOperateHelper.queryLink(
+            point = GeometryTools.createPoint(
+                longitude,
+                latitude
+            ),
+        )
+        liveDataQsRecordBean.value?.let {
+            if (linkList.isNotEmpty()) {
+                it.linkId =
+                    linkList[0].properties[LinkTable.linkPid] ?: ""
+                mapController.lineHandler.showLine(linkList[0].geometry)
+            } else {
+                it.linkId = ""
+                mapController.lineHandler.removeLine()
             }
         }
     }
@@ -263,14 +274,28 @@ class EvaluationResultViewModel @Inject constructor(
     /**
      * 根据数据id,查询数据
      */
-    fun loadData(id: String) {
+
+    fun initData(id: String) {
         viewModelScope.launch(Dispatchers.IO) {
             val realm = Realm.getDefaultInstance()
             val objects = realm.where<QsRecordBean>().equalTo("id", id).findFirst()
 
             if (objects != null) {
                 oldBean = realm.copyFromRealm(objects)
-                liveDataQsRecordBean.postValue(oldBean!!.copy())
+                oldBean?.let {
+                    liveDataQsRecordBean.postValue(it.copy())
+                    val p = GeometryTools.createGeoPoint(it.geometry)
+                    mapController.markerHandle.addMarker(
+                        GeoPoint(p.longitude, p.latitude),
+                        markerTitle
+                    )
+                    if (it.linkId.isNotEmpty()) {
+                        val link = realmOperateHelper.queryLink(it.linkId)
+                        link?.let { l ->
+                            mapController.lineHandler.showLine(l.geometry)
+                        }
+                    }
+                }
             }
         }
     }
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt
index 3f7f0df0..608f59ed 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt
@@ -16,7 +16,7 @@ import java.util.*
 /**
  * 渲染要素对应的实体
  * */
-open class RenderEntity(): RealmObject() {
+open class RenderEntity() : RealmObject() {
     @PrimaryKey
     var id: String = UUID.randomUUID().toString() // id
     lateinit var name: String //要素名
@@ -39,14 +39,38 @@ open class RenderEntity(): RealmObject() {
 
             }
         }
+
     @Ignore
     var wkt: Geometry? = null
+        get() {
+            if (field == null || field!!.isEmpty) {
+                try {
+                    field = GeometryTools.createGeometry(geometry)
+                } catch (e: Exception) {
+
+                }
+            }
+            return field
+        }
     var properties: RealmDictionary<String?> = RealmDictionary()
     var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码
     var tileY: RealmSet<Int> = RealmSet()  // y方向的tile编码
 
-    constructor(name: String, properties: RealmDictionary<String?>): this() {
+    constructor(name: String, properties: RealmDictionary<String?>) : this() {
         this.name = name
         this.properties = properties
     }
+
+    companion object {
+        object LinkTable {
+            //道路linkId
+            const val linkPid = "linkPid"
+        }
+        object LimitTable {
+            const val linkPid = "linkPid"
+        }
+        object KindCodeTable {
+            const val linkPid = "linkPid"
+        }
+    }
 }
\ No newline at end of file
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
index f3524706..aafad60d 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
@@ -1,57 +1,27 @@
 package com.navinfo.collect.library.map.handler
 
-import android.content.Context
-import android.graphics.BitmapFactory
-import android.graphics.Canvas
-import android.graphics.Color
-import android.util.Log
 import androidx.appcompat.app.AppCompatActivity
-import androidx.core.content.res.ResourcesCompat
-import androidx.lifecycle.lifecycleScope
-import com.navinfo.collect.library.R
-import com.navinfo.collect.library.data.entity.QsRecordBean
 import com.navinfo.collect.library.map.NIMapView
-import com.navinfo.collect.library.map.cluster.ClusterMarkerItem
-import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer
-import com.navinfo.collect.library.map.layers.MyItemizedLayer
 import com.navinfo.collect.library.map.source.MapLifeNiLocationTileSource
 import com.navinfo.collect.library.map.source.NavinfoMultiMapFileTileSource
 import com.navinfo.collect.library.map.source.OMDBTileSource
 import com.navinfo.collect.library.system.Constant
-import com.navinfo.collect.library.utils.GeometryTools
-import io.realm.Realm
-import io.realm.kotlin.where
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
 import okhttp3.Cache
 import okhttp3.OkHttpClient
-import org.locationtech.jts.geom.Geometry
-import org.oscim.android.canvas.AndroidBitmap
-import org.oscim.backend.CanvasAdapter
-import org.oscim.backend.canvas.Bitmap
-import org.oscim.backend.canvas.Paint
-import org.oscim.core.GeoPoint
 import org.oscim.layers.GroupLayer
-import org.oscim.layers.marker.MarkerInterface
-import org.oscim.layers.marker.MarkerItem
-import org.oscim.layers.marker.MarkerRendererFactory
-import org.oscim.layers.marker.MarkerSymbol
 import org.oscim.layers.tile.buildings.BuildingLayer
 import org.oscim.layers.tile.vector.VectorTileLayer
 import org.oscim.layers.tile.vector.labeling.LabelLayer
 import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook
-import org.oscim.map.Map
 import org.oscim.map.Map.UpdateListener
 import org.oscim.tiling.source.OkHttpEngine.OkHttpFactory
 import org.oscim.tiling.source.mapfile.MapFileTileSource
 import java.io.File
-import java.util.*
 
 /**
  * Layer 操作
  */
-open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) {
+class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) {
     private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理
             : GroupLayer? = null
     protected val mTracePath:String = tracePath
@@ -76,10 +46,6 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr
      * */
     private lateinit var omdbVectorTileLayer: VectorTileLayer
     private lateinit var omdbLabelLayer: LabelLayer
-    /**
-     * 文字大小
-     */
-    private val NUM_13 = 13
 
     init {
         initMap()
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
index ac0abb70..ca3ed0b9 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
@@ -1,13 +1,15 @@
 package com.navinfo.collect.library.map.handler
 
-import android.content.Context
 import android.graphics.BitmapFactory
+import android.os.Build
 import android.widget.Toast
+import androidx.annotation.RequiresApi
 import androidx.appcompat.app.AppCompatActivity
 import com.navinfo.collect.library.R
 import com.navinfo.collect.library.map.NIMapView
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.StringUtil
+import org.locationtech.jts.geom.LineString
 import org.oscim.android.canvas.AndroidBitmap
 import org.oscim.backend.canvas.Bitmap
 import org.oscim.core.GeoPoint
@@ -22,8 +24,9 @@ import org.oscim.layers.vector.PathLayer
 import org.oscim.layers.vector.geometries.Style
 import org.oscim.map.Map
 
-open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
-    BaseHandler(context, mapView), Map.UpdateListener {
+@RequiresApi(Build.VERSION_CODES.M)
+class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView),
+    Map.UpdateListener {
 
     private var editIndex: Int = -1;
     private val mPathMakers: MutableList<MarkerItem> = mutableListOf()
@@ -51,6 +54,9 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
 
     private var bDrawLine = false
 
+
+    private val mDefaultPathLayer: PathLayer
+
     init {
         mMapView.vtmMap.events.bind(this)
 
@@ -61,29 +67,21 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
             .fillColor(context.resources.getColor(R.color.draw_line_blue2_color, null))
             .fillAlpha(0.5f)
             .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null))
-            .fixed(true)
-            .build()
+            .fixed(true).build()
 
-        newTempStyle = Style.builder()
-            .stippleColor(context.resources.getColor(R.color.transparent, null))
-            .stipple(30)
-            .stippleWidth(30f)
-            .strokeWidth(4f)
-            .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null))
-            .fixed(true)
-            .randomOffset(false)
-            .build()
-
-        editTempStyle = Style.builder()
-            .stippleColor(context.resources.getColor(R.color.transparent, null))
-            .stipple(30)
-            .stippleWidth(30f)
-            .strokeWidth(8f)
-            .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null))
-            .fixed(true)
-            .randomOffset(false)
-            .build()
+        newTempStyle =
+            Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null))
+                .stipple(30).stippleWidth(30f).strokeWidth(4f)
+                .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null))
+                .fixed(true).randomOffset(false).build()
 
+        editTempStyle =
+            Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null))
+                .stipple(30).stippleWidth(30f).strokeWidth(8f)
+                .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null))
+                .fixed(true).randomOffset(false).build()
+        mDefaultPathLayer = PathLayer(mMapView.vtmMap, lineStyle)
+        addLayer(mDefaultPathLayer, NIMapView.LAYER_GROUPS.VECTOR)
         mPathLayer = PathLayer(mMapView.vtmMap, lineStyle)
 //        addLayer(mPathLayer, NIMapView.LAYER_GROUPS.OPERATE)
 
@@ -92,8 +90,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
 
         mPathMarkerBitmap = AndroidBitmap(
             BitmapFactory.decodeResource(
-                mContext.resources,
-                R.mipmap.icon_path_maker
+                mContext.resources, R.mipmap.icon_path_maker
             )
         )
         val markerSymbol = MarkerSymbol(mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER)
@@ -110,8 +107,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
                         if (item === item1) {
                             mMapView.vtmMap.animator().animateTo(
                                 GeoPoint(
-                                    item.getPoint().latitude,
-                                    item.getPoint().longitude
+                                    item.getPoint().latitude, item.getPoint().longitude
                                 )
                             )
                             editIndex = i
@@ -139,6 +135,22 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
         })
     }
 
+    fun showLine(geometry: String) {
+        try {
+
+        } catch (e: Exception) {
+            Toast.makeText(mContext, "高亮路线失败 ${e.message}", Toast.LENGTH_SHORT).show()
+        }
+        val g = GeometryTools.getGeoPoints(geometry)
+        mDefaultPathLayer.setPoints(g)
+        mDefaultPathLayer.isEnabled = true
+    }
+
+    fun removeLine() {
+        mDefaultPathLayer.clearPath()
+        mDefaultPathLayer.isEnabled = false
+    }
+
     fun addDrawLinePoint(geoPoint: GeoPoint): List<GeoPoint> {
 
         if (!bDrawLine) {
@@ -210,7 +222,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
                         }
                     }
                 }
-                if (editIndex < mPathLayer.getPoints().size) {
+                if (editIndex < mPathLayer.points.size) {
                     mPathLayer.points.removeAt(editIndex)
                     val list2: MutableList<GeoPoint> = mutableListOf<GeoPoint>()
                     list2.addAll(mPathLayer.points)
@@ -268,8 +280,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
 
 
     override fun onMapEvent(e: Event, mapPosition: MapPosition) {
-        if (!bDrawLine)
-            return
+        if (!bDrawLine) return
 //        if (mMapView.centerPixel[1] > mMapView.vtmMap.height / 2) {
 //            val geoPoint =
 //                mMapView.vtmMap.viewport()
@@ -287,16 +298,14 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
                         list.add(mPathMakers[editIndex].geoPoint)
                         list.add(
                             GeoPoint(
-                                mapPosition.latitude,
-                                mapPosition.longitude
+                                mapPosition.latitude, mapPosition.longitude
                             )
                         )
                     } else {
                         list.add(mPathMakers[editIndex - 1].geoPoint)
                         list.add(
                             GeoPoint(
-                                mapPosition.latitude,
-                                mapPosition.longitude
+                                mapPosition.latitude, mapPosition.longitude
                             )
                         )
                         list.add(mPathMakers[editIndex + 1].geoPoint)
@@ -308,8 +317,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
                     list.add(mPathLayer.points[mPathLayer.points.size - 1])
                     list.add(
                         GeoPoint(
-                            mapPosition.latitude,
-                            mapPosition.longitude
+                            mapPosition.latitude, mapPosition.longitude
                         )
                     )
                     mPathLayerTemp.setPoints(list)
@@ -317,8 +325,7 @@ open class LineHandler(context: AppCompatActivity, mapView: NIMapView) :
                         val listDis: MutableList<GeoPoint> = mutableListOf()
                         listDis.add(
                             GeoPoint(
-                                mapPosition.latitude,
-                                mapPosition.longitude
+                                mapPosition.latitude, mapPosition.longitude
                             )
                         )
 //                        val distance: Double =
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 8865493a..4b18e5b2 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
@@ -65,6 +65,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas
                 //第一次定位成功显示当前位置
                 if (this.bFirst) {
                     animateToCurrentPosition(16.0)
+                    this.bFirst = false
                 }
 
             }

From 58136320d46409f4873356612ec6c1a519dda14b Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Thu, 27 Apr 2023 15:04:18 +0800
Subject: [PATCH 5/7] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=A4=9A=E7=BA=BF?=
 =?UTF-8?q?=E5=9B=BE=E5=B1=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../map/handler/LayerManagerHandler.kt        |   7 +
 .../library/map/layers/MultiPathLayer.java    | 170 ++++++++++++++++++
 .../library/map/layers/OmdbTaskLinkLayer.java |  17 ++
 3 files changed, 194 insertions(+)
 create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java
 create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java

diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
index f3524706..f8a79584 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
@@ -41,6 +41,7 @@ import org.oscim.layers.tile.buildings.BuildingLayer
 import org.oscim.layers.tile.vector.VectorTileLayer
 import org.oscim.layers.tile.vector.labeling.LabelLayer
 import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook
+import org.oscim.layers.vector.VectorLayer
 import org.oscim.map.Map
 import org.oscim.map.Map.UpdateListener
 import org.oscim.tiling.source.OkHttpEngine.OkHttpFactory
@@ -142,6 +143,12 @@ open class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tr
         }
     }
 
+    /**
+     * 初始化任务Link高亮的图层
+     * */
+    private fun initOMDBTaskVectorLayer() {
+    }
+
     /**
      * 切换基础底图样式
      */
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java
new file mode 100644
index 00000000..8f3efc9b
--- /dev/null
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MultiPathLayer.java
@@ -0,0 +1,170 @@
+package com.navinfo.collect.library.map.layers;
+
+import com.navinfo.collect.library.utils.GeometryTools;
+import org.locationtech.jts.geom.Geometry;
+import org.locationtech.jts.geom.LineString;
+import org.oscim.core.GeoPoint;
+import org.oscim.layers.vector.PathLayer;
+import org.oscim.layers.vector.geometries.LineDrawable;
+import org.oscim.layers.vector.geometries.PolygonDrawable;
+import org.oscim.layers.vector.geometries.Style;
+import org.oscim.map.Map;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Created by xiaoxiao on 2018/3/26.
+ */
+
+public class MultiPathLayer extends PathLayer {
+    private List<LineDrawable> pathDrawableList;
+
+    public MultiPathLayer(Map map, Style style) {
+        super(map, style);
+        mStyle = style;
+        pathDrawableList = new ArrayList<>();
+    }
+
+    public MultiPathLayer(Map map, Style style, String name) {
+        this(map, style);
+    }
+
+    public MultiPathLayer(Map map, int lineColor, float lineWidth, int fillColor, float fillAlpha) {
+        this(map, Style.builder()
+                .stippleColor(lineColor)
+                .stipple(24)
+                .stippleWidth(lineWidth)
+                .strokeWidth(lineWidth)
+                .strokeColor(lineColor).fillColor(fillColor).fillAlpha(fillAlpha)
+                .fixed(true)
+                .randomOffset(false)
+                .build());
+    }
+
+    public MultiPathLayer(Map map, int lineColor, int fillColor, float fillAlpha) {
+        this(map, lineColor, 0.5f, fillColor, fillAlpha);
+    }
+
+    /**
+     * 设置polygon的点位
+     */
+    public void setPathList(List<List<GeoPoint>> pointListList) {
+        if (pointListList == null || pointListList.isEmpty()) {
+            return;
+        }
+        for (List<GeoPoint> pointList : pointListList) {
+            if (pointList == null || pointList.size() < 2) {
+                return;
+            }
+            synchronized (this) {
+                LineDrawable lineDrawable = new LineDrawable(pointList, mStyle);
+                add(lineDrawable);
+                pathDrawableList.add(lineDrawable);
+            }
+            mWorker.submit(0);
+            update();
+        }
+    }
+
+    /**
+     * 移除正在绘制的polygon的图形
+     */
+    public void removePathDrawable(int i) {
+        if (pathDrawableList != null && pathDrawableList.size() > i) {
+            remove(pathDrawableList.get(i));
+            update();
+        }
+    }
+
+    public void removePathDrawable(List<GeoPoint> geoPointList) {
+        LineString path = GeometryTools.getLineStrinGeo(geoPointList);
+        removePolygonDrawable(path);
+    }
+
+    public void removePathDrawable(String pathStr) {
+        LineString path = (LineString) GeometryTools.createGeometry(pathStr);
+        removePolygonDrawable(path);
+    }
+
+    public void removePolygonDrawable(Geometry path) {
+        if (pathDrawableList != null && !pathDrawableList.isEmpty()) {
+            Iterator iterator = pathDrawableList.iterator();
+            while (iterator.hasNext()) {
+                LineDrawable lineDrawable = (LineDrawable) iterator.next();
+                if (GeometryTools.createGeometry(lineDrawable.getGeometry().toString()).equals(path)) {
+                    remove(lineDrawable);
+                    iterator.remove();
+                    break;
+                }
+            }
+            mWorker.submit(0);
+            update();
+        }
+    }
+
+    public void addPathDrawable(List<GeoPoint> pointList) {
+        if (pathDrawableList != null) {
+            if (pointList == null || pointList.size() < 2) {
+                return;
+            }
+            synchronized (this) {
+                LineDrawable pathDrawable = new LineDrawable(pointList, mStyle);
+                add(pathDrawable);
+                pathDrawableList.add(pathDrawable);
+            }
+            mWorker.submit(0);
+        }
+        update();
+    }
+
+    public void addPathDrawable(LineString lineString) {
+        List<GeoPoint> geoPointList = GeometryTools.getGeoPoints(lineString.toString());
+        addPathDrawable(geoPointList);
+    }
+
+    public List<LineString> getAllPathList() {
+        if (pathDrawableList != null && !pathDrawableList.isEmpty()) {
+            List<LineString> pathList = new ArrayList<>();
+            for (LineDrawable pathDrawable : pathDrawableList) {
+                pathList.add((LineString) GeometryTools.createGeometry(pathDrawable.getGeometry().toString()));
+            }
+            return pathList;
+        }
+        return null;
+    }
+
+    public List<List<GeoPoint>> getAllPathGeoPointList() {
+        List<LineString> pathList = getAllPathList();
+        if (pathList != null) {
+            List<List<GeoPoint>> geopointList = new ArrayList<>();
+            for (LineString path : pathList) {
+                geopointList.add(GeometryTools.getGeoPoints(path.toString()));
+            }
+            return geopointList;
+        }
+        return null;
+    }
+
+    public List<LineDrawable> getPolygonDrawableList() {
+        return pathDrawableList;
+    }
+
+    public void setPolygonDrawableList(List<LineDrawable> pathDrawableList) {
+        this.pathDrawableList = pathDrawableList;
+    }
+
+    public void removeAllPathDrawable(){
+        if (pathDrawableList != null && !pathDrawableList.isEmpty()) {
+            Iterator iterator = pathDrawableList.iterator();
+            while (iterator.hasNext()) {
+                LineDrawable lineDrawable = (LineDrawable) iterator.next();
+                remove(lineDrawable);
+                iterator.remove();
+            }
+            mWorker.submit(0);
+            update();
+        }
+    }
+}
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java
new file mode 100644
index 00000000..d8d2a485
--- /dev/null
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java
@@ -0,0 +1,17 @@
+package com.navinfo.collect.library.map.layers;
+
+import org.oscim.layers.vector.VectorLayer;
+import org.oscim.layers.vector.geometries.Drawable;
+import org.oscim.map.Map;
+import org.oscim.utils.SpatialIndex;
+
+public class OmdbTaskLinkLayer extends VectorLayer {
+    public OmdbTaskLinkLayer(Map map, SpatialIndex<Drawable> index) {
+        super(map, index);
+    }
+
+    public OmdbTaskLinkLayer(Map map) {
+        super(map);
+    }
+
+}

From 3eed9bad33556432114cf7c2a79f6832313099a7 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Thu, 27 Apr 2023 17:16:53 +0800
Subject: [PATCH 6/7] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1?=
 =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=AB=98=E4=BA=AE=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/com/navinfo/omqs/bean/TaskBean.kt    |  2 +-
 .../java/com/navinfo/omqs/db/MyRealmModule.kt |  4 +-
 .../ui/fragment/tasklist/TaskListViewModel.kt | 13 ++++-
 .../library/data/entity}/HadLinkDvoBean.kt    |  3 +-
 .../library/map/handler/LineHandler.kt        | 12 ++++-
 .../library/map/layers/OmdbTaskLinkLayer.java | 22 --------
 .../library/map/layers/OmdbTaskLinkLayer.kt   | 54 +++++++++++++++++++
 7 files changed, 81 insertions(+), 29 deletions(-)
 rename {app/src/main/java/com/navinfo/omqs/bean => collect-library/src/main/java/com/navinfo/collect/library/data/entity}/HadLinkDvoBean.kt (80%)
 delete mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java
 create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt

diff --git a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
index 2f2f6566..d46f6a77 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/TaskBean.kt
@@ -1,6 +1,7 @@
 package com.navinfo.omqs.bean
 
 import com.google.gson.annotations.SerializedName
+import com.navinfo.collect.library.data.entity.HadLinkDvoBean
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.tools.FileManager
 import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus
@@ -8,7 +9,6 @@ import io.realm.RealmList
 import io.realm.RealmObject
 import io.realm.annotations.Ignore
 import io.realm.annotations.PrimaryKey
-import io.realm.annotations.RealmClass
 
 open class TaskBean @JvmOverloads constructor(
     /**
diff --git a/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt b/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt
index cab1956b..deb0ee86 100644
--- a/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/MyRealmModule.kt
@@ -1,9 +1,9 @@
 package com.navinfo.omqs.db
 
-import com.navinfo.omqs.bean.HadLinkDvoBean
+import com.navinfo.collect.library.data.entity.HadLinkDvoBean
 import com.navinfo.omqs.bean.TaskBean
 import io.realm.annotations.RealmModule
 
-@RealmModule(classes = [TaskBean::class, HadLinkDvoBean::class])
+@RealmModule(classes = [TaskBean::class])
 class MyRealmModule {
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt
index 53ee23dd..b9dd9165 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListViewModel.kt
@@ -1,11 +1,16 @@
 package com.navinfo.omqs.ui.fragment.tasklist
 
 import android.content.Context
+import android.graphics.Color
+import android.os.Build
 import android.util.Log
 import android.widget.Toast
+import androidx.annotation.RequiresApi
+import androidx.core.graphics.toColor
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
+import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.omqs.bean.TaskBean
 import com.navinfo.omqs.http.NetResult
 import com.navinfo.omqs.http.NetworkService
@@ -19,7 +24,8 @@ import javax.inject.Inject
 
 @HiltViewModel
 class TaskListViewModel @Inject constructor(
-    private val networkService: NetworkService
+    private val networkService: NetworkService,
+    private val niMapController: NIMapController
 ) : ViewModel() {
 
     val liveDataTaskList = MutableLiveData<List<TaskBean>>()
@@ -70,6 +76,11 @@ class TaskListViewModel @Inject constructor(
             for (item in taskList) {
                 FileManager.checkOMDBFileInfo(item)
             }
+//            niMapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.rgb(0, 255, 0).toColor())
+//            taskList.forEach {
+//                niMapController.lineHandler.omdbTaskLinkLayer.addLineList(it.hadLinkDvoList)
+//            }
+//            niMapController.lineHandler.omdbTaskLinkLayer.update()
             liveDataTaskList.postValue(taskList)
         }
 
diff --git a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
similarity index 80%
rename from app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt
rename to collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
index 28373667..7430050d 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/HadLinkDvoBean.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt
@@ -1,7 +1,6 @@
-package com.navinfo.omqs.bean
+package com.navinfo.collect.library.data.entity
 
 import io.realm.RealmObject
-import io.realm.annotations.RealmClass
 
 open class HadLinkDvoBean @JvmOverloads constructor(
     /**
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
index dd733b4d..1d39d1a6 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
@@ -26,7 +26,7 @@ import org.oscim.layers.vector.VectorLayer
 import org.oscim.layers.vector.geometries.Style
 import org.oscim.map.Map
 
-@RequiresApi(Build.VERSION_CODES.M)
+@RequiresApi(Build.VERSION_CODES.N)
 class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView),
     Map.UpdateListener {
 
@@ -60,6 +60,16 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
     private val mDefaultPathLayer: PathLayer
 
     val omdbTaskLinkLayer by lazy {
+        val omdbTaskLinkLayer = OmdbTaskLinkLayer(mMapView.vtmMap,
+            Style.builder()
+//            .stippleColor(context.resources.getColor(R.color.draw_line_red_color, null))
+            .fillColor(context.resources.getColor(R.color.draw_line_red_color, null))
+            .fillAlpha(0.5f)
+            .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null))
+                .strokeWidth(4f)
+            .fixed(true).build())
+        addLayer(omdbTaskLinkLayer, NIMapView.LAYER_GROUPS.VECTOR)
+        omdbTaskLinkLayer
     }
 
     init {
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java
deleted file mode 100644
index 45a77707..00000000
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.navinfo.collect.library.map.layers;
-
-import org.locationtech.jts.geom.Geometry;
-import org.locationtech.jts.geom.LineString;
-import org.oscim.layers.vector.VectorLayer;
-import org.oscim.layers.vector.geometries.Drawable;
-import org.oscim.layers.vector.geometries.Style;
-import org.oscim.map.Map;
-import org.oscim.utils.SpatialIndex;
-
-import java.util.HashMap;
-import java.util.List;
-
-public class OmdbTaskLinkLayer extends VectorLayer {
-    private java.util.Map<String, LineString> lineList = new HashMap<>();
-    private Style style;
-    public OmdbTaskLinkLayer(Map map) {
-        super(map);
-    }
-
-
-}
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt
new file mode 100644
index 00000000..02de5184
--- /dev/null
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt
@@ -0,0 +1,54 @@
+package com.navinfo.collect.library.map.layers
+
+import android.graphics.Color
+import com.navinfo.collect.library.R
+import com.navinfo.collect.library.data.entity.HadLinkDvoBean
+import com.navinfo.collect.library.utils.GeometryTools
+import org.locationtech.jts.geom.Geometry
+import org.oscim.layers.vector.VectorLayer
+import org.oscim.layers.vector.geometries.Drawable
+import org.oscim.layers.vector.geometries.LineDrawable
+import org.oscim.layers.vector.geometries.Style
+import org.oscim.map.Map
+
+class OmdbTaskLinkLayer(map: Map, private var style: Style) : VectorLayer(map) {
+    private val lineMap = HashMap<String, Drawable>()
+
+    fun addLine(hadLinkDvoBean: HadLinkDvoBean, style: Style = this.style) {
+        hadLinkDvoBean.let {
+            if (!lineMap.containsKey(it.linkPid)) {
+                // 添加geometry到图层上
+                val lineDrawable = LineDrawable(GeometryTools.createGeometry(it.geometry), style)
+                super.add(lineDrawable)
+                lineMap[it.linkPid] = lineDrawable
+            }
+        }
+    }
+
+    fun addLineList(hadLinkDvoBeanList: List<HadLinkDvoBean>, style: Style = this.style) {
+        hadLinkDvoBeanList.forEach {
+            addLine(it, style)
+        }
+    }
+
+    fun removeLine(linkPid: String):Boolean {
+        if (lineMap.containsKey(linkPid)) {
+            super.remove(lineMap[linkPid])
+            lineMap.remove(linkPid)
+        }
+        return false
+    }
+
+    fun removeLine(geometry: Geometry) {
+        super.remove(geometry)
+    }
+
+    fun setLineColor(color: Color) {
+        this.style = Style.builder()
+            .fillColor(color.toArgb())
+            .fillAlpha(0.5f)
+            .strokeColor(color.toArgb())
+            .strokeWidth(4f)
+            .fixed(true).build()
+    }
+}
\ No newline at end of file

From 894732ee45bca09bbb44e08d7a8aea90f3c99c32 Mon Sep 17 00:00:00 2001
From: squallzhjch <zhangjingchao@navinfo.com>
Date: Fri, 28 Apr 2023 16:03:40 +0800
Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E4=BD=8D?=
 =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=8F=90=E5=89=8D=E7=9C=8B=E6=9D=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/navinfo/omqs/db/RealmOperateHelper.kt |   6 +-
 .../com/navinfo/omqs/hilt/GlobalModule.kt     |  12 +-
 .../omqs/ui/activity/map/MainActivity.kt      |  25 ++-
 .../omqs/ui/activity/map/MainViewModel.kt     | 206 ++++++++++++++----
 .../omqs/ui/activity/map/SignAdapter.kt       |  28 +++
 .../navinfo/omqs/ui/activity/map/SignBean.kt  |   8 +
 .../EvaluationResultViewModel.kt              |  85 ++++----
 .../evaluationresult/MiddleAdapter.kt         |   3 +
 .../main/res/drawable/icon_speed_limit.xml    |  12 +
 app/src/main/res/layout/activity_main.xml     |  21 +-
 app/src/main/res/layout/adapter_sign.xml      |  20 ++
 app/src/main/res/mipmap-xxhdpi/bg_sign.png    | Bin 0 -> 11622 bytes
 .../navinfo/collect/library/map/GeoPoint.kt   |  28 +--
 .../collect/library/map/NIMapController.kt    |  36 ++-
 .../collect/library/map/NIMapOptions.kt       |   2 +
 .../collect/library/map/NIMapView.java        |  10 +-
 .../library/map/handler/BaseHandler.kt        |  14 +-
 .../map/handler/LayerManagerHandler.kt        |   2 +-
 .../library/map/handler/LineHandler.kt        |   7 +-
 .../map/handler/LocationLayerHandler.kt       |  54 +++--
 .../library/map/handler/MarkHandler.kt        |   9 +-
 .../map/handler/MeasureLayerHandler.kt        |   9 +-
 .../collect/library/utils/GeometryTools.java  |   2 +-
 23 files changed, 435 insertions(+), 164 deletions(-)
 create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
 create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt
 create mode 100644 app/src/main/res/drawable/icon_speed_limit.xml
 create mode 100644 app/src/main/res/layout/adapter_sign.xml
 create mode 100644 app/src/main/res/mipmap-xxhdpi/bg_sign.png

diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
index 56ea0bd8..9bb6be80 100644
--- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
@@ -79,16 +79,14 @@ class RealmOperateHelper() {
     }
 
 
-    suspend fun queryLink(
-        linkPid: String,
-    ): RenderEntity? {
+    suspend fun queryLink(linkPid: String): RenderEntity? {
         var link: RenderEntity? = null
         withContext(Dispatchers.IO) {
             val realm = Realm.getDefaultInstance()
             val realmR = realm.where(RenderEntity::class.java)
                 .equalTo("table", "OMDB_RD_LINK")
                 .and()
-                .rawPredicate("properties['${LinkTable.linkPid}']=$linkPid")
+                .equalTo("properties['${LinkTable.linkPid}']", linkPid)
                 .findFirst()
             if (realmR != null) {
                 link = realm.copyFromRealm(realmR)
diff --git a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt
index 25cc9516..180e720f 100644
--- a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt
+++ b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt
@@ -6,6 +6,7 @@ import androidx.room.Room
 import com.google.gson.Gson
 import com.google.gson.GsonBuilder
 import com.google.gson.reflect.TypeToken
+import com.navinfo.collect.library.data.dao.impl.TraceDataBase
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.OMQSApplication
 import com.navinfo.omqs.db.RoomAppDatabase
@@ -90,7 +91,7 @@ class GlobalModule {
     @Provides
     @Singleton
     fun provideGson(): Gson = GsonBuilder()
-            // 解决解析Json时将int类型自动转换为Double的问题
+        // 解决解析Json时将int类型自动转换为Double的问题
         .registerTypeAdapter(object : TypeToken<Map<String, Any?>>() {}.getType(), IntTypeAdapter())
         .registerTypeAdapter(object : TypeToken<Map<String, Any>>() {}.getType(), IntTypeAdapter())
         .registerTypeAdapter(object : TypeToken<Map<Any, Any>>() {}.getType(), IntTypeAdapter())
@@ -137,6 +138,15 @@ class GlobalModule {
             .build();
     }
 
+    @Singleton
+    @Provides
+    fun provideTraceDatabase(context: Application): TraceDataBase {
+        return TraceDataBase.getDatabase(
+            context,
+            Constant.USER_DATA_PATH + "/trace.sqlite"
+        )
+    }
+
 //    /**
 //     * realm 注册
 //     */
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 44732ade..35271e25 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
@@ -1,10 +1,13 @@
 package com.navinfo.omqs.ui.activity.map
 
+import android.os.Build
 import android.os.Bundle
 import androidx.activity.viewModels
+import androidx.annotation.RequiresApi
 import androidx.core.view.WindowCompat
 import androidx.databinding.DataBindingUtil
 import androidx.navigation.findNavController
+import androidx.recyclerview.widget.LinearLayoutManager
 import com.blankj.utilcode.util.ToastUtils
 import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.collect.library.map.handler.NiLocationListener
@@ -32,6 +35,7 @@ class MainActivity : BaseActivity() {
     @Inject
     lateinit var offlineMapDownloadManager: OfflineMapDownloadManager
 
+    private val signAdapter by lazy { SignAdapter() }
 
     override fun onCreate(savedInstanceState: Bundle?) {
         WindowCompat.setDecorFitsSystemWindows(window, false)
@@ -43,7 +47,7 @@ class MainActivity : BaseActivity() {
             binding.mainActivityMap,
             null,
             Constant.MAP_PATH,
-            Constant.USER_DATA_PATH+"/trace.sqlite"
+            Constant.USER_DATA_PATH + "/trace.sqlite"
         )
         //关联生命周期
         binding.lifecycleOwner = this
@@ -56,7 +60,11 @@ class MainActivity : BaseActivity() {
             //处理页面跳转
             viewModel.navigation(this, it)
         }
-
+        binding.mainActivitySignRecyclerview.layoutManager = LinearLayoutManager(this)
+        binding.mainActivitySignRecyclerview.adapter = signAdapter
+        viewModel.liveDataSignList.observe(this) {
+            signAdapter.refreshData(it)
+        }
     }
 
     override fun onStart() {
@@ -64,15 +72,10 @@ class MainActivity : BaseActivity() {
 
         //开启定位
         mapController.locationLayerHandler.startLocation()
+
         //启动轨迹存储
-        mapController.locationLayerHandler.setNiLocationListener(NiLocationListener {
-            //ToastUtils.showLong("定位${it.longitude}")
-            binding!!.viewModel!!.addSaveTrace(it)
-            binding!!.viewModel!!.startSaveTraceThread(this)
-        })
-        //显示轨迹图层
-//        mapController.layerManagerHandler.showNiLocationLayer(Constant.DATA_PATH+ SystemConstant.USER_ID+"/trace.sqlite")
-        mapController.layerManagerHandler.showNiLocationLayer()
+//        viewModel.startSaveTraceThread(this)
+
     }
 
     override fun onPause() {
@@ -103,7 +106,7 @@ class MainActivity : BaseActivity() {
      */
     fun openCamera() {
         //显示轨迹图层
-        binding!!.viewModel!!.onClickCameraButton(this)
+        viewModel.onClickCameraButton(this)
     }
 
     /**
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 6969cdad..f8ec8e3e 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
@@ -2,23 +2,33 @@ package com.navinfo.omqs.ui.activity.map
 
 import android.content.Context
 import android.content.DialogInterface
+import android.os.Build
 import android.os.Bundle
 import android.util.Log
+import androidx.annotation.RequiresApi
 import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.ViewModel
+import androidx.lifecycle.viewModelScope
 import androidx.navigation.findNavController
 import com.navinfo.collect.library.data.dao.impl.TraceDataBase
 import com.navinfo.collect.library.data.entity.NiLocation
+import com.navinfo.collect.library.data.entity.RenderEntity
 import com.navinfo.collect.library.map.NIMapController
+import com.navinfo.collect.library.map.handler.NiLocationListener
 import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.GeometryToolsKt
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.R
+import com.navinfo.omqs.db.RealmOperateHelper
 import com.navinfo.omqs.ui.dialog.CommonDialog
 import com.navinfo.omqs.ui.manager.TakePhotoManager
 import dagger.hilt.android.lifecycle.HiltViewModel
+import dagger.hilt.android.qualifiers.ActivityContext
+import dagger.hilt.android.qualifiers.ApplicationContext
 import io.realm.RealmSet
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
 import org.oscim.core.GeoPoint
 import org.videolan.libvlc.LibVlcUtil
 import javax.inject.Inject
@@ -26,15 +36,25 @@ import javax.inject.Inject
 /**
  * 创建Activity全局viewmode
  */
+
 @HiltViewModel
 class MainViewModel @Inject constructor(
     private val mapController: NIMapController,
+    private val traceDataBase: TraceDataBase,
+    private val realmOperateHelper: RealmOperateHelper
 ) : ViewModel() {
 
-    val liveDataQsRecordIdList = MutableLiveData<List<String>>()
     private var mCameraDialog: CommonDialog? = null
 
-    private var niLocationList: MutableList<NiLocation> = ArrayList<NiLocation>()
+    //地图点击捕捉到的质检数据ID列表
+    val liveDataQsRecordIdList = MutableLiveData<List<String>>()
+
+    //看板数据
+    val liveDataSignList = MutableLiveData<List<SignBean>>()
+
+
+    //    private var niLocationList: MutableList<NiLocation> = ArrayList<NiLocation>()
+    var testPoint = GeoPoint(0, 0)
 
     init {
         mapController.markerHandle.setOnQsRecordItemClickListener(object :
@@ -43,6 +63,93 @@ class MainViewModel @Inject constructor(
                 liveDataQsRecordIdList.value = list
             }
         })
+        initLocation()
+        viewModelScope.launch {
+            mapController.onMapClickFlow.collect {
+                testPoint = it
+            }
+        }
+
+    }
+
+    private fun initLocation() {
+        //        mapController.locationLayerHandler.setNiLocationListener(NiLocationListener {
+//            addSaveTrace(it)
+//
+//        })
+        //用于定位点存储到数据库
+        viewModelScope.launch(Dispatchers.Default) {
+            mapController.locationLayerHandler.niLocationFlow.collect { location ->
+                location.longitude = testPoint.longitude
+                location.latitude = testPoint.latitude
+                val geometry = GeometryTools.createGeometry(
+                    GeoPoint(
+                        location.latitude,
+                        location.longitude
+                    )
+                )
+                val tileX = RealmSet<Int>()
+                GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX)
+                val tileY = RealmSet<Int>()
+                GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY)
+
+                //遍历存储tile对应的x与y的值
+                tileX.forEach { x ->
+                    tileY.forEach { y ->
+                        location.tilex = x
+                        location.tiley = y
+                    }
+                }
+                Log.e("jingo", "定位点插入 ${Thread.currentThread().name}")
+                traceDataBase.niLocationDao.insert(location)
+            }
+        }
+        //用于定位点捕捉道路
+        viewModelScope.launch(Dispatchers.Default) {
+            mapController.locationLayerHandler.niLocationFlow.collect { location ->
+                Log.e("jingo", "定位点绑定道路 ${Thread.currentThread().name}")
+                location.longitude = testPoint.longitude
+                location.latitude = testPoint.latitude
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                    val linkList = realmOperateHelper.queryLink(
+                        point = GeometryTools.createPoint(
+                            location.longitude,
+                            location.latitude
+                        ),
+                    )
+                    //看板数据
+                    val signList = mutableListOf<SignBean>()
+                    if (linkList.isNotEmpty()) {
+                        val link = linkList[0]
+                        val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid]
+                        mapController.lineHandler.showLine(link.geometry)
+                        linkId?.let {
+                            var elementList = realmOperateHelper.queryLinkByLinkPid(it)
+                            for (element in elementList) {
+                                val distance = GeometryTools.distanceToDouble(
+                                    GeoPoint(
+                                        location.latitude, location.longitude,
+                                    ),
+                                    GeometryTools.createGeoPoint(element.geometry)
+                                )
+                                signList.add(
+                                    SignBean(
+                                        iconId = R.drawable.icon_speed_limit,
+                                        iconText = element.name,
+                                        distance = distance.toInt(),
+                                    )
+                                )
+                            }
+                            liveDataSignList.postValue(signList)
+                            Log.e("jingo", "自动捕捉数据 共${elementList.size}条")
+                        }
+                    }
+                }
+            }
+        }
+
+        //显示轨迹图层
+        mapController.layerManagerHandler.showNiLocationLayer()
     }
 
     /**
@@ -54,6 +161,9 @@ class MainViewModel @Inject constructor(
 
     override fun onCleared() {
         super.onCleared()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            mapController.lineHandler.removeLine()
+        }
     }
 
     //点击相机按钮
@@ -96,49 +206,61 @@ class MainViewModel @Inject constructor(
         })
     }
 
-    fun startSaveTraceThread(context: Context) {
-        Thread(Runnable {
-            try {
-                while (true) {
 
-                    if (niLocationList != null && niLocationList.size > 0) {
+//    fun startSaveTraceThread(context: Context) {
+//        Thread(Runnable {
+//            try {
+//                while (true) {
+//
+//                    if (niLocationList != null && niLocationList.size > 0) {
+//
+//                        var niLocation = niLocationList[0]
+//                        val geometry = GeometryTools.createGeometry(
+//                            GeoPoint(
+//                                niLocation.latitude,
+//                                niLocation.longitude
+//                            )
+//                        )
+//                        val tileX = RealmSet<Int>()
+//                        GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX)
+//                        val tileY = RealmSet<Int>()
+//                        GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY)
+//
+//                        //遍历存储tile对应的x与y的值
+//                        tileX.forEach { x ->
+//                            tileY.forEach { y ->
+//                                niLocation.tilex = x
+//                                niLocation.tiley = y
+//                            }
+//                        }
+//
+//                        TraceDataBase.getDatabase(
+//                            context,
+//                            Constant.USER_DATA_PATH + "/trace.sqlite"
+//                        ).niLocationDao.insert(niLocation)
+//                        niLocationList.remove(niLocation)
+//
+//                        Log.e("qj", "saveTrace==${niLocationList.size}")
+//                    }
+//                    Thread.sleep(30)
+//                }
+//            } catch (e: InterruptedException) {
+//                e.printStackTrace()
+//                Log.e("qj", "异常==${e.message}")
+//            }
+//        }).start()
+//    }
 
-                        var niLocation = niLocationList[0]
-                        val geometry = GeometryTools.createGeometry(GeoPoint(niLocation.latitude,niLocation.longitude))
-                        val tileX = RealmSet<Int>()
-                        GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX)
-                        val tileY = RealmSet<Int>()
-                        GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY)
-
-                        //遍历存储tile对应的x与y的值
-                        tileX.forEach { x ->
-                            tileY.forEach { y ->
-                                niLocation.tilex = x
-                                niLocation.tiley = y
-                            }
-                        }
-
-                        TraceDataBase.getDatabase(context, Constant.USER_DATA_PATH + "/trace.sqlite").niLocationDao.insert(niLocation)
-                        niLocationList.remove(niLocation)
-
-                        Log.e("qj", "saveTrace==${niLocationList.size}")
-                    }
-                    Thread.sleep(30)
-                }
-            } catch (e: InterruptedException) {
-                e.printStackTrace()
-                Log.e("qj", "异常==${e.message}")
-            }
-        }).start()
-    }
-
-    //增加轨迹存储
-    fun addSaveTrace(niLocation: NiLocation) {
-        if (niLocation != null && niLocationList != null) {
-            niLocationList.add(niLocation)
-        }
-    }
+//    //增加轨迹存储
+//    fun addSaveTrace(niLocation: NiLocation) {
+//        if (niLocation != null && niLocationList != null) {
+//            niLocationList.add(niLocation)
+//        }
+//    }
 
+    /**
+     * 处理页面调转
+     */
     fun navigation(activity: MainActivity, list: List<String>) {
         //获取右侧fragment容器
         val naviController = activity.findNavController(R.id.main_activity_right_fragment)
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
new file mode 100644
index 00000000..e024ba5d
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
@@ -0,0 +1,28 @@
+package com.navinfo.omqs.ui.activity.map
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.navinfo.omqs.R
+import com.navinfo.omqs.databinding.AdapterSignBinding
+import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
+import com.navinfo.omqs.ui.other.BaseViewHolder
+
+class SignAdapter : BaseRecyclerViewAdapter<SignBean>() {
+    override fun getItemViewRes(position: Int): Int {
+        return R.layout.adapter_sign
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
+        val viewBinding =
+            AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+        return BaseViewHolder(viewBinding)
+    }
+
+    override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
+        val bd = holder.viewBinding as AdapterSignBinding
+        val item = data[position]
+        bd.signMainIcon.background = holder.viewBinding.root.context.getDrawable(item.iconId)
+        bd.signMainIcon.text = item.iconText
+
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt
new file mode 100644
index 00000000..9ee45b97
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignBean.kt
@@ -0,0 +1,8 @@
+package com.navinfo.omqs.ui.activity.map
+
+data class SignBean(
+    //图标ID
+    val iconId: Int,
+    val distance: Int = 0,
+    val iconText: String = ""
+)
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
index e059f3e5..053e3fe6 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt
@@ -8,7 +8,6 @@ import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import com.navinfo.collect.library.data.entity.QsRecordBean
 import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable
-import com.navinfo.collect.library.map.GeoPoint
 import com.navinfo.collect.library.map.NIMapController
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.omqs.db.RealmOperateHelper
@@ -18,10 +17,10 @@ import io.realm.Realm
 import io.realm.kotlin.where
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
+import org.oscim.core.GeoPoint
 import java.util.*
 import javax.inject.Inject
 
-@RequiresApi(Build.VERSION_CODES.N)
 @HiltViewModel
 class EvaluationResultViewModel @Inject constructor(
     private val roomAppDatabase: RoomAppDatabase,
@@ -59,24 +58,24 @@ class EvaluationResultViewModel @Inject constructor(
     init {
         liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString())
         Log.e("jingo", "EvaluationResultViewModel 创建了 ${hashCode()}")
-        mapController.markerHandle.run {
-            setOnMapClickListener {
-                liveDataQsRecordBean.value!!.geometry = it.toGeometry()
-                addMarker(it, markerTitle)
+        viewModelScope.launch {
+            mapController.onMapClickFlow.collect {
+                liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText()
+                mapController.markerHandle.addMarker(it, markerTitle)
                 viewModelScope.launch {
                     captureLink(it.longitude, it.latitude)
                 }
             }
         }
-
     }
 
     override fun onCleared() {
         super.onCleared()
         Log.e("jingo", "EvaluationResultViewModel 销毁了 ${hashCode()}")
         mapController.markerHandle.removeMarker(markerTitle)
-        mapController.markerHandle.removeOnMapClickListener()
-        mapController.lineHandler.removeLine()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            mapController.lineHandler.removeLine()
+        }
     }
 
 
@@ -90,7 +89,7 @@ class EvaluationResultViewModel @Inject constructor(
         }
         val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint()
         geoPoint?.let {
-            liveDataQsRecordBean.value!!.geometry = it.toGeometry()
+            liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText()
             mapController.markerHandle.addMarker(geoPoint, markerTitle)
             viewModelScope.launch {
                 captureLink(geoPoint.longitude, geoPoint.latitude)
@@ -102,20 +101,23 @@ class EvaluationResultViewModel @Inject constructor(
      * 捕捉到路
      */
     private suspend fun captureLink(longitude: Double, latitude: Double) {
-        val linkList = realmOperateHelper.queryLink(
-            point = GeometryTools.createPoint(
-                longitude,
-                latitude
-            ),
-        )
-        liveDataQsRecordBean.value?.let {
-            if (linkList.isNotEmpty()) {
-                it.linkId =
-                    linkList[0].properties[LinkTable.linkPid] ?: ""
-                mapController.lineHandler.showLine(linkList[0].geometry)
-            } else {
-                it.linkId = ""
-                mapController.lineHandler.removeLine()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            val linkList = realmOperateHelper.queryLink(
+                point = GeometryTools.createPoint(
+                    longitude,
+                    latitude
+                ),
+            )
+
+            liveDataQsRecordBean.value?.let {
+                if (linkList.isNotEmpty()) {
+                    it.linkId =
+                        linkList[0].properties[LinkTable.linkPid] ?: ""
+                    mapController.lineHandler.showLine(linkList[0].geometry)
+                } else {
+                    it.linkId = ""
+                    mapController.lineHandler.removeLine()
+                }
             }
         }
     }
@@ -276,23 +278,26 @@ class EvaluationResultViewModel @Inject constructor(
      */
 
     fun initData(id: String) {
-        viewModelScope.launch(Dispatchers.IO) {
-            val realm = Realm.getDefaultInstance()
-            val objects = realm.where<QsRecordBean>().equalTo("id", id).findFirst()
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            viewModelScope.launch(Dispatchers.IO) {
+                val realm = Realm.getDefaultInstance()
+                val objects = realm.where<QsRecordBean>().equalTo("id", id).findFirst()
 
-            if (objects != null) {
-                oldBean = realm.copyFromRealm(objects)
-                oldBean?.let {
-                    liveDataQsRecordBean.postValue(it.copy())
-                    val p = GeometryTools.createGeoPoint(it.geometry)
-                    mapController.markerHandle.addMarker(
-                        GeoPoint(p.longitude, p.latitude),
-                        markerTitle
-                    )
-                    if (it.linkId.isNotEmpty()) {
-                        val link = realmOperateHelper.queryLink(it.linkId)
-                        link?.let { l ->
-                            mapController.lineHandler.showLine(l.geometry)
+                if (objects != null) {
+                    oldBean = realm.copyFromRealm(objects)
+                    oldBean?.let {
+                        liveDataQsRecordBean.postValue(it.copy())
+                        val p = GeometryTools.createGeoPoint(it.geometry)
+                        mapController.markerHandle.addMarker(
+                            GeoPoint(p.latitude, p.longitude),
+                            markerTitle
+                        )
+
+                        if (it.linkId.isNotEmpty()) {
+                            val link = realmOperateHelper.queryLink(it.linkId)
+                            link?.let { l ->
+                                mapController.lineHandler.showLine(l.geometry)
+                            }
                         }
                     }
                 }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt
index d3020c80..034d5787 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt
@@ -1,7 +1,9 @@
 package com.navinfo.omqs.ui.fragment.evaluationresult
 
+import android.os.Build
 import android.view.LayoutInflater
 import android.view.ViewGroup
+import androidx.annotation.RequiresApi
 import com.navinfo.omqs.R
 import com.navinfo.omqs.databinding.TextItemSelectBinding
 import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
@@ -21,6 +23,7 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null)
         return BaseViewHolder(viewBinding)
     }
 
+    @RequiresApi(Build.VERSION_CODES.M)
     override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
         val bd = holder.viewBinding as TextItemSelectBinding
         val title = data[position]
diff --git a/app/src/main/res/drawable/icon_speed_limit.xml b/app/src/main/res/drawable/icon_speed_limit.xml
new file mode 100644
index 00000000..e6ac7102
--- /dev/null
+++ b/app/src/main/res/drawable/icon_speed_limit.xml
@@ -0,0 +1,12 @@
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="oval"
+    android:useLevel="false">
+    <stroke
+        android:width="1.33dp"
+        android:color="#DB4646" />
+    <size
+        android:width="24dp"
+        android:height="24dp" />
+    <solid android:color="@color/white" />
+
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 40393b4f..1a869281 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -35,6 +35,7 @@
                 app:layout_constraintRight_toRightOf="parent"
                 app:layout_constraintTop_toTopOf="parent" />
 
+
             <ImageButton
                 android:id="@+id/main_activity_person_center"
                 android:layout_width="48dp"
@@ -46,6 +47,14 @@
                 app:layout_constraintLeft_toLeftOf="parent"
                 app:layout_constraintTop_toTopOf="parent" />
 
+            <androidx.recyclerview.widget.RecyclerView
+                android:id="@+id/main_activity_sign_recyclerview"
+                android:layout_width="150dp"
+                android:layout_height="350dp"
+                android:layout_marginTop="10dp"
+                app:layout_constraintLeft_toLeftOf="@id/main_activity_person_center"
+                app:layout_constraintTop_toBottomOf="@id/main_activity_person_center" />
+
             <ImageButton
                 android:id="@+id/main_activity_location"
                 android:layout_width="48dp"
@@ -68,6 +77,16 @@
                 app:layout_constraintBottom_toBottomOf="parent"
                 app:layout_constraintRight_toRightOf="parent" />
 
+            <ImageButton
+                android:id="@+id/main_activity_line"
+                android:layout_width="48dp"
+                android:layout_height="48dp"
+                android:layout_marginBottom="10dp"
+                android:onClick="@{()->mainActivity.voiceOnclick()}"
+                android:src="@drawable/baseline_keyboard_voice_24"
+                app:layout_constraintBottom_toTopOf="@id/main_activity_voice"
+                app:layout_constraintRight_toRightOf="@id/main_activity_voice" />
+
             <fragment
                 android:id="@+id/main_activity_middle_fragment"
                 android:name="androidx.navigation.fragment.NavHostFragment"
@@ -107,11 +126,11 @@
                 android:id="@+id/main_activity_camera2"
                 android:layout_width="48dp"
                 android:layout_height="48dp"
-                android:visibility="gone"
                 android:layout_marginLeft="20dp"
                 android:layout_marginTop="20dp"
                 android:onClick="@{()->mainActivity.openCamera()}"
                 android:src="@drawable/baseline_person_24"
+                android:visibility="gone"
                 app:layout_constraintRight_toRightOf="parent"
                 app:layout_constraintTop_toTopOf="parent" />
 
diff --git a/app/src/main/res/layout/adapter_sign.xml b/app/src/main/res/layout/adapter_sign.xml
new file mode 100644
index 00000000..8e1a9042
--- /dev/null
+++ b/app/src/main/res/layout/adapter_sign.xml
@@ -0,0 +1,20 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@mipmap/bg_sign"
+    tools:context="com.navinfo.omqs.ui.activity.map.SignAdapter">
+
+    <TextView
+        android:id="@+id/sign_main_icon"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="19dp"
+        android:layout_marginTop="4dp"
+        android:background="@drawable/icon_speed_limit"
+        android:gravity="center"
+        android:text="80"
+        android:textColor="#2F2F2F"
+        android:textSize="14.67sp" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-xxhdpi/bg_sign.png b/app/src/main/res/mipmap-xxhdpi/bg_sign.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ba9099815dda6588496994d0ae5a7cb71cbefb4
GIT binary patch
literal 11622
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
CX8;TU

literal 0
HcmV?d00001

diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt
index ed7115f8..714b7442 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/GeoPoint.kt
@@ -1,14 +1,14 @@
-package com.navinfo.collect.library.map
-
-import android.os.Parcelable
-import kotlinx.parcelize.Parcelize
-
-@Parcelize
-data class GeoPoint(
-    var latitude: Double = 0.0,
-    var longitude: Double = 0.0
-) : Parcelable {
-    fun toGeometry(): String {
-        return "POINT($longitude $latitude)"
-    }
-}
\ No newline at end of file
+//package com.navinfo.collect.library.map
+//
+//import android.os.Parcelable
+//import kotlinx.parcelize.Parcelize
+//
+//@Parcelize
+//data class GeoPoint(
+//    var latitude: Double = 0.0,
+//    var longitude: Double = 0.0
+//) : Parcelable {
+//    fun toGeometry(): String {
+//        return "POINT($longitude $latitude)"
+//    }
+//}
\ No newline at end of file
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt
index 8a172a47..9841797c 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt
@@ -1,14 +1,20 @@
 package com.navinfo.collect.library.map
 
-import android.content.Context
-import android.util.Log
+import android.os.Build
+import androidx.annotation.RequiresApi
 import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.lifecycleScope
 import com.navinfo.collect.library.data.entity.NiLocation
 import com.navinfo.collect.library.data.handler.DataNiLocationHandler
+import com.navinfo.collect.library.map.NIMapView.OnMapClickListener
 import com.navinfo.collect.library.map.handler.*
-import com.navinfo.collect.library.map.maphandler.MeasureLayerHandler
+import com.navinfo.collect.library.map.handler.MeasureLayerHandler
 import com.navinfo.collect.library.map.handler.ViewportHandler
 import com.navinfo.collect.library.system.Constant
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.flow.SharedFlow
+import kotlinx.coroutines.launch
+import org.oscim.core.GeoPoint
 
 /**
  *  地图控制器
@@ -25,19 +31,35 @@ class NIMapController {
     lateinit var viewportHandler: ViewportHandler
     lateinit var measureLayerHandler: MeasureLayerHandler
 
-    fun init(context: AppCompatActivity, mapView: NIMapView, options: NIMapOptions? = null, mapPath: String, tracePath: String) {
+    val onMapClickFlow = MutableSharedFlow<GeoPoint>()
+
+    fun init(
+        context: AppCompatActivity,
+        mapView: NIMapView,
+        options: NIMapOptions? = null,
+        mapPath: String,
+        tracePath: String
+    ) {
         Constant.MAP_PATH = mapPath
         layerManagerHandler = LayerManagerHandler(context, mapView, tracePath)
         locationLayerHandler = LocationLayerHandler(context, mapView)
         animationHandler = AnimationHandler(context, mapView)
         markerHandle = MarkHandler(context, mapView)
-        lineHandler = LineHandler(context, mapView)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            lineHandler = LineHandler(context, mapView)
+        }
         polygonHandler = PolygonHandler(context, mapView)
         viewportHandler = ViewportHandler(context, mapView)
-        measureLayerHandler = MeasureLayerHandler(context, mapView)
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            measureLayerHandler = MeasureLayerHandler(context, mapView)
+        }
         mMapView = mapView
+        mMapView.setOnMapClickListener {
+            context.lifecycleScope.launch {
+                onMapClickFlow.emit(it)
+            }
+        }
         mapView.setOptions(options)
-        mMapView.vtmMap.viewport().maxZoomLevel = Constant.MAX_ZOOM // 设置地图的最大级别
     }
 
 
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt
index 796ac2bc..8231bbfa 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapOptions.kt
@@ -1,5 +1,6 @@
 package com.navinfo.collect.library.map
 
+import com.navinfo.collect.library.system.Constant
 import org.json.JSONObject
 
 
@@ -8,6 +9,7 @@ data class NIMapOptions(
     val showZoomControl: Boolean = true, //是否显示zoom按钮
     val zoomLevel: Double = 13.0, /// 地图比例尺初始级别
     val coordinate: NICoordinate = NICoordinate(39.907375, 116.391349),
+    val maxZoom: Int = Constant.MAX_ZOOM
 ) {
     companion object {
         fun fromJson(json: String): NIMapOptions {
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 fb115dd4..e9c64238 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
@@ -1,6 +1,7 @@
 package com.navinfo.collect.library.map;
 
 import android.content.Context;
+import android.os.Build;
 import android.os.Bundle;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
@@ -121,7 +122,7 @@ public final class NIMapView extends RelativeLayout {
          *
          * @param point
          */
-        void onMapClick(com.navinfo.collect.library.map.GeoPoint point);
+        void onMapClick(GeoPoint point);
 
         /**
          * 地图内 Poi 单击事件回调函数
@@ -358,6 +359,7 @@ public final class NIMapView extends RelativeLayout {
             }
             MapPosition mapPosition = getVtmMap().getMapPosition();
             mapPosition.setZoom(options.getZoomLevel());
+            getVtmMap().viewport().setMaxZoomLevel(options.getMaxZoom());
             mapPosition.setPosition(options.getCoordinate().getLatitude(), options.getCoordinate().getLongitude());
             getVtmMap().animator().animateTo(100, mapPosition);
         }
@@ -819,7 +821,9 @@ public final class NIMapView extends RelativeLayout {
         LayoutParams layoutParams = (LayoutParams) view.getLayoutParams();
         if (layoutParams.getRules() != null) {
             for (int i = 0; i < layoutParams.getRules().length; i++) {
-                layoutParams.removeRule(i);
+                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+                    layoutParams.removeRule(i);
+                }
             }
         }
         switch (position) {
@@ -926,7 +930,7 @@ public final class NIMapView extends RelativeLayout {
             GeoPoint geoPoint = mMap.viewport().fromScreenPoint(e.getX(), e.getY());
             if (g instanceof Gesture.Tap) { // 单击事件
                 if (mapClickListener != null) {
-                    mapClickListener.onMapClick(new com.navinfo.collect.library.map.GeoPoint(geoPoint.getLatitude(), geoPoint.getLongitude()));
+                    mapClickListener.onMapClick(geoPoint);
                 }
             } else if (g instanceof Gesture.DoubleTap) { // 双击
                 if (mapDoubleClickListener != null) {
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt
index 2d5bf2e5..4f3d1274 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt
@@ -20,11 +20,11 @@ abstract class BaseHandler(context: AppCompatActivity, mapView: NIMapView) {
         mMapView.vtmMap.layers().remove(layer)
     }
 
-    fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) {
-        mMapView.setOnMapClickListener(listener)
-    }
-
-    fun removeOnMapClickListener() {
-        mMapView.setOnMapClickListener(null)
-    }
+//    fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) {
+//        mMapView.setOnMapClickListener(listener)
+//    }
+//
+//    fun removeOnMapClickListener() {
+//        mMapView.setOnMapClickListener(null)
+//    }
 }
\ No newline at end of file
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
index aafad60d..7e5ab8b8 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
@@ -24,7 +24,7 @@ import java.io.File
 class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePath: String) : BaseHandler(context, mapView) {
     private var baseGroupLayer // 用于盛放所有基础底图的图层组,便于统一管理
             : GroupLayer? = null
-    protected val mTracePath:String = tracePath
+    private val mTracePath:String = tracePath
 
     /**
      * 轨迹渲染图层
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
index ca3ed0b9..8d0af45a 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt
@@ -137,13 +137,12 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
 
     fun showLine(geometry: String) {
         try {
-
+            mDefaultPathLayer.clearPath()
+            mDefaultPathLayer.setPoints(GeometryTools.getGeoPoints(geometry))
+            mDefaultPathLayer.isEnabled = true
         } catch (e: Exception) {
             Toast.makeText(mContext, "高亮路线失败 ${e.message}", Toast.LENGTH_SHORT).show()
         }
-        val g = GeometryTools.getGeoPoints(geometry)
-        mDefaultPathLayer.setPoints(g)
-        mDefaultPathLayer.isEnabled = true
     }
 
     fun removeLine() {
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 4b18e5b2..823510f8 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
@@ -1,27 +1,34 @@
 package com.navinfo.collect.library.map.handler
 
-import android.content.Context
 import android.util.Log
 import android.widget.Toast
 import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.lifecycleScope
 import com.baidu.location.BDAbstractLocationListener
 import com.baidu.location.BDLocation
 import com.baidu.location.LocationClient
 import com.baidu.location.LocationClientOption
 import com.baidu.location.LocationClientOption.LocationMode
 import com.navinfo.collect.library.data.entity.NiLocation
-import com.navinfo.collect.library.map.GeoPoint
 import com.navinfo.collect.library.map.NIMapView
+import kotlinx.coroutines.flow.MutableSharedFlow
+import kotlinx.coroutines.launch
+import org.oscim.core.GeoPoint
 import org.oscim.layers.LocationLayer
 
 
-class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) {
+class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) :
+    BaseHandler(context, mapView) {
 
     private var mCurrentLocation: BDLocation? = null
     private var bFirst = true
     private val mLocationLayer: LocationLayer = LocationLayer(mMapView.vtmMap)
     private lateinit var locationClient: LocationClient
-    private lateinit var niLocationListener: NiLocationListener
+//    private var niLocationListener: NiLocationListener by lazy{
+//
+//    }
+
+    val niLocationFlow = MutableSharedFlow<NiLocation>(5)
 
     init {
         ///添加定位图层到地图,[NIMapView.LAYER_GROUPS.NAVIGATION] 是最上层layer组
@@ -47,20 +54,29 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas
                 //更多结果信息获取说明,请参照类参考中BDLocation类中的说明
 
                 //获取纬度信息
-                val latitude = it.latitude
+//                val latitude = it.latitude
                 //获取经度信息
-                val longitude = it.longitude
+//                val longitude = it.longitude
                 //获取定位精度,默认值为0.0f
-                val radius = it.radius
+//                val radius = it.radius
                 //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
-                val coorType = it.coorType
+//                val coorType = it.coorType
                 //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
                 val errorCode = it.locType
                 mCurrentLocation = it
                 mLocationLayer.setPosition(it.latitude, it.longitude, it.radius)
-                Log.e("qj","location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}")
-                if(niLocationListener!=null){
-                    getCurrentNiLocation()?.let { it1 -> niLocationListener.call(it1) }
+//                Log.e(
+//                    "qj",
+//                    "location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}"
+//                )
+
+//                if (niLocationListener != null) {
+                    getCurrentNiLocation()?.let { it1 ->
+                        mContext.lifecycleScope.launch {
+                            niLocationFlow.emit(it1)
+                        }
+
+//                    }// niLocationListener.call(it1) }
                 }
                 //第一次定位成功显示当前位置
                 if (this.bFirst) {
@@ -107,7 +123,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas
             locationClient.locOption = locationOption
         } catch (e: Throwable) {
             Toast.makeText(mContext, "定位初始化失败 $e", Toast.LENGTH_SHORT)
-            Log.e("qj","定位初始化失败$e")
+            Log.e("qj", "定位初始化失败$e")
         }
     }
 
@@ -160,8 +176,8 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas
 
     //获取当前定位对象
     fun getCurrentNiLocation(): NiLocation? {
-        if(mCurrentLocation!=null){
-            val niLocation:NiLocation = NiLocation()
+        if (mCurrentLocation != null) {
+            val niLocation: NiLocation = NiLocation()
             niLocation.longitude = mCurrentLocation!!.longitude
             niLocation.latitude = mCurrentLocation!!.latitude
             niLocation.direction = mCurrentLocation!!.direction.toDouble()
@@ -186,10 +202,10 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : Bas
         return null
     }
 
-    //设置定位回调
-    fun setNiLocationListener(listener: NiLocationListener){
-        niLocationListener = listener
-    }
+//    //设置定位回调
+//    fun setNiLocationListener(listener: NiLocationListener) {
+//        niLocationListener = listener
+//    }
 }
 
 /**
@@ -205,7 +221,7 @@ private class MyLocationListener(callback: (BDLocation) -> Unit) : BDAbstractLoc
 /**
  * 实现定位回调
  */
-public class NiLocationListener(callback: (NiLocation) -> Unit){
+class NiLocationListener(callback: (NiLocation) -> Unit) {
     val call = callback;
     fun onReceiveLocation(location: NiLocation) {
         call(location)
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 240b6ef5..2c8528c4 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
@@ -10,7 +10,6 @@ import androidx.core.content.res.ResourcesCompat
 import androidx.lifecycle.lifecycleScope
 import com.navinfo.collect.library.R
 import com.navinfo.collect.library.data.entity.QsRecordBean
-import com.navinfo.collect.library.map.GeoPoint
 import com.navinfo.collect.library.map.NIMapView
 import com.navinfo.collect.library.map.cluster.ClusterMarkerItem
 import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer
@@ -27,6 +26,7 @@ import org.oscim.android.canvas.AndroidBitmap
 import org.oscim.backend.CanvasAdapter
 import org.oscim.backend.canvas.Bitmap
 import org.oscim.backend.canvas.Paint
+import org.oscim.core.GeoPoint
 import org.oscim.layers.marker.*
 import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener
 import org.oscim.map.Map
@@ -90,9 +90,10 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
 
             }
         )
-        addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE);
+
         //初始化之间数据图层
         initQsRecordDataLayer()
+        addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE);
         // 设置矢量图层均在12级以上才显示
         mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
             if (e == Map.SCALE_EVENT) {
@@ -127,13 +128,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) :
             val marker = MarkerItem(
                 tempTitle,
                 description,
-                org.oscim.core.GeoPoint(geoPoint.latitude, geoPoint.longitude)
+                geoPoint
             )
             mDefaultMarkerLayer.addItem(marker);
             mMapView.vtmMap.updateMap(true)
         } else {
             marker.description = description
-            marker.geoPoint = org.oscim.core.GeoPoint(geoPoint.latitude, geoPoint.longitude)
+            marker.geoPoint = geoPoint
             mDefaultMarkerLayer.removeItem(marker)
             mDefaultMarkerLayer.addItem(marker)
             mMapView.vtmMap.updateMap(true)
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt
index 41c0cf41..e6b99078 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt
@@ -1,19 +1,17 @@
-package com.navinfo.collect.library.map.maphandler
+package com.navinfo.collect.library.map.handler
 
-import android.content.Context
 import android.graphics.BitmapFactory
 import android.graphics.Canvas
 import android.graphics.Color
+import android.os.Build
 import android.text.TextPaint
-import android.widget.Toast
+import androidx.annotation.RequiresApi
 import androidx.appcompat.app.AppCompatActivity
 import com.navinfo.collect.library.R
 import com.navinfo.collect.library.map.NIMapView
-import com.navinfo.collect.library.map.handler.BaseHandler
 import com.navinfo.collect.library.map.layers.NIPolygonLayer
 import com.navinfo.collect.library.utils.DistanceUtil
 import com.navinfo.collect.library.utils.GeometryTools
-import com.navinfo.collect.library.utils.StringUtil.Companion.createUUID
 import org.oscim.android.canvas.AndroidBitmap
 import org.oscim.backend.CanvasAdapter
 import org.oscim.backend.canvas.Bitmap
@@ -30,6 +28,7 @@ import org.oscim.layers.vector.geometries.Style
 import org.oscim.map.Map
 import java.math.BigDecimal
 
+@RequiresApi(Build.VERSION_CODES.M)
 open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) :
     BaseHandler(context, mapView), Map.UpdateListener {
 
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java
index e9cd2426..e0855bb1 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/GeometryTools.java
@@ -418,7 +418,7 @@ public class GeometryTools {
             Geometry startGeo = createGeometry(startGeoPoint);
             Geometry endGeo = createGeometry(endGeoPoint);
             double d = startGeo.distance(endGeo);
-            return d * 100000;
+            return convertDistanceToDegree(d,startGeoPoint.getLatitude());
         }
         return 0;