diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json
index 994a1511..a211f51e 100644
--- a/app/src/main/assets/omdb_config.json
+++ b/app/src/main/assets/omdb_config.json
@@ -101,7 +101,12 @@
             "code": 4001,
             "name": "路口",
 			"transformer": [
-
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "generateIntersectionReference()"
+				}
 			]
         },
 		"4002": {
@@ -170,7 +175,31 @@
 					"k": "geometry",
 					"v": "~",
 					"klib": "geometry",
-					"vlib": "generateRestrictionRerference()"
+					"vlib": "checkCircleRoad()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "translateBack()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "translateRight()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "generateS2EReferenceLine()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "generateDirectReferenceLine()"
 				}
 			]
 		},
@@ -179,7 +208,30 @@
 			"code": 4010,
 			"name": "电子眼",
 			"transformer": [
-
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "translateRight()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "generateS2EReferenceLine()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "generateDirectReferenceLine(direct=3)"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "generateElectronName()"
+				}
 			]
 		},
 		"4022": {
@@ -187,12 +239,6 @@
 			"code": 4022,
 			"name": "交通灯",
 			"transformer": [
-				{
-					"k": "angle",
-					"v": "~",
-					"klib": "angle",
-					"vlib": "0"
-				}
 			]
 		},
 		"4601":{
@@ -200,7 +246,24 @@
 			"code": 4601,
 			"name": "车信",
 			"transformer": [
-
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "translateBack()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "translateRight()"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "generateDirectReferenceLine()"
+				}
 			]
 		},
         "5001":{
diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt
index 1e15ce0d..5c6683b2 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt
@@ -2,6 +2,8 @@ package com.navinfo.omqs.bean
 
 import com.navinfo.collect.library.data.entity.RenderEntity
 import com.navinfo.omqs.db.ImportPreProcess
+import kotlin.reflect.KFunction
+import kotlin.reflect.KParameter
 import kotlin.reflect.full.declaredMemberFunctions
 
 
@@ -11,7 +13,7 @@ class ImportConfig {
     var checked : Boolean = true
     val preProcess: ImportPreProcess = ImportPreProcess()
 
-    fun transformProperties(renderEntity: RenderEntity): RenderEntity {
+    fun transformProperties(renderEntity: RenderEntity): RenderEntity? {
         val transformList = tableMap[renderEntity.code.toString()]?.transformer
         if (transformList.isNullOrEmpty()) {
             return renderEntity
@@ -29,23 +31,66 @@ class ImportConfig {
             // 如果key和value都为空,说明当前数据需要增加一个新字段
             if (key.isNullOrEmpty()&&value.isNullOrEmpty()&&!renderEntity.properties.containsKey(keylib)) {
                 renderEntity.properties[keylib] = valuelib
+                continue
             }
             // 开始解析key和value,并对数据进行匹配
             m@ for (k in processKeyOrValue(key)) {
                 if (renderEntity.properties.containsKey(k)) { // json配置的key可以匹配到数据
                     for (v in processKeyOrValue(value)) {
                         if ("~" == v ) { // ~符可以匹配任意元素
-                            if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法
-                                val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") }
-                                method.call(preProcess, renderEntity)
+                            if (valuelib.endsWith(")")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法
+                                // 获取方法名
+                                val methodName = valuelib.substringBefore("(")
+                                // 获取参数
+                                val params: List<String> = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() }
+                                val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*>
+
+                                val methodParams = method.parameters
+                                val callByParams = mutableMapOf<KParameter, Any>(
+                                    methodParams[0] to preProcess,
+                                    methodParams[1] to renderEntity
+                                )
+                                for ((index, value) in params.withIndex()) {
+                                    // 前2个参数确定为对象本身和RenderEntity,因此自定义参数从index+2开始设置
+                                    if (methodParams.size>index+2) {
+                                        callByParams[methodParams[index+2]] = value
+                                    }
+                                }
+                                when(val result = method.callBy(callByParams)) { // 如果方法返回的数据类型是boolean,且返回为false,则该数据不处理
+                                    is Boolean ->
+                                        if (!result) {
+                                            return null
+                                        }
+                                }
                             } else {
                                 renderEntity.properties[keylib] = valuelib
                             }
                             break@m
                         } else if (renderEntity.properties[k] == v) { // 完全匹配
-                            if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法
-                                val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") }
-                                method.call(preProcess, renderEntity)
+                            if (valuelib.endsWith(")")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法
+                                // 获取方法名
+                                val methodName = valuelib.substringBefore("(")
+                                // 获取参数
+                                val params: List<String> = valuelib.substringAfter("(").substringBefore(")").split(",").filter{ it.isNotEmpty() }.map { it.trim() }
+                                val method = preProcess::class.members.filter { it.name == methodName }.first() as KFunction<*>
+
+                                val methodParams = method.parameters
+                                val callByParams = mutableMapOf<KParameter, Any>(
+                                    methodParams[0] to preProcess,
+                                    methodParams[1] to renderEntity
+                                )
+                                for ((index, value) in params.withIndex()) {
+                                    // 前2个参数确定为对象本身和RenderEntity,因此自定义参数从index+2开始设置
+                                    if (methodParams.size>index+2) {
+                                        callByParams[methodParams[index+2]] = value
+                                    }
+                                }
+                                when(val result = method.callBy(callByParams)) {
+                                    is Boolean ->
+                                        if (!result) {
+                                            return null
+                                        }
+                                }
                             } else {
                                 renderEntity.properties[keylib] = valuelib
                             }
diff --git a/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt b/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt
new file mode 100644
index 00000000..db19a444
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/bean/RoadNameBean.kt
@@ -0,0 +1,49 @@
+package com.navinfo.omqs.bean
+
+data class RoadNameBean(
+    /**
+     * 道路名称
+     */
+    val name: String = "",
+    /**
+     * 0 普通
+     * 1 立交桥名(连接路)
+     * 2 立交桥名 (主路)
+     * 3 风景线路
+     * 5 隧道
+     * 6 虚拟名称
+     */
+    val type: Int = 0,
+    /**
+     * 1 不论“名称分类”是官方名,别名还是曾用名都统一从1开始递增
+     * 2 若取第一官方名时,需判断“名称”分类 [nameClass]=="官方名",且[seqNum] 最小的
+     */
+    val seqNum: Int = 1,
+    /**
+     * 1 官方名
+     * 2 别名
+     * 3 曾用名
+     */
+    val nameClass: Int = 1,
+) {
+    fun getNameClassStr(): String {
+        when (nameClass) {
+            1 -> return "官方名"
+            2 -> return "别名"
+            3 -> return "曾用名"
+        }
+        return ""
+    }
+
+    fun getTypeStr(): String {
+        when (type) {
+            0 -> return "普通"
+            1 -> return "立交桥名(连接路)"
+            2 -> return "立交桥名(主路)"
+            3 -> return "风景线路"
+            5 -> return "隧道"
+            6 -> return "虚拟名称"
+        }
+        return ""
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt
index b5faa214..492127f3 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt
@@ -1,6 +1,7 @@
 package com.navinfo.omqs.bean
 
 import android.os.Parcelable
+import com.navinfo.collect.library.data.entity.RenderEntity
 import kotlinx.parcelize.Parcelize
 
 @Parcelize
@@ -11,20 +12,14 @@ data class SignBean(
     val distance: Int = 0,
     //左上图标中的文字
     val iconText: String = "",
-    //绑定的要素id
-    val elementId: String = "",
     //绑定的linkid
     val linkId: String,
-    //坐标
-    val geometry: String,
     //名称
     val name: String,
+    //是否要展示详细信息
+    val isMoreInfo: Boolean = false,
     //底部右侧文字
     val bottomRightText: String = "",
-    //要素code类型
-    val elementCode: Int,
-    //需要展示更多的内容
-    val moreText: String = "",
-    //左上角信息
-    val topRightText: String = ""
+    //捕捉数据
+    val renderEntity: RenderEntity
 ) : Parcelable
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/db/Code2NameMap.kt b/app/src/main/java/com/navinfo/omqs/db/Code2NameMap.kt
new file mode 100644
index 00000000..40a09740
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/db/Code2NameMap.kt
@@ -0,0 +1,43 @@
+package com.navinfo.omqs.db
+
+class Code2NameMap {
+    val electronEyeKindMap = mapOf(
+        1 to "超高",
+        2 to "超低",
+        3 to "移动",
+        4 to "可变",
+        5 to "分车道",
+        6 to "分车种",
+        7 to "车灯",
+        8 to "占车道",
+        9 to "过路口",
+        10 to "闯红灯",
+        11 to "路况",
+        12 to "单行",
+        13 to "非机动",
+        14 to "出入口",
+        15 to "公交",
+        16 to "禁转",
+        17 to "掉头",
+        18 to "应急",
+        19 to "标线",
+        20 to "区间S",
+        21 to "区间E",
+        22 to "停车",
+        23 to "尾号",
+        24 to "环保",
+        25 to "安全带",
+        26 to "手机",
+        27 to "行人",
+        28 to "禁令",
+        29 to "鸣笛",
+        30 to "年检",
+        31 to "尾气",
+        32 to "交通灯",
+        33 to "专用",
+        34 to "标线",
+        35 to "违章",
+        36 to "卡车",
+        37 to "限时长",
+    )
+}
\ No newline at end of file
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 ae976c3c..64ac2675 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt
@@ -146,7 +146,7 @@ class ImportOMDBHelper @AssistedInject constructor(
                         it.name == currentConfig.table
                     }
 
-                    val listResult = mutableListOf<Map<String, Any>>()
+                    val listResult = mutableListOf<RenderEntity>()
                     currentConfig?.let {
                         val list = FileIOUtils.readFile2List(txtFile, "UTF-8")
                         Log.d("ImportOMDBHelper", "开始解析:${txtFile?.name}")
@@ -159,33 +159,38 @@ class ImportOMDBHelper @AssistedInject constructor(
                                 map["qi_table"] = currentConfig.table
                                 map["qi_name"] = currentConfig.name
                                 map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key
-                                listResult.add(map)
+
+                                // 先查询这个mesh下有没有数据,如果有则跳过即可
+                                // val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst()
+                                val renderEntity = RenderEntity()
+                                renderEntity.code = map["qi_code"].toString().toInt()
+                                renderEntity.name = map["qi_name"].toString()
+                                renderEntity.table = map["qi_table"].toString()
+                                // 其他数据插入到Properties中
+                                renderEntity.geometry = map["geometry"].toString()
+                                for ((key, value) in map) {
+                                    when (value) {
+                                        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())
+                                    }
+                                }
+                                listResult.add(renderEntity)
+                                // 对renderEntity做预处理后再保存
+                                val resultEntity = importConfig.transformProperties(renderEntity)
+                                if (resultEntity!=null) {
+                                    Realm.getDefaultInstance().insert(renderEntity)
+                                }
                             }
                         }
                     }
-                    for (map in listResult) { // 每一个map就是Realm的一条数据
-                        // 先查询这个mesh下有没有数据,如果有则跳过即可
-//                    val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst()
-                        val renderEntity = RenderEntity()
-                        renderEntity.code = map["qi_code"].toString().toInt()
-                        renderEntity.name = map["qi_name"].toString()
-                        renderEntity.table = map["qi_table"].toString()
-                        // 其他数据插入到Properties中
-                        renderEntity.geometry = map["geometry"].toString()
-                        for ((key, value) in map) {
-                            when (value) {
-                                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())
-                            }
-                        }
-                        // 对renderEntity做预处理后再保存
-                        importConfig.transformProperties(renderEntity)
-                        Realm.getDefaultInstance().copyToRealm(renderEntity)
-                    }
                     // 1个文件发送一次flow流
                     emit("${index + 1}/${importConfig.tableMap.size}")
+                    // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用
+                    if (currentConfig.table == "OMDB_RD_LINK") {
+                        importConfig.preProcess.cacheRdLink = listResult.associateBy { it.properties["linkPid"] }
+                    }
                 }
                 Realm.getDefaultInstance().commitTransaction()
             } catch (e: Exception) {
diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreCacheData.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreCacheData.kt
new file mode 100644
index 00000000..2eacb95f
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreCacheData.kt
@@ -0,0 +1,5 @@
+package com.navinfo.omqs.db
+
+class ImportPreCacheData {
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
index 55b5d4b7..de475584 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -1,5 +1,6 @@
 package com.navinfo.omqs.db
 
+import android.util.Log
 import com.navinfo.collect.library.data.entity.ReferenceEntity
 import com.navinfo.collect.library.data.entity.RenderEntity
 import com.navinfo.collect.library.utils.GeometryTools
@@ -13,29 +14,55 @@ import org.oscim.core.GeoPoint
 
 
 class ImportPreProcess {
-    /**
-     * 预处理所需要的函数
-     * */
-    fun foo(renderEntity: RenderEntity): RenderEntity {
-        println("foo")
-        renderEntity.properties["foo"] = "bar"
-        return renderEntity
-    }
+    val code2NameMap = Code2NameMap()
+    lateinit var cacheRdLink: Map<String?, RenderEntity>
 
+    fun checkCircleRoad(renderEntity: RenderEntity): Boolean {
+        val linkInId  = renderEntity.properties["linkIn"]
+        val linkOutId  = renderEntity.properties["linkOut"]
+        // 根据linkIn和linkOut获取对应的link数据
+        val linkInEntity = cacheRdLink[linkInId]
+        val linkOutEntity = cacheRdLink[linkOutId]
+        Log.d("checkCircleRoad", "LinkInEntity: ${linkInId}- ${linkInEntity?.properties?.get("snodePid")},LinkOutEntity: ${linkOutId}- ${linkOutEntity?.properties?.get("enodePid")}")
+        // 查询linkIn的sNode和linkOut的eNode是否相同,如果相同,认为数据是环形路口,返回false
+        if (linkInEntity!=null&&linkOutEntity!=null) {
+            if (linkInEntity.properties["snodePid"] == linkOutEntity.properties["enodePid"] || linkInEntity.properties["enodePid"] == linkOutEntity.properties["snodePid"]
+                || linkInEntity.properties["snodePid"] == linkOutEntity.properties["snodePid"]|| linkInEntity.properties["enodePid"] == linkOutEntity.properties["enodePid"])
+            return false
+        }
+        return true
+    }
     /**
      * 计算指定数据指定方向的坐标
+     * @param direction 判断当前数据是否为逆向,给定的应该是一个a=b的表达式,a为对应的properties的key,b为对应的值
      * */
-    fun translateRight(renderEntity: RenderEntity): RenderEntity {
+    fun translateRight(renderEntity: RenderEntity, direction: String = "") {
         // 获取当前renderEntity的geometry
         val geometry = renderEntity.wkt
         var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
         var point = Coordinate(geometry?.coordinate)
-        if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
-            val angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
+        var isReverse = false // 是否为逆向
+        if (direction.isNotEmpty()) {
+            val paramDirections = direction.split("=")
+            if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) {
+                isReverse = true;
+            }
+        }
+        if (Geometry.TYPENAME_POINT == geometry?.geometryType) { // angle为与正北方向的顺时针夹角
+            var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
+            if (isReverse) {
+                angle += 180
+            }
+            // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角
+            angle=(450-angle)%360
             radian = Math.toRadians(angle)
         } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) {
-            val p1: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 2)
-            val p2: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 1)
+            var coordinates = geometry.coordinates
+            if (isReverse) {
+                coordinates = coordinates.reversedArray()
+            }
+            val p1: Coordinate = coordinates.get(coordinates.size - 2)
+            val p2: Coordinate = coordinates.get(coordinates.size - 1)
             // 计算线段的方向
             radian = Angle.angle(p1, p2)
             point = p2
@@ -52,46 +79,130 @@ class ImportPreProcess {
         // 将这个点记录在数据中
         val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y))
         renderEntity.geometry = geometryTranslate.toString()
-        return renderEntity
     }
 
     /**
-     * 将要素按照点位角度的垂直方向右移5米,并生成一个按照垂直角度指向方向的线段,用以显示有方向的图标
+     * 向方向对应的反方向偏移
      * */
-    fun translateRightWithAngle(renderEntity: RenderEntity): RenderEntity {
+    fun translateBack(renderEntity: RenderEntity, direction: String = "") {
         // 获取当前renderEntity的geometry
         val geometry = renderEntity.wkt
+        var isReverse = false // 是否为逆向
+        if (direction.isNotEmpty()) {
+            val paramDirections = direction.split("=")
+            if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) {
+                isReverse = true;
+            }
+        }
         var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
         var point = Coordinate(geometry?.coordinate)
         if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
-            // angle为正北方向夹角,需要将其转换为与正东方向夹角
             var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
-            angle-=90
+            if (isReverse) {
+                angle += 180
+            }
+            // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角
+            angle=(450-angle)%360
             radian = Math.toRadians(angle)
         } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) {
-            val p1: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 2)
-            val p2: Coordinate = geometry.coordinates.get(geometry.coordinates.size - 1)
+            var coordinates = geometry.coordinates
+            if (isReverse) {
+                coordinates = coordinates.reversedArray()
+            }
+            val p1: Coordinate = coordinates.get(coordinates.size - 2)
+            val p2: Coordinate = coordinates.get(coordinates.size - 1)
             // 计算线段的方向
             radian = Angle.angle(p1, p2)
             point = p2
         }
 
-        // 根据角度计算偏移距离
+        // 计算偏移距离
         val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian)
         val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian)
 
         // 计算偏移后的点
-//        val coordMid =
-//            Coordinate(point.getX() + dy, point.getY() - dx)
-        // 计算指定距离外与当前位置成90度夹角的点位
-        val pointStart = GeoPoint(point.getY() - dx, point.getX() + dy)
-//        val pointStart = GeoPoint(pointMid.latitude-dy, pointMid.longitude-dx)
-        val pointEnd = GeoPoint(pointStart.latitude- dx, pointStart.longitude+ dy)
+        val coord =
+            Coordinate(point.getX() - dx, point.getY() - dy)
 
-        // 将这个线记录在数据中
-        val geometryTranslate: Geometry = GeometryTools.createLineString(listOf(pointStart, pointEnd))
+        // 将这个点记录在数据中
+        val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y))
         renderEntity.geometry = geometryTranslate.toString()
-        return renderEntity
+    }
+
+    /**
+     * 生成偏移后数据的起终点参考线
+     * */
+    fun generateS2EReferenceLine(renderEntity: RenderEntity) {
+        // 获取当前renderEntity的geometry,该坐标为偏移后坐标,即为终点
+        val translateGeometry = renderEntity.wkt
+        val startGeometry = GeometryTools.createGeometry(renderEntity.properties["geometry"])
+
+        val pointEnd = translateGeometry!!.coordinates[translateGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标
+        val pointStart = startGeometry!!.coordinates[startGeometry.numPoints-1] // 获取这个geometry对应的结束点坐标
+
+        // 将这个起终点的线记录在数据中
+        val startEndReference = ReferenceEntity()
+        startEndReference.renderEntityId = renderEntity.id
+        startEndReference.name = "${renderEntity.name}参考线"
+        startEndReference.table = renderEntity.table
+        // 起终点坐标组成的线
+        startEndReference.geometry = GeometryTools.createLineString(arrayOf<Coordinate>(pointStart, pointEnd)).toString()
+        startEndReference.properties["qi_table"] = renderEntity.table
+        startEndReference.properties["type"] = "s_2_e"
+        Realm.getDefaultInstance().insert(startEndReference)
+    }
+
+    /**
+     * 生成与对应方向相同的方向线,用以绘制方向箭头
+     * */
+    fun generateDirectReferenceLine(renderEntity: RenderEntity, direction: String = "") {
+        // 根据数据或angle计算方向对应的角度和偏移量
+        val geometry = renderEntity.wkt
+        var isReverse = false // 是否为逆向
+        if (direction.isNotEmpty()) {
+            val paramDirections = direction.split("=")
+            if (paramDirections.size>=2 && renderEntity.properties[paramDirections[0].trim()] == paramDirections[1].trim()) {
+                isReverse = true;
+            }
+        }
+        var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
+        var point = Coordinate(geometry?.coordinate)
+        if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
+            point = Coordinate(geometry?.coordinate)
+            var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
+            if (isReverse) {
+                angle += 180
+            }
+            // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角
+            angle=(450-angle)%360
+            radian = Math.toRadians(angle)
+        } else if (Geometry.TYPENAME_LINESTRING == geometry?.geometryType) {
+            var coordinates = geometry.coordinates
+            if (isReverse) {
+                coordinates = coordinates.reversedArray()
+            }
+            val p1: Coordinate = coordinates.get(coordinates.size - 2)
+            val p2: Coordinate = coordinates.get(coordinates.size - 1)
+            // 计算线段的方向
+            radian = Angle.angle(p1, p2)
+            point = p2
+        }
+
+        // 计算偏移距离
+        val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian)
+        val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian)
+
+        val coorEnd = Coordinate(point.getX() + dx, point.getY() + dy)
+
+        val angleReference = ReferenceEntity()
+        angleReference.renderEntityId = renderEntity.id
+        angleReference.name = "${renderEntity.name}参考方向"
+        angleReference.table = renderEntity.table
+        // 与原有方向指向平行的线
+        angleReference.geometry = GeometryTools.createLineString(arrayOf(point, coorEnd)).toString()
+        angleReference.properties["qi_table"] = renderEntity.table
+        angleReference.properties["type"] = "angle"
+        Realm.getDefaultInstance().insert(angleReference)
     }
 
     fun addAngleFromGeometry(renderEntity: RenderEntity): String {
@@ -143,54 +254,11 @@ class ImportPreProcess {
         }
     }
 
+
+
     /**
-     * 自动生成普通交限的参考数据
+     * 生成默认道路名数据
      * */
-    fun generateRestrictionRerference(renderEntity: RenderEntity) {
-        // 获取当前renderEntity的geometry
-        val geometry = renderEntity.wkt
-        var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
-        var point = Coordinate(geometry?.coordinate)
-        if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
-            var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
-            radian = Math.toRadians(angle)
-        }
-
-        // 计算偏移距离
-        val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian)
-        val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian)
-
-        // 计算偏移后的点
-        val pointTranS =
-            GeoPoint(point.getY() - dx, point.getX() + dy) // 向右偏移的点
-
-        // 计算与原有方向平行的终点坐标
-        val pointTranE = GeoPoint(pointTranS.latitude + dy, pointTranS.longitude + dx)
-
-        renderEntity.geometry = GeometryTools.createGeometry(pointTranS).toString()
-
-        // 将这个点记录在数据中
-        val startEndReference = ReferenceEntity()
-        startEndReference.renderEntityId = renderEntity.id
-        startEndReference.name = "普通交限参考线"
-        startEndReference.table = renderEntity.table
-        // 起终点坐标组成的线
-        startEndReference.geometry = GeometryTools.createLineString(listOf(GeoPoint(point.y, point.x), pointTranS)).toString()
-        startEndReference.properties["qi_table"] = renderEntity.table
-        startEndReference.properties["type"] = "s_2_e"
-        Realm.getDefaultInstance().insert(startEndReference)
-
-        val angleReference = ReferenceEntity()
-        angleReference.renderEntityId = renderEntity.id
-        angleReference.name = "普通交限参考方向"
-        angleReference.table = renderEntity.table
-        // 与原有方向指向平行的线
-        angleReference.geometry = GeometryTools.createLineString(listOf(pointTranS, pointTranE)).toString()
-        angleReference.properties["qi_table"] = renderEntity.table
-        angleReference.properties["type"] = "angle"
-        Realm.getDefaultInstance().insert(angleReference)
-    }
-
     fun generateRoadName(renderEntity: RenderEntity) {
         // LinkName的真正名称数据,是保存在properties的shapeList中的,因此需要解析shapeList数据
         var shape :JSONObject? = null
@@ -217,4 +285,39 @@ class ImportPreProcess {
             renderEntity.properties["name"] = ""
         }
     }
+
+    /**
+     * 生成电子眼对应的渲染名称
+     * */
+    fun generateElectronName(renderEntity: RenderEntity) {
+        // 解析电子眼的kind,将其转换为渲染的简要名称
+        var shape :JSONObject? = null
+        if (renderEntity.properties.containsKey("kind")) {
+            renderEntity.properties["name"] = code2NameMap.electronEyeKindMap[renderEntity.properties["kind"].toString().toInt()]
+        } else {
+            renderEntity.properties["name"] = ""
+        }
+    }
+
+    /**
+     * 生成默认路口数据的参考数据
+     * */
+    fun generateIntersectionReference(renderEntity: RenderEntity) {
+        // 路口数据的其他点位,是保存在nodeList对应的数组下
+        if (renderEntity.properties.containsKey("nodeList")) {
+            val nodeListJsonArray: JSONArray = JSONArray(renderEntity.properties["nodeList"])
+            for (i in 0 until nodeListJsonArray.length()) {
+                val nodeJSONObject = nodeListJsonArray.getJSONObject(i)
+                val intersectionReference = ReferenceEntity()
+                intersectionReference.renderEntityId = renderEntity.id
+                intersectionReference.name = "${renderEntity.name}参考点"
+                intersectionReference.table = renderEntity.table
+                // 与原有方向指向平行的线
+                intersectionReference.geometry = GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString()
+                intersectionReference.properties["qi_table"] = renderEntity.table
+                intersectionReference.properties["type"] = "node"
+                Realm.getDefaultInstance().insert(intersectionReference)
+            }
+        }
+    }
 }
\ 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 30aef395..8edb79c4 100644
--- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt
@@ -44,7 +44,7 @@ class RealmOperateHelper() {
         )
         // 根据polygon查询相交的tile号
         val tileXSet = mutableSetOf<Int>()
-        tileXSet.toString()
+
         GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet)
         val tileYSet = mutableSetOf<Int>()
         GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet)
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 df299262..e9d14e89 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
@@ -31,6 +31,7 @@ import com.navinfo.omqs.ui.activity.BaseActivity
 import com.navinfo.omqs.ui.fragment.console.ConsoleFragment
 import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment
 import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment
+import com.navinfo.omqs.ui.fragment.signMoreInfo.SignMoreInfoFragment
 import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment
 import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration
 import com.navinfo.omqs.util.FlowEventBus
@@ -56,10 +57,11 @@ class MainActivity : BaseActivity() {
      */
     private var leftFragment: Fragment? = null
 
+
     /**
      * 是否开启右侧面板
      */
-    var switchFragment = false
+    private var switchFragment = false
 
     /**
      * 检测是否含有tts插件
@@ -88,6 +90,7 @@ class MainActivity : BaseActivity() {
      */
     private val signAdapter by lazy {
         SignAdapter(object : OnSignAdapterClickListener {
+            //点击看板进去问题反馈面板
             override fun onItemClick(signBean: SignBean) {
                 rightController.currentDestination?.let {
                     if (it.id == R.id.RightEmptyFragment) {
@@ -99,14 +102,15 @@ class MainActivity : BaseActivity() {
                 }
             }
 
+            //点击详细信息
             override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) {
-                if (binding.mainActivitySignMoreInfoGroup.visibility != View.VISIBLE || selectTag != tag) {
-                    binding.mainActivitySignMoreInfoGroup.visibility = View.VISIBLE
-                    binding.mainActivitySignMoreInfoTitle.text = signBean.name
-                    binding.mainActivitySignMoreInfoText1.text = signBean.bottomRightText
-                    binding.mainActivitySignMoreInfoText2.text = signBean.moreText
-                } else {
-                    binding.mainActivitySignMoreInfoGroup.visibility = View.GONE
+                viewModel.showSignMoreInfo(signBean.renderEntity)
+                val fragment =
+                    supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment)
+                if (fragment == null) {
+                    supportFragmentManager.beginTransaction()
+                        .replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment())
+                        .commit()
                 }
             }
 
@@ -120,10 +124,6 @@ class MainActivity : BaseActivity() {
                     }
                 }
             }
-
-            override fun onHideMoreInfoView() {
-                binding.mainActivitySignMoreInfoGroup.visibility = View.GONE
-            }
         })
     }
 
@@ -182,12 +182,12 @@ class MainActivity : BaseActivity() {
             }
             v?.onTouchEvent(event) ?: true
         }
-
+        //捕捉列表变化回调
         viewModel.liveDataQsRecordIdList.observe(this) {
             //处理页面跳转
             viewModel.navigationRightFragment(this, it)
         }
-
+        //右上角菜单是否被点击
         viewModel.liveDataMenuState.observe(this) {
             binding.mainActivityMenu.isSelected = it
             if (it == true) {
@@ -196,6 +196,17 @@ class MainActivity : BaseActivity() {
                 binding.mainActivityMenuGroup.visibility = View.INVISIBLE
             }
         }
+        //道路绑定,名称变化
+        viewModel.liveDataRoadName.observe(this) {
+            if (it != null) {
+                binding.mainActivityRoadName.text = it.properties["name"]
+                if (binding.mainActivityRoadName.visibility != View.VISIBLE) binding.mainActivityRoadName.visibility =
+                    View.VISIBLE
+            } else {
+                if (binding.mainActivityRoadName.visibility != View.GONE) binding.mainActivityRoadName.visibility =
+                    View.GONE
+            }
+        }
 
         //道路属性面板
         binding.mainActivityTopSignRecyclerview.layoutManager = LinearLayoutManager(
@@ -226,15 +237,14 @@ class MainActivity : BaseActivity() {
         viewModel.liveDataTopSignList.observe(this) {
             topSignAdapter.refreshData(it)
         }
+
         //监听地图中点变化
         viewModel.liveDataCenterPoint.observe(this) {
-            Log.e("qj", "${it.longitude}")
             try {
                 if (it != null && it.longitude != null && it.latitude != null) {
                     binding.mainActivityGeometry.text = "经纬度:${
                         BigDecimal(it.longitude).setScale(
-                            7,
-                            RoundingMode.HALF_UP
+                            7, RoundingMode.HALF_UP
                         )
                     },${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}"
                 }
@@ -243,6 +253,16 @@ class MainActivity : BaseActivity() {
             }
         }
 
+        viewModel.liveDataSignMoreInfo.observe(this){
+            val fragment =
+                supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment)
+            if (fragment == null) {
+                supportFragmentManager.beginTransaction()
+                    .replace(R.id.main_activity_sign_more_info_fragment, SignMoreInfoFragment())
+                    .commit()
+            }
+        }
+
         lifecycleScope.launch {
             // 初始化地图图层控制接收器
             FlowEventBus.subscribe<List<ImportConfig>>(
@@ -473,8 +493,7 @@ class MainActivity : BaseActivity() {
             }
             leftFragment = TaskManagerFragment {
                 binding.mainActivityLeftFragment.visibility = View.GONE
-                supportFragmentManager.beginTransaction()
-                    .remove(leftFragment!!).commit()
+                supportFragmentManager.beginTransaction().remove(leftFragment!!).commit()
                 leftFragment = null
                 null
             }
@@ -494,8 +513,7 @@ class MainActivity : BaseActivity() {
             }
             leftFragment = QsRecordListFragment {
                 binding.mainActivityLeftFragment.visibility = View.GONE
-                supportFragmentManager.beginTransaction()
-                    .remove(leftFragment!!).commit()
+                supportFragmentManager.beginTransaction().remove(leftFragment!!).commit()
                 leftFragment = null
                 null
             }
@@ -522,8 +540,7 @@ class MainActivity : BaseActivity() {
             }
             leftFragment = OfflineMapFragment {
                 binding.mainActivityLeftFragment.visibility = View.GONE
-                supportFragmentManager.beginTransaction()
-                    .remove(leftFragment!!).commit()
+                supportFragmentManager.beginTransaction().remove(leftFragment!!).commit()
                 leftFragment = null
                 null
             }
@@ -531,4 +548,13 @@ class MainActivity : BaseActivity() {
                 .replace(R.id.main_activity_left_fragment, leftFragment!!).commit()
         }
     }
+
+    /**
+     * 打开道路名称属性看板,选择的道路在viewmodel里记录,不用
+     */
+    fun openRoadNameFragment() {
+        if (viewModel.liveDataRoadName.value != null) {
+            viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!)
+        }
+    }
 }
\ No newline at end of file
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 78e29e3f..de2fd24f 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
@@ -31,6 +31,7 @@ import com.navinfo.collect.library.utils.GeometryToolsKt
 import com.navinfo.omqs.Constant
 import com.navinfo.omqs.R
 import com.navinfo.omqs.bean.ImportConfig
+import com.navinfo.omqs.bean.RoadNameBean
 import com.navinfo.omqs.bean.SignBean
 import com.navinfo.omqs.db.RealmOperateHelper
 import com.navinfo.omqs.ui.dialog.CommonDialog
@@ -76,6 +77,14 @@ class MainViewModel @Inject constructor(
     //顶部看板数据
     val liveDataTopSignList = MutableLiveData<List<SignBean>>()
 
+    //道路名
+    val liveDataRoadName = MutableLiveData<RenderEntity?>()
+
+    /**
+     * 当前选中的要展示的详细信息的要素
+     */
+    val liveDataSignMoreInfo = MutableLiveData<RenderEntity>()
+
 //    var testPoint = GeoPoint(0, 0)
 
     //uuid标识,用于记录轨迹组
@@ -93,6 +102,7 @@ class MainViewModel @Inject constructor(
 
     var menuState: Boolean = false
 
+
     val liveDataMenuState = MutableLiveData<Boolean>()
 
     val liveDataCenterPoint = MutableLiveData<MapPosition>()
@@ -107,8 +117,8 @@ class MainViewModel @Inject constructor(
     init {
         mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition ->
             when (e) {
-                Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT ->
-                    liveDataCenterPoint.value = mapPosition
+                Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value =
+                    mapPosition
             }
         })
 
@@ -213,6 +223,7 @@ class MainViewModel @Inject constructor(
             val linkList = realmOperateHelper.queryLink(
                 point = point,
             )
+            var hisRoadName = false
             if (linkList.isNotEmpty()) {
                 //看板数据
                 val signList = mutableListOf<SignBean>()
@@ -225,11 +236,17 @@ class MainViewModel @Inject constructor(
 
                 if (linkIdCache != linkId) {
 
-                    Log.e("jingo", "捕捉到的linkid $linkId ${link.geometry}")
                     mapController.lineHandler.showLine(link.geometry)
                     linkId?.let {
                         var elementList = realmOperateHelper.queryLinkByLinkPid(it)
                         for (element in elementList) {
+
+                            if (element.code == 2011) {
+                                hisRoadName = true
+                                liveDataRoadName.postValue(element)
+                                continue
+                            }
+
                             val distance = GeometryTools.distanceToDouble(
                                 point, GeometryTools.createGeoPoint(element.geometry)
                             )
@@ -238,20 +255,18 @@ class MainViewModel @Inject constructor(
                                 iconId = SignUtil.getSignIcon(element),
                                 iconText = SignUtil.getSignIconText(element),
                                 distance = distance.toInt(),
-                                elementId = element.id,
                                 linkId = linkId,
-                                geometry = element.geometry,
                                 name = SignUtil.getSignNameText(element),
                                 bottomRightText = SignUtil.getSignBottomRightText(element),
-                                elementCode = element.code,
-                                moreText = SignUtil.getMoreInfoText(element)
+                                renderEntity = element,
+                                isMoreInfo = SignUtil.isMoreInfo(element)
                             )
-
+                            Log.e("jingo", "捕捉到的数据code ${element.code}")
                             when (element.code) {
                                 2002, 2008, 2010, 2041 -> topSignList.add(
                                     signBean
                                 )
-                                4002, 4003, 4004, 4022 -> signList.add(
+                                4002, 4003, 4004, 4010, 4022, 4601 -> signList.add(
                                     signBean
                                 )
                             }
@@ -260,33 +275,26 @@ class MainViewModel @Inject constructor(
 
                         val realm = Realm.getDefaultInstance()
                         val entity = realm.where(RenderEntity::class.java)
-                            .equalTo("table", "OMDB_RESTRICTION")
-                            .and()
-                            .equalTo(
-                                "properties['linkIn']",
-                                it
+                            .equalTo("table", "OMDB_RESTRICTION").and().equalTo(
+                                "properties['linkIn']", it
                             ).findFirst()
                         if (entity != null) {
                             val outLink = entity.properties["linkOut"]
                             val linkOutEntity = realm.where(RenderEntity::class.java)
-                                .equalTo("table", "OMDB_RD_LINK")
-                                .and()
-                                .equalTo(
+                                .equalTo("table", "OMDB_RD_LINK").and().equalTo(
                                     "properties['${RenderEntity.Companion.LinkTable.linkPid}']",
                                     outLink
                                 ).findFirst()
                             if (linkOutEntity != null) {
                                 mapController.lineHandler.linksLayer.addLine(
-                                    linkOutEntity.geometry,
-                                    0x7DFF0000
+                                    linkOutEntity.geometry, 0x7DFF0000
                                 )
-                                Log.e("jingo", "捕捉到的linkid $outLink ${linkOutEntity.geometry}")
                             }
                         }
                     }
 
-                    liveDataTopSignList.postValue(topSignList.distinctBy { it.elementCode })
-                    liveDataSignList.postValue(signList.distinctBy { it.elementCode })
+                    liveDataTopSignList.postValue(topSignList.distinctBy { it.distance })
+                    liveDataSignList.postValue(signList.sortedBy { it.distance })
                     val speechText = SignUtil.getRoadSpeechText(topSignList)
                     withContext(Dispatchers.Main) {
                         speakMode?.speakText(speechText)
@@ -297,6 +305,10 @@ class MainViewModel @Inject constructor(
                 mapController.lineHandler.removeLine()
                 linkIdCache = ""
             }
+            //如果没有捕捉到道路名
+            if (!hisRoadName) {
+                liveDataRoadName.postValue(null)
+            }
         }
     }
 
@@ -488,8 +500,19 @@ class MainViewModel @Inject constructor(
         }
     }
 
+    /**
+     * 是否开启了线选择
+     */
     fun isSelectRoad(): Boolean {
         return bSelectRoad
     }
 
+    /**
+     * 要展示的要素详细信息
+     */
+
+    fun showSignMoreInfo(data: RenderEntity) {
+        liveDataSignMoreInfo.value = data
+    }
+
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
index 3bb31f38..bd932dd4 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt
@@ -1,63 +1,133 @@
 package com.navinfo.omqs.ui.activity.map
 
+import android.graphics.PorterDuff
+import android.graphics.PorterDuffColorFilter
 import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
+import android.widget.ImageView
 import com.navinfo.omqs.R
 import com.navinfo.omqs.bean.SignBean
 import com.navinfo.omqs.databinding.AdapterSignBinding
+import com.navinfo.omqs.databinding.AdapterSignLaneinfoBinding
 import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
 import com.navinfo.omqs.ui.other.BaseViewHolder
+import com.navinfo.omqs.ui.widget.SignUtil
 
 interface OnSignAdapterClickListener {
     fun onItemClick(signBean: SignBean)
     fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean)
     fun onErrorClick(signBean: SignBean)
-    fun onHideMoreInfoView()
 }
 
+data class LaneInfoItem(val id: Int, val type: Int)
+
 class SignAdapter(private var listener: OnSignAdapterClickListener?) :
     BaseRecyclerViewAdapter<SignBean>() {
     /**
      * 选中的详细信息按钮的tag标签
      */
     private var selectMoreInfoTag: String = ""
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.adapter_sign
+
+    override fun getItemViewType(position: Int): Int {
+        if (data.isNotEmpty() && data[position].renderEntity.code == 4601) {
+            return 4601
+        }
+        return 0
     }
 
+
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
-        val viewBinding =
-            AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false)
-        return BaseViewHolder(viewBinding)
+        return if (viewType == 4601) {
+            val viewBinding =
+                AdapterSignLaneinfoBinding.inflate(
+                    LayoutInflater.from(parent.context),
+                    parent,
+                    false
+                )
+            BaseViewHolder(viewBinding)
+        } else {
+            val viewBinding =
+                AdapterSignBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+            BaseViewHolder(viewBinding)
+        }
     }
 
     override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
-        val bd = holder.viewBinding as AdapterSignBinding
-
+        val context = holder.viewBinding.root.context
         val item = data[position]
-        if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId)
-        bd.signMainIcon.text = item.iconText
-        bd.signBottomText.text = item.name
-        holder.tag = item.name + position
-        //点击错误按钮
-        bd.signMainFastError.setOnClickListener {
-            listener?.onErrorClick(item)
-        }
-        bd.signBottomRightText.text = item.bottomRightText
+        if (holder.viewBinding is AdapterSignBinding) {
+            val bd = holder.viewBinding
 
-        bd.root.setOnClickListener {
+            if (item.iconId != 0) bd.signMainIconBg.setImageResource(item.iconId)
+            bd.signMainIcon.text = item.iconText
+            bd.signBottomText.text = item.name
+            //点击错误按钮
+            bd.signMainFastError.setOnClickListener {
+                listener?.onErrorClick(item)
+            }
+            bd.signBottomRightText.text = item.bottomRightText
+            if (item.isMoreInfo) {
+                bd.signMainInfo.visibility = View.VISIBLE
+                bd.signMainInfo.setOnClickListener {
+                    listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item)
+                    selectMoreInfoTag = holder.tag
+                }
+            } else {
+                bd.signMainInfo.visibility = View.GONE
+            }
+            bd.signSecondIcon.text = ""
+            if (item.renderEntity.code == 4002) {
+                val minSpeed = SignUtil.getSpeedLimitMinText(item.renderEntity)
+                if (minSpeed != "0") {
+                    bd.signSecondIcon.text = minSpeed
+                }
+            }
+        } else if (holder.viewBinding is AdapterSignLaneinfoBinding) {
+            val bd = holder.viewBinding
+            bd.signMoreIconsLayout.removeAllViews()
+            bd.signBottomText.text = item.name
+            bd.signBottomRightText.text = item.distance.toString()
+            val list = SignUtil.getLineInfoIcons(item.renderEntity)
+            val lineViewS = View(context)
+            lineViewS.layoutParams = ViewGroup.LayoutParams(24, 80)
+            lineViewS.background = context.getDrawable(R.drawable.shape_vertical_dashed_line)
+            bd.signMoreIconsLayout.addView(lineViewS, lineViewS.layoutParams)
+            for (i in list.indices) {
+                val laneInfo = list[i]
+                val imageView = ImageView(context)
+                val drawable = context.getDrawable(laneInfo.id)
+                var color = when (laneInfo.type) {
+                    1 -> bd.root.resources.getColor(R.color.lane_info_1)
+                    2 -> bd.root.resources.getColor(R.color.lane_info_2)
+                    else -> bd.root.resources.getColor(R.color.white)
+                }
+                // 创建 PorterDuffColorFilter 对象
+                val colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
+                // 将 PorterDuffColorFilter 设置给 Drawable
+                drawable!!.colorFilter = colorFilter
+                // 将 Drawable 设置给 ImageView
+                imageView.background = drawable
+                // 将 ImageView 的颜色设置为红色
+                imageView.setColorFilter(color, PorterDuff.Mode.SRC_IN)
+                imageView.layoutParams = ViewGroup.LayoutParams(35, 100)
+                bd.signMoreIconsLayout.addView(imageView, imageView.layoutParams)
+                if (i < list.size - 1) {
+                    val lineView = View(context)
+                    lineView.layoutParams = ViewGroup.LayoutParams(24, 80)
+                    lineView.background = context.getDrawable(R.drawable.shape_vertical_dashed_line)
+                    bd.signMoreIconsLayout.addView(lineView, lineView.layoutParams)
+                }
+            }
+            val lineViewE = View(context)
+            lineViewE.layoutParams = ViewGroup.LayoutParams(24, 80)
+            lineViewE.background = context.getDrawable(R.drawable.shape_vertical_dashed_line)
+            bd.signMoreIconsLayout.addView(lineViewE, lineViewE.layoutParams)
+        }
+        holder.viewBinding.root.setOnClickListener {
             listener?.onItemClick(item)
         }
-        if (item.moreText.isNotEmpty()) {
-            bd.signMainInfo.visibility = View.VISIBLE
-            //点击更多信息按钮
-            bd.signMainInfo.setOnClickListener {
-                listener?.onMoreInfoClick(selectMoreInfoTag, holder.tag, item)
-                selectMoreInfoTag = holder.tag
-            }
-        } else bd.signMainInfo.visibility = View.GONE
-
+        holder.tag = item.name + position
     }
 
     override fun refreshData(newData: List<SignBean>) {
@@ -67,7 +137,6 @@ class SignAdapter(private var listener: OnSignAdapterClickListener?) :
                 return
             }
         }
-        listener?.onHideMoreInfoView()
     }
 
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt
index 0ed1ba72..1e01ed5d 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt
@@ -11,9 +11,6 @@ import com.navinfo.omqs.ui.other.BaseViewHolder
 
 class TopSignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) :
     BaseRecyclerViewAdapter<SignBean>() {
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.adapter_top_sign
-    }
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
         val viewBinding =
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt
index a0882082..93395a0b 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/BaseFragment.kt
@@ -1,13 +1,8 @@
 package com.navinfo.omqs.ui.fragment
 
 import android.os.Bundle
-import android.view.KeyEvent
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
 import androidx.activity.OnBackPressedCallback
 import androidx.fragment.app.Fragment
-import androidx.navigation.fragment.findNavController
 
 abstract class BaseFragment : Fragment() {
 //    override fun onCreateView(
@@ -49,8 +44,8 @@ abstract class BaseFragment : Fragment() {
 //        savedInstanceState: Bundle?
 //    ): View
 
-    fun onBackPressed(): Boolean{
-        findNavController().navigateUp()
+    open fun onBackPressed(): Boolean{
+//        findNavController().navigateUp()
         return true
     }
 
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 87cf037d..3db57981 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
@@ -20,6 +20,7 @@ import com.navinfo.omqs.ui.fragment.BaseFragment
 import com.navinfo.omqs.ui.other.shareViewModels
 import dagger.hilt.android.AndroidEntryPoint
 import androidx.navigation.findNavController
+import androidx.navigation.fragment.findNavController
 import com.navinfo.omqs.ui.dialog.FirstDialog
 
 @AndroidEntryPoint
@@ -70,12 +71,12 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
             val mDialog = FirstDialog(context)
             mDialog.setTitle("提示?")
             mDialog.setMessage("是否退出,请确认!")
-            mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener {
-                override fun onClick(dialog: Dialog?, which: Int) {
-                    mDialog.dismiss()
-                    onBackPressed()
-                }
-            })
+            mDialog.setPositiveButton(
+                "确定"
+            ) { _, _ ->
+                mDialog.dismiss()
+                onBackPressed()
+            }
             mDialog.setNegativeButton("取消", null)
             mDialog.show()
         }
@@ -315,4 +316,9 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener {
         }
     }
 
+    override fun onBackPressed(): Boolean {
+        findNavController().navigateUp()
+        return true
+    }
+
 }
\ 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 301254cb..a415a767 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
@@ -137,7 +137,7 @@ class EvaluationResultViewModel @Inject constructor(
             }
         } else {
             liveDataQsRecordBean.value?.run {
-                elementId = bean.elementId
+                elementId = bean.renderEntity.code.toString()
                 linkId = bean.linkId
                 if (linkId.isNotEmpty()) {
                     viewModelScope.launch {
@@ -149,7 +149,7 @@ class EvaluationResultViewModel @Inject constructor(
                         }
                     }
                 }
-                val point = GeometryTools.createGeoPoint(bean.geometry)
+                val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry)
                 this.geometry = GeometryTools.createGeometry(point).toText()
                 mapController.animationHandler.animationByLatLon(point.latitude, point.longitude)
                 mapController.markerHandle.addMarker(point, markerTitle)
@@ -198,7 +198,7 @@ class EvaluationResultViewModel @Inject constructor(
                     liveDataLeftTypeList.postValue(it)
                     if (bean != null) {
                         val classType2 = roomAppDatabase.getScProblemTypeDao()
-                            .findClassTypeByCode(bean.elementCode)
+                            .findClassTypeByCode(bean.renderEntity.code)
                         if (classType2 != null) {
                             classType = classType2
                         }
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt
index c68b7e88..383a515c 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt
@@ -13,9 +13,6 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) :
     BaseRecyclerViewAdapter<String>() {
     private var selectTitle = ""
 
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.text_item_select
-    }
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
         val viewBinding =
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 e2ce025f..ee0b6044 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
@@ -13,9 +13,6 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null)
     BaseRecyclerViewAdapter<String>() {
     private var selectTitle = ""
 
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.text_item_select
-    }
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
         val viewBinding =
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt
index d0dd4de4..2785a0df 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt
@@ -11,9 +11,6 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni
     BaseRecyclerViewAdapter<RightBean>() {
     private var selectTitle = ""
     private var groupTitleList = mutableListOf<String>()
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.text_item_select2
-    }
 
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
         val viewBinding =
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt
index 31a323b0..164c9405 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/SoundtListAdapter.kt
@@ -224,10 +224,6 @@ class SoundtListAdapter(
         }
     }
 
-
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.adapter_sound_list
-    }
 }
 
 
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt
index dede03ce..9bf60d86 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/offlinemap/OfflineMapCityListAdapter.kt
@@ -131,10 +131,6 @@ class OfflineMapCityListAdapter(
             }
         }
     }
-
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.adapter_offline_map_city
-    }
 }
 
 
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 b511c34b..8e96c2c5 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
@@ -115,7 +115,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) :
                     viewModel.readRealmData()
                     // 定位到指定位置
                     niMapController.mMapView.vtmMap.animator()
-                        .animateTo(GeoPoint( 39.80392140200183, 116.51446703352337   ))
+                        .animateTo(GeoPoint( 39.799624915997725, 116.51407667184905     ))
                 }
 //                R.id.personal_center_menu_task_list -> {
 //                    findNavController().navigate(R.id.TaskManagerFragment)
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt
index 3e9f3f0d..070a4cf3 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/qsrecordlist/QsRecordListAdapter.kt
@@ -58,9 +58,6 @@ class QsRecordListAdapter(
         binding.qsRecordTime.text = qsRecordBean.checkTime
     }
 
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.adapter_qs_record_list
-    }
 
     // 提供set方法
     fun setOnKotlinItemClickListener(itemClickListener: IKotlinItemClickListener) {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt
new file mode 100644
index 00000000..50a95962
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt
@@ -0,0 +1,30 @@
+package com.navinfo.omqs.ui.fragment.signMoreInfo
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.navinfo.omqs.R
+import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding
+import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
+import com.navinfo.omqs.ui.other.BaseViewHolder
+
+data class ElectronicEyeMoreInfoAdapterItem(
+    val title: String,
+    val text: String
+)
+
+class ElectronicEyeInfoAdapter : BaseRecyclerViewAdapter<ElectronicEyeMoreInfoAdapterItem>() {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
+        val viewBinding =
+            AdapterElectronicEyeBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+        return BaseViewHolder(viewBinding)
+    }
+
+    override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
+        val binding: AdapterElectronicEyeBinding =
+            holder.viewBinding as AdapterElectronicEyeBinding
+        val item = data[position]
+        binding.title.text = item.title
+        binding.text.text = item.text
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt
new file mode 100644
index 00000000..d768f4db
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/RoadNameInfoAdapter.kt
@@ -0,0 +1,27 @@
+package com.navinfo.omqs.ui.fragment.signMoreInfo
+
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import com.navinfo.omqs.R
+import com.navinfo.omqs.bean.RoadNameBean
+import com.navinfo.omqs.databinding.AdapterRoadNameBinding
+import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter
+import com.navinfo.omqs.ui.other.BaseViewHolder
+
+class RoadNameInfoAdapter : BaseRecyclerViewAdapter<RoadNameBean>() {
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
+        val viewBinding =
+            AdapterRoadNameBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+        return BaseViewHolder(viewBinding)
+    }
+
+    override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
+        val binding: AdapterRoadNameBinding =
+            holder.viewBinding as AdapterRoadNameBinding
+        val bean = data[position]
+        binding.title.text = bean.getNameClassStr()
+        binding.name.text = bean.name
+        binding.type.text = bean.getTypeStr()
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt
new file mode 100644
index 00000000..471f39fb
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt
@@ -0,0 +1,100 @@
+package com.navinfo.omqs.ui.fragment.signMoreInfo
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.navinfo.omqs.R
+import com.navinfo.omqs.databinding.FragmentSignInfoBinding
+import com.navinfo.omqs.ui.activity.map.MainViewModel
+import com.navinfo.omqs.ui.fragment.BaseFragment
+import com.navinfo.omqs.ui.widget.SignUtil
+
+
+class SignMoreInfoFragment : BaseFragment() {
+    private var _binding: FragmentSignInfoBinding? = null
+    private val binding get() = _binding!!
+
+    private val viewModel by activityViewModels<MainViewModel>()
+    override fun onCreateView(
+        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
+    ): View {
+        _binding = FragmentSignInfoBinding.inflate(inflater, container, false)
+        return binding.root
+    }
+
+    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+        super.onViewCreated(view, savedInstanceState)
+
+        val layoutManager = LinearLayoutManager(context)
+        //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能
+        binding.signInfoRecyclerview.setHasFixedSize(true)
+        binding.signInfoRecyclerview.layoutManager = layoutManager
+        viewModel.liveDataSignMoreInfo.observe(viewLifecycleOwner) {
+            binding.signInfoTitle.text = it.name
+            val drawable = resources.getDrawable(R.drawable.icon_main_moreinfo_text_left, null);
+            drawable.setBounds(
+                0,
+                0,
+                drawable.minimumWidth,
+                drawable.minimumHeight
+            );//必须设置图片大小,否则不显示
+            binding.signInfoTitle.setCompoundDrawables(
+                drawable, null, null, null
+            )
+
+            when (it.code) {
+                //道路名
+                2011 -> {
+                    val adapter = RoadNameInfoAdapter()
+                    binding.signInfoRecyclerview.adapter = adapter
+                    adapter.refreshData(SignUtil.getRoadNameList(it))
+                }
+                //常规点限速
+                4002->{
+                    val adapter = ElectronicEyeInfoAdapter()
+                    binding.signInfoRecyclerview.adapter = adapter
+                    adapter.refreshData(SignUtil.getSpeedLimitMoreInfoText(it))
+                }
+                //条件点限速
+                4003 -> {
+                    val adapter = ElectronicEyeInfoAdapter()
+                    binding.signInfoRecyclerview.adapter = adapter
+                    adapter.refreshData(SignUtil.getConditionLimitMoreInfoText(it))
+                }
+                //电子眼
+                4010
+                -> {
+                    val drawable = resources.getDrawable(R.drawable.icon_electronic_eye_left, null);
+                    drawable.setBounds(
+                        0,
+                        0,
+                        drawable.minimumWidth,
+                        drawable.minimumHeight
+                    );//必须设置图片大小,否则不显示
+                    binding.signInfoTitle.setCompoundDrawables(
+                        drawable, null, null, null
+                    )
+                    val adapter = ElectronicEyeInfoAdapter()
+                    binding.signInfoRecyclerview.adapter = adapter
+                    adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it))
+                }
+
+            }
+        }
+
+        binding.signInfoCancel.setOnClickListener {
+            activity?.run {
+                supportFragmentManager.beginTransaction().remove(this@SignMoreInfoFragment)
+                    .commit()
+            }
+        }
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        _binding = null
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt
index 86503718..ee7ec323 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt
@@ -58,9 +58,6 @@ class TaskAdapter(
         }
     }
 
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.adapter_task
-    }
 
     fun resetSelect() {
         selectPosition = -1
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt
index 0b963619..b1dbfd5c 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt
@@ -282,10 +282,6 @@ class TaskListAdapter(
             }
         }
     }
-
-    override fun getItemViewRes(position: Int): Int {
-        return R.layout.adapter_task_list
-    }
 }
 
 
diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt
index ec11bd80..63285395 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt
@@ -15,7 +15,8 @@ import dagger.hilt.android.AndroidEntryPoint
  * 评测任务viewpager管理页面
  */
 @AndroidEntryPoint
-class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) : BaseFragment() {
+class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Unit?)? = null) :
+    BaseFragment() {
     private var _binding: FragmentTaskManagerBinding? = null
 
     private val binding get() = _binding!!
diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt
index aa93a6d2..dcb22ba9 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/other/BaseRecyclerViewAdapter.kt
@@ -1,11 +1,6 @@
 package com.navinfo.omqs.ui.other
 
-import android.view.LayoutInflater
-import android.view.View.OnClickListener
-import android.view.ViewGroup
-import androidx.databinding.DataBindingUtil
 import androidx.recyclerview.widget.RecyclerView
-import com.navinfo.omqs.R
 
 /**
  * RecyclerView 适配器基础类
@@ -27,10 +22,10 @@ abstract class BaseRecyclerViewAdapter<T>(var data: List<T> = listOf()) :
 //        )
 //    }
 
-    abstract fun getItemViewRes(position: Int): Int
-
-    override fun getItemViewType(position: Int): Int {
-        return getItemViewRes(position)
+    //    abstract fun getItemViewRes(position: Int): Int
+//
+    open override fun getItemViewType(position: Int): Int {
+        return 0
     }
 
     override fun getItemCount(): Int {
diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt b/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt
new file mode 100644
index 00000000..dbcb22d9
--- /dev/null
+++ b/app/src/main/java/com/navinfo/omqs/ui/other/ShareViewModel2.kt
@@ -0,0 +1,54 @@
+//package com.navinfo.omqs.ui.other
+//
+//import androidx.lifecycle.*
+//
+//val vMStoreMap = HashMap<String, VMStoreClass>()
+//
+//inline fun <reified VM : ViewModel> LifecycleOwner.shareViewModels(
+//    scopeName: String,
+//    factory: ViewModelProvider.Factory? = null
+//): Lazy<VM> {
+//    val store: VMStoreClass
+//    if (vMStoreMap.keys.contains(scopeName)) {
+//        store = vMStoreMap[scopeName]!!
+//    } else {
+//        store = VMStoreClass()
+//        vMStoreMap[scopeName] = store
+//    }
+//    store.register(this)
+//    return ViewModelLazy(VM::class,
+//        { store.viewModelStore },
+//        { factory ?: ViewModelProvider.NewInstanceFactory() })
+//}
+//
+//class VMStoreClass : ViewModelStoreOwner {
+//
+//    private val bindTargets = ArrayList<LifecycleOwner>()
+//    private var vmStore: ViewModelStore? = null
+//
+//    fun register(host: LifecycleOwner) {
+//        if (!bindTargets.contains(host)) {
+//            bindTargets.add(host)
+//            host.lifecycle.addObserver(object : LifecycleEventObserver {
+//                override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
+//                    if (event == Lifecycle.Event.ON_DESTROY) {
+//                        host.lifecycle.removeObserver(this)
+//                        bindTargets.remove(host)
+//                        if (bindTargets.isEmpty()) {//如果当前商店没有关联对象,则释放资源
+//                            vMStoreMap.entries.find { it.value == this@VMStoreClass }?.also {
+//                                vmStore?.clear()
+//                                vMStoreMap.remove(it.key)
+//                            }
+//                        }
+//                    }
+//                }
+//            })
+//        }
+//    }
+//
+//    override fun getViewModelStore(): ViewModelStore {
+//        if (vmStore == null)
+//            vmStore = ViewModelStore()
+//        return vmStore!!
+//    }
+//}
\ No newline at end of file
diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt
index 773e55e0..1c614a47 100644
--- a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt
+++ b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt
@@ -3,7 +3,12 @@ package com.navinfo.omqs.ui.widget
 import android.util.Log
 import com.navinfo.collect.library.data.entity.RenderEntity
 import com.navinfo.omqs.R
+import com.navinfo.omqs.bean.RoadNameBean
 import com.navinfo.omqs.bean.SignBean
+import com.navinfo.omqs.ui.activity.map.LaneInfoItem
+import com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeMoreInfoAdapterItem
+import org.json.JSONArray
+import java.lang.reflect.Field
 
 class SignUtil {
     companion object {
@@ -22,7 +27,7 @@ class SignUtil {
                 //车道数
                 2041 -> getLaneNumText(data)
                 //常规点限速,条件点限速
-                4002, 4003 -> getSpeedLimitText(data)
+                4002, 4003 -> getSpeedLimitMaxText(data)
                 else -> ""
             }
         }
@@ -76,8 +81,12 @@ class SignUtil {
                 4004 -> "可变点限速"
                 //普通交限
                 4006 -> "普通交限"
+                //电子眼
+                4010 -> "电子眼"
                 //交通灯
                 4022 -> "交通灯"
+                //交限
+                4601 -> "车信"
                 else -> ""
             }
         }
@@ -93,24 +102,45 @@ class SignUtil {
             }
         }
 
-        /**
-         * 更多信息展示文字
-         */
-        fun getMoreInfoText(data: RenderEntity): String {
-            return when (data.code) {
-                //条件点限速
-                4003 -> getConditionLimitMoreInfoText(data)
-                else -> ""
-            }
-        }
-
         /**
          * 条件点限速更多信息
          */
-        private fun getConditionLimitMoreInfoText(data: RenderEntity): String {
-            return data.properties["validPeriod"].toString()
+        fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List<ElectronicEyeMoreInfoAdapterItem> {
+
+            val list = mutableListOf<ElectronicEyeMoreInfoAdapterItem>()
+            val maxSpeed = renderEntity.properties["maxSpeed"]
+            if (maxSpeed != null) {
+                list.add(
+                    ElectronicEyeMoreInfoAdapterItem(
+                        title = "最高限速值(km/h)", text = maxSpeed
+                    )
+                )
+            }
+            list.add(
+                ElectronicEyeMoreInfoAdapterItem(
+                    title = "限速条件", text = getConditionLimitText(renderEntity)
+                )
+            )
+            val carType = renderEntity.properties["vehicleType"]
+            if (carType != "0") {
+                list.add(
+                    ElectronicEyeMoreInfoAdapterItem(
+                        title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt())
+                    )
+                )
+            }
+            val time = renderEntity.properties["validPeriod"]
+            if (time?.isNotEmpty() == true) {
+                list.add(
+                    ElectronicEyeMoreInfoAdapterItem(
+                        title = "时间段", text = time
+                    )
+                )
+            }
+            return list
         }
 
+
         /**
          * 条件点限速文字
          */
@@ -160,21 +190,31 @@ class SignUtil {
         /**
          * 获取限速值文字
          */
-        private fun getSpeedLimitText(data: RenderEntity): String {
+        private fun getSpeedLimitMaxText(data: RenderEntity): String {
             try {
                 //限速标志 0 限速开始 1 限速解除
                 val maxSpeed = data.properties["maxSpeed"]
-                val minSpeed = data.properties["minSpeed"]
-                return if (maxSpeed != "0")
-                    maxSpeed.toString()
-                else
-                    minSpeed.toString()
+                return maxSpeed.toString()
             } catch (e: Exception) {
                 Log.e("jingo", "获取限速面板ICON出错1 $e")
             }
             return ""
         }
 
+        /**
+         * 获取限速值文字
+         */
+        fun getSpeedLimitMinText(data: RenderEntity): String {
+            try {
+                //限速标志 0 限速开始 1 限速解除
+                val minSpeed = data.properties["minSpeed"]
+                return minSpeed.toString()
+            } catch (e: Exception) {
+                Log.e("jingo", "获取限速面板ICON出错1 $e")
+            }
+            return "0"
+        }
+
         /**
          * 获取种别名称
          */
@@ -182,6 +222,25 @@ class SignUtil {
             return data.properties["kind"].toString()
         }
 
+        /**
+         * 常规点限速更多信息
+         */
+        fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List<ElectronicEyeMoreInfoAdapterItem> {
+
+            val list = mutableListOf<ElectronicEyeMoreInfoAdapterItem>()
+            list.add(
+                ElectronicEyeMoreInfoAdapterItem(
+                    title = "最高限速值(km/h)", text = getSpeedLimitMaxText(renderEntity)
+                )
+            )
+            list.add(
+                ElectronicEyeMoreInfoAdapterItem(
+                    title = "最低限速值(km/h)", text = getSpeedLimitMinText(renderEntity)
+                )
+            )
+            return list
+        }
+
         /**
          * 限速图标
          */
@@ -232,6 +291,8 @@ class SignUtil {
                 4003 -> getConditionalSpeedLimitIcon(data)
                 //可变点限速
                 4004 -> R.drawable.icon_change_limit
+                //电子眼
+                4010 -> R.drawable.icon_electronic_eye
                 //交通灯
                 4022 -> R.drawable.icon_traffic_light
                 else -> 0
@@ -315,12 +376,11 @@ class SignUtil {
          * 获取道路播报语音文字
          */
         fun getRoadSpeechText(topSignList: MutableList<SignBean>): String {
-            if (topSignList.size == 0)
-                return ""
+            if (topSignList.size == 0) return ""
             val stringBuffer = StringBuffer()
             stringBuffer.append("当前道路")
             for (item in topSignList) {
-                when (item.elementCode) {
+                when (item.renderEntity.code) {
                     2002 -> stringBuffer.append("功能等级${item.iconText.substring(2)}级,")
                     2008 -> stringBuffer.append("种别${item.iconText},")
                     2010 -> stringBuffer.append("${item.iconText},")
@@ -329,5 +389,230 @@ class SignUtil {
             }
             return stringBuffer.toString()
         }
+
+
+        fun getRoadNameList(data: RenderEntity): MutableList<RoadNameBean> {
+            val list = mutableListOf<RoadNameBean>()
+            if (data.code == 2011) {
+                try {
+                    val shapeStr = data.properties["shapeList"]
+                    val array = JSONArray(shapeStr)
+                    for (i in 0 until array.length()) {
+                        val jsonObject = array.getJSONObject(0)
+                        val name = jsonObject.optString("name", "")
+                        val type = jsonObject.optInt("nameType", 0)
+                        val seqNum = jsonObject.optInt("seqNum", 1)
+                        val nameClass = jsonObject.optInt("nameClass", 1)
+                        val bean = RoadNameBean(
+                            name = name, type = type, seqNum = seqNum, nameClass = nameClass
+                        )
+                        list.add(bean)
+                    }
+                    /**
+                     * 排序
+                     */
+                    list.sortWith { n1, n2 ->
+                        if (n1.nameClass != n2.nameClass) {
+                            n1.nameClass.compareTo(n2.nameClass)
+                        } else {
+                            n1.seqNum.compareTo(n2.seqNum)
+                        }
+                    }
+                } catch (e: Exception) {
+
+                }
+            }
+            return list
+        }
+
+        /**
+         * 是否要有详细信息需要展示
+         */
+        fun isMoreInfo(element: RenderEntity): Boolean {
+            val isMore = when (element.code) {
+                //常规点限速
+                4002 -> getSpeedLimitMinText(element) != "0"
+                //条件点限速
+                4003 -> true
+                //电子眼
+                4010 -> true
+                else -> false
+            }
+            Log.e("jingo", "更多信息:${element.code} $isMore")
+            return isMore
+        }
+
+
+        /**
+         * 获取电子眼详细信息
+         */
+        fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List<ElectronicEyeMoreInfoAdapterItem> {
+            val list = mutableListOf<ElectronicEyeMoreInfoAdapterItem>()
+            val kindCode = renderEntity.properties["kind"]!!.toInt()
+            val kind = ElectronicEyeMoreInfoAdapterItem(
+                title = "电子眼类型", text = getElectronicEyeKindType(kindCode)
+            )
+            list.add(kind)
+            when (kindCode) {
+                1, 2, 3, 4, 5, 6, 20, 21 -> {
+                    list.add(
+                        ElectronicEyeMoreInfoAdapterItem(
+                            title = "限速值(km/h)",
+                            text = renderEntity.properties["speedLimit"].toString()
+                        )
+                    )
+                }
+            }
+            val carType = renderEntity.properties["vehicleType"]
+            if (carType != null && carType != "0") {
+                list.add(
+                    ElectronicEyeMoreInfoAdapterItem(
+                        title = "车辆类型",
+                        text = getElectronicEyeVehicleType(carType.toInt())
+                    )
+                )
+            }
+            val time = renderEntity.properties["validPeriod"]
+            if (time?.isNotEmpty() == true) {
+                list.add(
+                    ElectronicEyeMoreInfoAdapterItem(
+                        title = "时间段", text = time
+                    )
+                )
+            }
+            if (kindCode == 20 || kindCode == 21) {
+                list.add(
+                    ElectronicEyeMoreInfoAdapterItem(
+                        title = "区间测试配对", text = renderEntity.properties["pairEleceyeId"].toString()
+                    )
+                )
+            }
+            return list
+        }
+
+        /**
+         *  获取电子眼车辆类型
+         */
+        private fun getElectronicEyeVehicleType(type: Int): String {
+            var stringBuffer = StringBuffer()
+            for (i in 31 downTo 0) {
+                val bit = (type shr i) and 1
+                if (bit == 1) {
+                    when (i) {
+                        0 -> stringBuffer.append("其他 ")
+                        1 -> stringBuffer.append("小汽车 ")
+                        2 -> stringBuffer.append("公交车 ")
+                        3 -> stringBuffer.append("多人乘坐车辆 ")
+                        4 -> stringBuffer.append("配送车 ")
+                        5 -> stringBuffer.append("摩托车 ")
+                        6 -> stringBuffer.append("行人 ")
+                        7 -> stringBuffer.append("自行车 ")
+                        8 -> stringBuffer.append("出租车 ")
+                        10 -> stringBuffer.append("紧急车辆 ")
+                        11 -> stringBuffer.append("运输卡车 ")
+                    }
+                }
+            }
+
+            return stringBuffer.toString()
+        }
+
+        /**
+         * 获取电子眼类型
+         */
+        private fun getElectronicEyeKindType(kind: Int): String {
+            return when (kind) {
+                0 -> "未调查"
+                1 -> "超高速"
+                2 -> "超低速"
+                3 -> "移动式测速"
+                4 -> "可变限速"
+                5 -> "分车道限速"
+                6 -> "分车种限速"
+                7 -> "违规用灯"
+                8 -> "违规占车道"
+                9 -> "违规过路口"
+                10 -> "机动车闯红灯"
+                11 -> "路况监控"
+                12 -> "单行线"
+                13 -> "占用非机动车道"
+                14 -> "出入口"
+                15 -> "占用公交车专用道"
+                16 -> "禁止左右转"
+                17 -> "禁止掉头"
+                18 -> "占用应急车道"
+                19 -> "违反禁止标线"
+                20 -> "区间测速开始"
+                21 -> "区间测速结束"
+                22 -> "违章停车"
+                23 -> "尾号限行"
+                24 -> "环保限行"
+                25 -> "不系安全带"
+                26 -> "开车打手机"
+                27 -> "礼让行人"
+                28 -> "违反禁令标志"
+                29 -> "禁止鸣笛"
+                30 -> "车辆未按规定年检"
+                31 -> "车辆尾气超标"
+                32 -> "ETC拍照计费电子眼"
+                33 -> "专用车道电子眼预留"
+                34 -> "交通标线电子眼预留"
+                35 -> "违章电子眼预留"
+                36 -> "卡车超限电子眼"
+                37 -> "限时长停车电子眼"
+                else -> "无效类型"
+            }
+        }
+
+        /**
+         * 获取车信图标
+         */
+        fun getLineInfoIcons(renderEntity: RenderEntity): List<LaneInfoItem> {
+            val list = mutableListOf<LaneInfoItem>()
+            try {
+                var laneinfoGroup = renderEntity.properties["laneinfoGroup"]
+                if (laneinfoGroup != null) {
+                    laneinfoGroup = laneinfoGroup.substring(1, laneinfoGroup.length - 1)
+                    laneinfoGroup = "[$laneinfoGroup]"
+                }
+                val jsonArray = JSONArray(laneinfoGroup)
+                if (jsonArray.length() == 2) {
+                    val itemArray = jsonArray[0]
+                    val typeArray = jsonArray[1]
+                    if ((itemArray is JSONArray) && (typeArray is JSONArray) && itemArray.length() == typeArray.length()) {
+                        for (i in 0 until itemArray.length()) {
+                            val itemObject = itemArray[i]
+                            val type = typeArray[i]
+                            var laneInfo = "laneinfo_${itemObject.toString().replace(",", "_")}"
+                            Log.e("jingo", "车信图标 $laneInfo")
+                            list.add(
+                                LaneInfoItem(
+                                    id = getResId(
+                                        laneInfo, R.drawable::class.java
+                                    ), type = type!!.toString().toInt()
+                                )
+                            )
+                        }
+                    }
+                }
+
+            } catch (e: Exception) {
+                Log.e("jingo", "json 解析失败")
+            }
+            return list
+        }
+
+        /**
+         * 通过字符串名称获取资源id
+         */
+        private fun getResId(variableName: String, c: Class<*>): Int {
+            return try {
+                val idField: Field = c.getDeclaredField(variableName)
+                idField.getInt(idField)
+            } catch (e: java.lang.Exception) {
+                e.printStackTrace()
+                R.drawable.laneinfo_0
+            }
+        }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png b/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png
new file mode 100644
index 00000000..90f752e3
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/bg_sign_laneinfo.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/icon_electronic_eye.png b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye.png
new file mode 100644
index 00000000..2ffcd7bb
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/icon_electronic_eye_left.png b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye_left.png
new file mode 100644
index 00000000..c79d9b7c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_electronic_eye_left.png differ
diff --git a/app/src/main/res/drawable/baseline_cancel_24.xml b/app/src/main/res/drawable/baseline_cancel_24.xml
new file mode 100644
index 00000000..082ea0a2
--- /dev/null
+++ b/app/src/main/res/drawable/baseline_cancel_24.xml
@@ -0,0 +1,11 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="24dp"
+    android:tint="#91909A"
+    android:viewportWidth="24"
+    android:viewportHeight="24">
+    <path
+        android:fillColor="@android:color/white"
+        android:pathData="M13,7zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8z,M12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z" />
+
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_0.xml b/app/src/main/res/drawable/laneinfo_0.xml
new file mode 100644
index 00000000..3323c731
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_0.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="10dp"
+    android:height="30dp"
+    android:viewportWidth="10"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M0.604,0.667h8.792v28.667h-8.792z"
+      android:strokeWidth="1"
+      android:fillColor="#FFFFFF"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M2.604,2.833h4.899v24.395h-4.899z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1.xml b/app/src/main/res/drawable/laneinfo_1.xml
new file mode 100644
index 00000000..b178f970
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="10dp"
+    android:height="28dp"
+    android:viewportWidth="12"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M7.341,29.432l-0.03,-24.586l4.399,3.566l0.079,-3.273l-5.723,-4.571l-5.856,4.564l0.088,3.485l4.672,-3.972l0.015,24.785z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_2.xml b/app/src/main/res/drawable/laneinfo_1_2.xml
new file mode 100644
index 00000000..afb0be5d
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_2.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M13.399,29.168l0.015,-25.164l3.677,3.127l0.069,-2.744l-4.61,-3.594l-4.504,3.599l0.063,2.577l3.463,-2.855l-0.012,25.094z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M11.776,17.839C11.797,17.422 11.543,15.976 10.416,15.185C9.29,14.393 7.37,14.529 7.37,14.529L4.05,14.544L7.178,18.221L4.437,18.291L0.84,13.68L4.441,9.176L7.019,9.238L4.164,12.701L7.17,12.689C7.17,12.689 9.013,12.637 10.061,13.123C11.106,13.608 12.461,14.723 12.606,15.132C12.885,15.948 11.751,18.237 11.776,17.839Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_2_3.xml b/app/src/main/res/drawable/laneinfo_1_2_3.xml
new file mode 100644
index 00000000..fd8815a6
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_2_3.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="26dp"
+    android:height="30dp"
+    android:viewportWidth="26"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M12.653,16.041C12.51,15.631 11.395,14.759 10.348,14.273C9.302,13.787 7.094,13.84 7.094,13.84L4.084,13.852L6.942,10.387L4.362,10.325L0.761,14.831L4.357,19.444L7.103,19.375L3.974,15.696L7.294,15.68C7.294,15.68 9.158,15.43 10.285,16.222C11.412,17.014 12.669,18.363 12.676,18.749C12.689,19.521 12.94,16.859 12.653,16.041Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M14.058,29.084l-0.026,-24.425l3.847,3.12l0.069,-2.864l-5.002,-3.999l-5.122,3.994l0.078,3.049l4.084,-3.475l0.014,24.6z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.348,16.041C13.492,15.631 14.606,14.759 15.653,14.273C16.699,13.787 18.906,13.84 18.906,13.84L21.915,13.852L19.058,10.387L21.637,10.325L25.239,14.831L21.643,19.444L18.897,19.375L22.026,15.696L18.705,15.68C18.705,15.68 16.843,15.43 15.714,16.222C14.587,17.014 13.33,18.363 13.324,18.749C13.312,19.521 13.061,16.859 13.348,16.041Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_2_4.xml b/app/src/main/res/drawable/laneinfo_1_2_4.xml
new file mode 100644
index 00000000..95e58d21
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_2_4.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M12.059,12.145C11.915,11.735 10.799,10.862 9.752,10.375C8.705,9.889 6.495,9.942 6.495,9.942L3.484,9.953L6.343,6.485L3.762,6.422L0.158,10.932L3.758,15.55L6.506,15.48L3.374,11.797L6.698,11.782C6.698,11.782 8.563,11.532 9.691,12.324C10.819,13.117 12.077,14.467 12.083,14.854C12.095,15.629 12.346,12.965 12.059,12.145Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.74,20.555C13.472,15.211 3.833,15.203 3.932,20.672L3.958,26.174L0.455,23.086L0.389,25.144L5.016,29.037L9.436,25.17L9.442,22.912L5.951,26.08L5.968,21.073C6.051,17.487 11.694,17.618 11.879,20.979L13.74,20.555Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.95,29.096l-0.026,-24.447l3.851,3.124l0.068,-2.867l-5.007,-4.002l-5.126,3.998l0.078,3.051l4.088,-3.478l0.014,24.621z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_2_5.xml b/app/src/main/res/drawable/laneinfo_1_2_5.xml
new file mode 100644
index 00000000..6c124f43
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_2_5.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M14.042,29.168l0.015,-25.164l3.678,3.127l0.068,-2.744l-4.609,-3.594l-4.504,3.598l0.063,2.577l3.463,-2.855l-0.012,25.094z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.42,22.839C12.442,22.422 12.187,20.976 11.06,20.185C9.934,19.393 8.014,19.529 8.014,19.529L4.695,19.544L7.823,23.221L5.081,23.291L1.485,18.68L5.085,14.176L7.663,14.238L4.808,17.701L7.815,17.689C7.815,17.689 9.657,17.637 10.705,18.123C11.75,18.608 13.105,19.723 13.25,20.132C13.529,20.947 12.396,23.236 12.42,22.839Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.922,14.333l-10.542,-6.516l4.596,-1.476l-2.296,-1.506l-5.483,2.023l0.684,5.724l2.222,1.305l-0.6,-4.448l10.823,6.681z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_2_6.xml b/app/src/main/res/drawable/laneinfo_1_2_6.xml
new file mode 100644
index 00000000..a7016e1a
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_2_6.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="26dp"
+    android:height="30dp"
+    android:viewportWidth="26"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M13.37,29.208l-0.012,-25.095l3.463,2.855l0.063,-2.577l-4.504,-3.599l-4.609,3.595l0.068,2.744l3.678,-3.127l0.015,25.164z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.249,16.121l10.823,-6.681l-0.6,4.448l2.222,-1.305l0.684,-5.724l-5.483,-2.023l-2.296,1.506l4.596,1.476l-10.542,6.516z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M11.558,16.964C11.579,16.547 11.325,15.101 10.198,14.31C9.072,13.518 7.152,13.654 7.152,13.654L3.832,13.669L6.96,17.346L4.218,17.416L0.622,12.805L4.223,8.301L6.8,8.363L3.946,11.826L6.952,11.814C6.952,11.814 8.794,11.762 9.842,12.248C10.887,12.733 12.243,13.848 12.387,14.257C12.668,15.071 11.533,17.361 11.558,16.964Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_3.xml b/app/src/main/res/drawable/laneinfo_1_3.xml
new file mode 100644
index 00000000..cdee0af7
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_3.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M6.439,29.208l-0.014,-25.095l3.465,2.855l0.063,-2.577l-4.504,-3.599l-4.61,3.594l0.069,2.744l3.677,-3.127l0.017,25.164z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M5.398,15.129C5.541,14.72 6.898,13.605 7.943,13.12C8.99,12.634 10.832,12.686 10.832,12.686L13.838,12.698L10.984,9.235L13.562,9.173L17.161,13.677L13.566,18.288L10.823,18.218L13.951,14.541L10.63,14.525C10.63,14.525 8.71,14.389 7.584,15.181C6.457,15.972 6.2,17.418 6.226,17.835C6.245,18.236 5.111,15.946 5.398,15.129Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_3_4.xml b/app/src/main/res/drawable/laneinfo_1_3_4.xml
new file mode 100644
index 00000000..1f63c983
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_3_4.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="30dp"
+    android:viewportWidth="24"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M12.909,29.208l-0.014,-25.095l3.465,2.855l0.062,-2.577l-4.504,-3.599l-4.61,3.594l0.069,2.744l3.677,-3.127l0.017,25.164z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M11.867,15.131C12.011,14.722 13.367,13.607 14.413,13.122C15.459,12.636 17.301,12.688 17.301,12.688L20.307,12.7L17.453,9.237L20.031,9.175L23.63,13.679L20.036,18.29L17.292,18.22L20.419,14.543L17.1,14.528C17.1,14.528 15.18,14.392 14.054,15.184C12.927,15.975 12.67,17.421 12.696,17.838C12.716,18.237 11.581,15.948 11.867,15.131Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.728,16.487C12.462,11.151 3.809,11.142 3.909,16.603L3.934,24.524L0.437,21.441L0.37,23.496L4.991,27.383L9.404,23.523L9.409,21.268L5.924,24.432L5.943,17.005C6.026,13.423 10.929,13.555 11.117,16.911L12.728,16.487Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_3_5.xml b/app/src/main/res/drawable/laneinfo_1_3_5.xml
new file mode 100644
index 00000000..59bae6fa
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_3_5.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="26dp"
+    android:height="30dp"
+    android:viewportWidth="26"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M14.467,29.168l0.016,-25.164l3.677,3.127l0.069,-2.744l-4.61,-3.594l-4.504,3.599l0.063,2.577l3.463,-2.855l-0.013,25.094z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M14.347,14.333l-10.542,-6.516l4.596,-1.476l-2.296,-1.506l-5.484,2.023l0.685,5.724l2.222,1.305l-0.601,-4.448l10.823,6.681z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.615,14.256C13.759,13.847 15.115,12.732 16.16,12.247C17.208,11.761 19.05,11.813 19.05,11.813L22.057,11.825L19.202,8.362L21.779,8.3L25.379,12.804L21.782,17.416L19.04,17.346L22.168,13.669L18.849,13.654C18.849,13.654 16.929,13.518 15.802,14.31C14.675,15.101 14.419,16.547 14.443,16.964C14.465,17.361 13.331,15.072 13.615,14.256Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_3_6.xml b/app/src/main/res/drawable/laneinfo_1_3_6.xml
new file mode 100644
index 00000000..ce021027
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_3_6.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M5.796,29.208l-0.012,-25.095l3.463,2.855l0.063,-2.577l-4.504,-3.599l-4.609,3.595l0.068,2.744l3.678,-3.127l0.015,25.164z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M4.754,20.131C4.899,19.722 6.254,18.607 7.299,18.122C8.347,17.636 10.19,17.688 10.19,17.688L13.196,17.7L10.341,14.237L12.919,14.175L16.519,18.679L12.923,23.29L10.181,23.22L13.309,19.543L9.99,19.528C9.99,19.528 8.07,19.392 6.944,20.184C5.817,20.975 5.56,22.421 5.584,22.838C5.604,23.236 4.469,20.946 4.754,20.131Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M4.674,16.121l10.823,-6.681l-0.6,4.448l2.222,-1.305l0.684,-5.724l-5.483,-2.024l-2.296,1.506l4.596,1.476l-10.542,6.516z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_4.xml b/app/src/main/res/drawable/laneinfo_1_4.xml
new file mode 100644
index 00000000..a10bf8b1
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_4.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M13.663,17.172C13.392,11.782 3.671,11.773 3.772,17.289L3.796,22.839L0.263,19.724L0.198,21.8L4.865,25.726L9.322,21.826L9.328,19.548L5.807,22.744L5.826,17.693C5.909,14.076 11.597,14.209 11.788,17.598L13.663,17.172Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.875,29.218l-0.026,-24.657l3.885,3.15l0.067,-2.892l-5.05,-4.037l-5.17,4.031l0.078,3.078l4.124,-3.508l0.014,24.833z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_5.xml b/app/src/main/res/drawable/laneinfo_1_5.xml
new file mode 100644
index 00000000..95bc3794
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_5.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M14.042,29.168l0.015,-25.164l3.678,3.127l0.068,-2.744l-4.609,-3.594l-4.504,3.599l0.063,2.577l3.463,-2.855l-0.012,25.094z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.921,14.333l-10.542,-6.516l4.596,-1.476l-2.295,-1.506l-5.484,2.023l0.684,5.724l2.222,1.305l-0.6,-4.448l10.823,6.681z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_6.xml b/app/src/main/res/drawable/laneinfo_1_6.xml
new file mode 100644
index 00000000..a976d2bb
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_6.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="30dp"
+    android:viewportWidth="18"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M5.796,29.208l-0.012,-25.095l3.463,2.855l0.063,-2.577l-4.504,-3.599l-4.609,3.595l0.068,2.744l3.678,-3.127l0.015,25.164z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M4.674,16.119l10.823,-6.681l-0.6,4.448l2.222,-1.305l0.684,-5.724l-5.483,-2.024l-2.296,1.506l4.596,1.476l-10.542,6.516z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_1_7.xml b/app/src/main/res/drawable/laneinfo_1_7.xml
new file mode 100644
index 00000000..3f1b8239
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_1_7.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="17dp"
+    android:height="30dp"
+    android:viewportWidth="17"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M5.909,29.208l-0.014,-25.095l3.465,2.855l0.062,-2.577l-4.504,-3.599l-4.61,3.594l0.069,2.744l3.677,-3.127l0.017,25.164z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M5.81,17.908C5.85,16.247 7.134,15.699 8.5,15.699C9.075,15.699 9.806,15.785 10.261,16C10.753,16.232 10.89,16.497 10.934,16.756C11.006,17.178 11.006,19.768 10.934,24.524L7.437,21.441L7.37,23.496L11.991,27.383L16.404,23.523L16.409,21.268L12.924,24.432L12.943,17.005C11.991,12.082 3.929,13.555 4.117,16.911L5.81,17.908Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_2.xml b/app/src/main/res/drawable/laneinfo_2.xml
new file mode 100644
index 00000000..75695b9c
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_2.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.215,29.041l-0.015,-20.829l2.037,0.136l0.029,20.687z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.148,8.08C13.525,8.766 11.227,10.283 11.222,9.895C11.214,9.508 11.171,7.913 10.04,7.118C8.909,6.323 7.285,6.33 7.285,6.33L3.955,6.346L7.094,10.036L4.34,10.105L0.734,5.479L4.346,0.959L6.933,1.021L4.067,4.496L7.085,4.484C7.085,4.484 8.883,4.561 9.982,4.919C11.559,5.428 12.494,6.524 13.148,8.08Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_2_3.xml b/app/src/main/res/drawable/laneinfo_2_3.xml
new file mode 100644
index 00000000..e81ba91b
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_2_3.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="26dp"
+    android:height="30dp"
+    android:viewportWidth="26"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.82,29.099l0.027,-21.84l2.354,-0.14l-0.018,21.987z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.017,7.058C12.87,6.634 11.462,5.48 10.38,4.978C9.298,4.476 7.391,4.53 7.391,4.53L4.282,4.542L7.237,0.958L4.569,0.894L0.842,5.556L4.563,10.329L7.405,10.257L4.169,6.451L7.605,6.434C7.605,6.434 9.283,6.428 10.449,7.247C11.615,8.067 11.91,9.713 11.917,10.112C11.923,10.91 13.312,7.904 13.017,7.058Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.985,7.058C13.131,6.634 14.538,5.48 15.62,4.978C16.702,4.476 18.609,4.53 18.609,4.53L21.719,4.542L18.763,0.958L21.431,0.894L25.159,5.556L21.439,10.329L18.596,10.257L21.833,6.451L18.397,6.434C18.397,6.434 16.719,6.428 15.552,7.247C14.386,8.067 14.091,9.713 14.085,10.112C14.077,10.91 12.685,7.904 12.985,7.058Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_2_3_4.xml b/app/src/main/res/drawable/laneinfo_2_3_4.xml
new file mode 100644
index 00000000..b351064d
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_2_3_4.xml
@@ -0,0 +1,30 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="26dp"
+    android:height="30dp"
+    android:viewportWidth="26"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.82,29.099l0.028,-21.84l2.354,-0.14l-0.018,21.987z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.017,7.058C12.87,6.634 11.463,5.48 10.381,4.978C9.299,4.476 7.392,4.53 7.392,4.53L4.283,4.542L7.238,0.958L4.57,0.894L0.842,5.556L4.563,10.329L7.405,10.257L4.168,6.451L7.604,6.434C7.604,6.434 9.282,6.428 10.448,7.247C11.614,8.067 11.908,9.713 11.915,10.112C11.923,10.91 13.313,7.904 13.017,7.058Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.984,7.058C13.13,6.634 14.537,5.48 15.619,4.978C16.701,4.476 18.608,4.53 18.608,4.53L21.718,4.542L18.762,0.958L21.43,0.894L25.158,5.556L21.436,10.329L18.595,10.258L21.832,6.452L18.395,6.434C18.395,6.434 16.719,6.428 15.553,7.247C14.387,8.067 14.092,9.713 14.086,10.112C14.076,10.91 12.686,7.904 12.984,7.058Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.875,17.759C13.6,12.236 4.64,12.227 4.744,17.879L4.768,26.079L1.151,22.887L1.082,25.014L5.864,29.037L10.429,25.041L10.435,22.707L6.83,25.982L6.848,18.294C6.933,14.587 11.759,14.724 11.952,18.197L13.875,17.759Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_2_4.xml b/app/src/main/res/drawable/laneinfo_2_4.xml
new file mode 100644
index 00000000..744a41da
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_2_4.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.217,29.181l0.029,-20.904l2.058,-0.137l-0.015,21.047z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M10.055,4.814C8.943,4.452 7.126,4.376 7.126,4.376L4.078,4.387L6.974,0.876L4.361,0.813L0.713,5.38L4.357,10.055L7.14,9.985L3.97,6.256L7.334,6.24C7.334,6.24 8.978,6.234 10.119,7.036C11.262,7.839 11.305,9.452 11.308,9.843C11.314,10.234 13.636,8.7 13.255,8.008C12.593,6.434 11.645,5.329 10.055,4.814Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.229,18.072C12.96,12.661 4.183,12.653 4.286,18.19L4.31,26.223L0.765,23.096L0.696,25.18L5.384,29.121L9.858,25.206L9.864,22.918L6.332,26.127L6.349,18.595C6.433,14.963 11.162,15.096 11.349,18.5L13.229,18.072Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_2_5.xml b/app/src/main/res/drawable/laneinfo_2_5.xml
new file mode 100644
index 00000000..a5506bef
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_2_5.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.429,29.262l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.51,9.521l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M11.425,19.516C11.447,19.099 11.192,17.653 10.065,16.862C8.939,16.07 7.019,16.206 7.019,16.206L3.7,16.221L6.828,19.898L4.086,19.968L0.49,15.357L4.09,10.853L6.668,10.915L3.813,14.378L6.82,14.366C6.82,14.366 8.662,14.314 9.71,14.8C10.755,15.285 12.111,16.4 12.255,16.809C12.536,17.626 11.401,19.915 11.425,19.516Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_2_6.xml b/app/src/main/res/drawable/laneinfo_2_6.xml
new file mode 100644
index 00000000..8ce8581b
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_2_6.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="30dp"
+    android:viewportWidth="24"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.116,29.278l-0.033,-19.755l2.048,0.838l0.032,18.901z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M11.393,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.505l4.597,1.476l-9.535,5.817z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M11.135,19.578C11.158,19.161 10.903,17.715 9.776,16.924C8.649,16.132 6.729,16.268 6.729,16.268L3.41,16.283L6.538,19.96L3.796,20.03L0.2,15.419L3.8,10.915L6.378,10.977L3.523,14.44L6.53,14.428C6.53,14.428 8.372,14.376 9.42,14.862C10.465,15.347 11.821,16.462 11.965,16.871C12.248,17.688 11.112,19.976 11.135,19.578Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_3.xml b/app/src/main/res/drawable/laneinfo_3.xml
new file mode 100644
index 00000000..96609d0c
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_3.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M0.734,29.033l0.028,-20.686l2.036,-0.136l-0.016,20.829z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M4.019,4.92C5.119,4.562 6.915,4.485 6.915,4.485L9.935,4.497L7.069,1.022L9.656,0.96L13.267,5.48L9.661,10.106L6.907,10.037L10.046,6.347L6.716,6.331C6.716,6.331 5.091,6.324 3.96,7.119C2.829,7.914 2.786,9.509 2.78,9.896C2.775,10.284 0.475,8.767 0.853,8.081C1.505,6.524 2.443,5.428 4.019,4.92Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_3_4.xml b/app/src/main/res/drawable/laneinfo_3_4.xml
new file mode 100644
index 00000000..bd615d3d
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_3_4.xml
@@ -0,0 +1,15 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="30dp"
+    android:viewportWidth="24"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M10.947,29.277l-0.034,-19.755l2.048,0.838l0.032,18.901z"
+      android:fillColor="#00C800"/>
+  <path
+      android:pathData="M11.226,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.484,-2.023l-2.296,1.506l4.597,1.476l-9.535,5.817z"
+      android:fillColor="#00C800"/>
+  <path
+      android:pathData="M12.769,18.262C12.502,12.908 3.819,12.899 3.917,18.379L3.943,26.328L0.432,23.234L0.367,25.297L5.004,29.196L9.432,25.322L9.439,23.058L5.942,26.233L5.96,18.779C6.043,15.185 10.721,15.318 10.908,18.685L12.769,18.262Z"
+      android:fillColor="#00C800"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_3_5.xml b/app/src/main/res/drawable/laneinfo_3_5.xml
new file mode 100644
index 00000000..31c37b1f
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_3_5.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="30dp"
+    android:viewportWidth="24"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M10.836,29.262l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.917,9.521l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.036,16.871C12.18,16.462 13.536,15.347 14.581,14.862C15.629,14.376 17.471,14.428 17.471,14.428L20.478,14.44L17.623,10.977L20.201,10.915L23.801,15.419L20.205,20.03L17.463,19.96L20.591,16.283L17.272,16.268C17.272,16.268 15.352,16.132 14.225,16.924C13.098,17.715 12.842,19.161 12.866,19.578C12.886,19.977 11.751,17.688 12.036,16.871Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_3_6.xml b/app/src/main/res/drawable/laneinfo_3_6.xml
new file mode 100644
index 00000000..7cac3588
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_3_6.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M0.523,29.278l-0.033,-19.755l2.048,0.838l0.032,18.901z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M0.801,11.553l10.1,-6.227l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.506l4.597,1.476l-9.534,5.817z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M1.745,16.809C1.889,16.4 3.245,15.285 4.29,14.8C5.338,14.314 7.18,14.366 7.18,14.366L10.187,14.378L7.332,10.915L9.91,10.853L13.51,15.357L9.914,19.968L7.172,19.898L10.3,16.221L6.981,16.206C6.981,16.206 5.061,16.07 3.935,16.862C2.808,17.653 2.552,19.099 2.575,19.516C2.597,19.915 1.463,17.626 1.745,16.809Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_4.xml b/app/src/main/res/drawable/laneinfo_4.xml
new file mode 100644
index 00000000..7587877c
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_4.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="20dp"
+    android:height="28dp"
+    android:viewportWidth="20"
+    android:viewportHeight="28">
+  <path
+      android:pathData="M19.104,5.358C19.1,-1.893 5.711,-1.692 5.629,5.504L5.661,23.316L0.979,19.457L0.896,22.94L6.984,27.804L13.218,22.947L13.122,19.239L8.151,23.199L8.172,6.006C8.315,0.933 16.333,1.474 16.473,5.889L16.428,27.974L19.083,27.987L19.104,5.358Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_4_5.xml b/app/src/main/res/drawable/laneinfo_4_5.xml
new file mode 100644
index 00000000..a5216c51
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_4_5.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.278,29.261l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.359,9.52l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.163,18.345C12.896,12.991 4.213,12.982 4.311,18.462L4.337,26.411L0.826,23.317L0.761,25.38L5.398,29.279L9.826,25.405L9.832,23.141L6.336,26.316L6.354,18.862C6.437,15.268 11.115,15.401 11.302,18.768L13.163,18.345Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_4_6.xml b/app/src/main/res/drawable/laneinfo_4_6.xml
new file mode 100644
index 00000000..bd615d3d
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_4_6.xml
@@ -0,0 +1,15 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="24dp"
+    android:height="30dp"
+    android:viewportWidth="24"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M10.947,29.277l-0.034,-19.755l2.048,0.838l0.032,18.901z"
+      android:fillColor="#00C800"/>
+  <path
+      android:pathData="M11.226,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.484,-2.023l-2.296,1.506l4.597,1.476l-9.535,5.817z"
+      android:fillColor="#00C800"/>
+  <path
+      android:pathData="M12.769,18.262C12.502,12.908 3.819,12.899 3.917,18.379L3.943,26.328L0.432,23.234L0.367,25.297L5.004,29.196L9.432,25.322L9.439,23.058L5.942,26.233L5.96,18.779C6.043,15.185 10.721,15.318 10.908,18.685L12.769,18.262Z"
+      android:fillColor="#00C800"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_5.xml b/app/src/main/res/drawable/laneinfo_5.xml
new file mode 100644
index 00000000..b35bd7a3
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_5.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M11.278,29.262l0.032,-18.901l2.048,-0.838l-0.034,19.755z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M13.359,9.521l-9.535,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_5_6.xml b/app/src/main/res/drawable/laneinfo_5_6.xml
new file mode 100644
index 00000000..f3cf04f7
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_5_6.xml
@@ -0,0 +1,24 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="26dp"
+    android:height="30dp"
+    android:viewportWidth="26"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M13.608,9.595l-9.534,-5.817l4.597,-1.476l-2.297,-1.506l-5.483,2.023l0.684,5.724l2.223,1.305l-0.601,-4.448l10.101,6.226z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M11.777,29.413l-0.034,-19.755l2.049,0.838l0.031,18.901z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M12.702,11.417l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.506l4.597,1.476l-9.535,5.817z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_6.xml b/app/src/main/res/drawable/laneinfo_6.xml
new file mode 100644
index 00000000..fd617e7f
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_6.xml
@@ -0,0 +1,18 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="14dp"
+    android:height="30dp"
+    android:viewportWidth="14"
+    android:viewportHeight="30">
+  <path
+      android:pathData="M0.674,29.277l-0.034,-19.755l2.048,0.838l0.032,18.901z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+  <path
+      android:pathData="M0.953,11.553l10.101,-6.226l-0.601,4.448l2.223,-1.305l0.684,-5.724l-5.483,-2.023l-2.297,1.506l4.597,1.476l-9.535,5.817z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/laneinfo_7.xml b/app/src/main/res/drawable/laneinfo_7.xml
new file mode 100644
index 00000000..8dfa5d45
--- /dev/null
+++ b/app/src/main/res/drawable/laneinfo_7.xml
@@ -0,0 +1,12 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="28dp"
+    android:viewportWidth="18"
+    android:viewportHeight="28">
+  <path
+      android:pathData="M2.676,10.345C2.671,8.227 2.441,6.999 2.676,5.876C3.359,2.607 5.252,2.578 6.627,2.547C7.633,2.524 9.049,2.69 9.706,3.801C10.314,4.828 10.201,6.729 10.201,8.491L10.233,12.303L5.551,8.444L5.468,11.927L11.556,16.791L17.79,11.934L17.694,8.226L12.723,12.186L12.744,5.993C12.723,0.845 9.405,-0.087 6.151,0C2.986,0.085 0,1.805 0.045,5.876L0,27.961L2.655,27.974L2.676,10.345Z"
+      android:strokeWidth="1"
+      android:fillColor="#00C800"
+      android:fillType="nonZero"
+      android:strokeColor="#00000000"/>
+</vector>
diff --git a/app/src/main/res/drawable/shape_dashed_line.xml b/app/src/main/res/drawable/shape_dashed_line.xml
new file mode 100644
index 00000000..843c76c1
--- /dev/null
+++ b/app/src/main/res/drawable/shape_dashed_line.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="line">
+    <stroke
+        android:width="1dp"
+        android:color="@color/white"
+        android:dashWidth="6dp"
+        android:dashGap="6dp" />
+    <size android:width="1dp" />
+</shape>
+
+
diff --git a/app/src/main/res/drawable/shape_road_name_bg.xml b/app/src/main/res/drawable/shape_road_name_bg.xml
new file mode 100644
index 00000000..7b1a14f6
--- /dev/null
+++ b/app/src/main/res/drawable/shape_road_name_bg.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="#BA0C122B" />
+    <corners
+        android:bottomLeftRadius="6dp"
+        android:bottomRightRadius="6dp"
+        android:topLeftRadius="6dp"
+        android:topRightRadius="6dp" />
+</shape>
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_vertical_dashed_line.xml b/app/src/main/res/drawable/shape_vertical_dashed_line.xml
new file mode 100644
index 00000000..b9ca9aa6
--- /dev/null
+++ b/app/src/main/res/drawable/shape_vertical_dashed_line.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:left="-300dp"
+        android:right="-300dp">
+        <rotate
+            android:drawable="@drawable/shape_dashed_line"
+            android:fromDegrees="90" />
+    </item>
+</layer-list>
\ 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 f36b8ba2..eb4204c8 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -44,79 +44,35 @@
             app:layout_constraintRight_toRightOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
-        <androidx.recyclerview.widget.RecyclerView
-            android:id="@+id/main_activity_top_sign_recyclerview"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginTop="2dp"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
 
         <androidx.recyclerview.widget.RecyclerView
             android:id="@+id/main_activity_sign_recyclerview"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_marginLeft="20dp"
-            android:layout_marginTop="20dp"
+            android:layout_marginTop="2dp"
             android:maxHeight="350dp"
             app:layout_constraintLeft_toLeftOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
-        <ImageView
-            android:id="@+id/main_activity_sign_more_info_bg"
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/main_activity_top_sign_recyclerview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="280dp"
+            android:layout_marginTop="2dp"
+            app:layout_constraintLeft_toLeftOf="parent"
+            app:layout_constraintTop_toTopOf="parent" />
+
+        <FrameLayout
+            android:id="@+id/main_activity_sign_more_info_fragment"
             android:layout_width="240dp"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="260dp"
-            android:layout_marginTop="40dp"
-            android:background="@drawable/main_sign_moreinfo_bg"
+            android:layout_marginTop="80dp"
             android:minHeight="140dp"
-            app:layout_constraintLeft_toLeftOf="parent"
-            app:layout_constraintTop_toBottomOf="@id/main_activity_top_sign_recyclerview" />
-
-        <TextView
-            android:id="@+id/main_activity_sign_more_info_title"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="10dp"
-            android:layout_marginTop="10dp"
-            android:drawableLeft="@drawable/icon_main_moreinfo_text_left"
-            android:drawablePadding="4dp"
-            android:text="条件点限速"
-            android:textColor="@color/orange"
-            app:layout_constraintLeft_toLeftOf="@id/main_activity_sign_more_info_bg"
-            app:layout_constraintTop_toTopOf="@id/main_activity_sign_more_info_bg" />
-
-        <TextView
-            android:id="@+id/main_activity_sign_more_info_text1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_marginRight="10dp"
-            android:text="条件点限速"
-            android:textColor="@color/white"
-            app:layout_constraintRight_toRightOf="@id/main_activity_sign_more_info_bg"
-            app:layout_constraintTop_toBottomOf="@id/main_activity_sign_more_info_title" />
-
-        <TextView
-            android:id="@+id/main_activity_sign_more_info_text2"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_marginLeft="10dp"
-            android:layout_marginTop="10dp"
-            android:layout_marginRight="10dp"
-            android:singleLine="false"
-            android:text="条件点限速"
-            android:textColor="@color/white"
-            app:layout_constraintLeft_toLeftOf="@id/main_activity_sign_more_info_bg"
-            app:layout_constraintRight_toRightOf="@id/main_activity_sign_more_info_bg"
-            app:layout_constraintTop_toBottomOf="@id/main_activity_sign_more_info_text1" />
-
-        <androidx.constraintlayout.widget.Group
-            android:id="@+id/main_activity_sign_more_info_group"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:visibility="gone"
-            app:constraint_referenced_ids="main_activity_sign_more_info_bg,main_activity_sign_more_info_text2,main_activity_sign_more_info_text1,main_activity_sign_more_info_title" />
+            app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview"
+            app:layout_constraintTop_toTopOf="parent" />
 
         <androidx.constraintlayout.helper.widget.Flow
             android:id="@+id/main_activity_flow"
@@ -296,6 +252,23 @@
             app:layout_constraintBottom_toTopOf="@id/main_activity_bottom_sheet_bg"
             app:layout_constraintRight_toLeftOf="@id/main_activity_middle_fragment" />
 
+        <TextView
+            android:id="@+id/main_activity_road_name"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:background="@drawable/shape_road_name_bg"
+            android:onClick="@{()->mainActivity.openRoadNameFragment()}"
+            android:paddingLeft="10dp"
+            android:paddingTop="4dp"
+            android:paddingRight="10dp"
+            android:paddingBottom="4dp"
+            android:textColor="@color/white"
+            android:textSize="16sp"
+            android:visibility="gone"
+            app:layout_constraintBottom_toBottomOf="@id/main_activity_geometry"
+            app:layout_constraintLeft_toLeftOf="@id/main_activity_top_sign_recyclerview" />
+
+
         <ImageButton
             android:id="@+id/main_activity_zoom_out"
             android:layout_width="@dimen/zoom_btns_w"
@@ -488,9 +461,9 @@
             android:id="@+id/main_bottom_route"
             style="@style/main_activity_bottom_sheet_icon"
             android:background="@drawable/icon_main_bottom_route"
+            android:onClick="@{()->mainActivity.onClickRouteFragment()}"
             app:layout_constraintBottom_toTopOf="@id/main_bottom_route_text"
             app:layout_constraintLeft_toRightOf="@id/main_bottom_offline_map"
-            android:onClick="@{()->mainActivity.onClickRouteFragment()}"
             app:layout_constraintRight_toRightOf="@id/main_activity_bottom_sheet_bg"
             app:layout_constraintTop_toTopOf="@id/main_bottom_task"
             app:layout_constraintVertical_chainStyle="packed" />
@@ -499,10 +472,10 @@
             android:id="@+id/main_bottom_route_text"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:onClick="@{()->mainActivity.onClickRouteFragment()}"
             android:text="路径规划"
             android:textColor="@color/blue"
             android:textSize="10sp"
-            android:onClick="@{()->mainActivity.onClickRouteFragment()}"
             app:layout_constraintBottom_toBottomOf="@id/main_activity_bottom_sheet_bg"
             app:layout_constraintLeft_toLeftOf="@id/main_bottom_route"
             app:layout_constraintRight_toRightOf="@id/main_bottom_route"
diff --git a/app/src/main/res/layout/adapter_electronic_eye.xml b/app/src/main/res/layout/adapter_electronic_eye.xml
new file mode 100644
index 00000000..ecd17bd3
--- /dev/null
+++ b/app/src/main/res/layout/adapter_electronic_eye.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="5dp"
+    android:paddingBottom="5dp"
+    tools:context="com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeInfoAdapter">
+
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_weight="3"
+        android:textColor="@color/white" />
+
+    <TextView
+        android:id="@+id/text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="10dp"
+        android:layout_toRightOf="@id/title"
+        android:layout_weight="2"
+        android:textColor="@color/white" />
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/adapter_road_name.xml b/app/src/main/res/layout/adapter_road_name.xml
new file mode 100644
index 00000000..4a4d65dd
--- /dev/null
+++ b/app/src/main/res/layout/adapter_road_name.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textColor="@color/white" />
+
+    <TextView
+        android:id="@+id/name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="10dp"
+        android:layout_toRightOf="@id/title"
+        android:textColor="@color/white" />
+
+    <TextView
+        android:id="@+id/type"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:textColor="@color/white" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/adapter_sign.xml b/app/src/main/res/layout/adapter_sign.xml
index 3dbdbdb6..bb0efa50 100644
--- a/app/src/main/res/layout/adapter_sign.xml
+++ b/app/src/main/res/layout/adapter_sign.xml
@@ -29,6 +29,16 @@
         android:textColor="#2F2F2F"
         android:textSize="16sp" />
 
+    <TextView
+        android:id="@+id/sign_second_icon"
+        android:layout_width="40dp"
+        android:layout_height="40dp"
+        android:gravity="center"
+        android:layout_marginTop="10dp"
+        android:layout_toRightOf="@id/sign_main_icon"
+        android:text=""
+        android:textColor="@color/white"
+        android:textSize="16sp" />
     <TextView
         android:id="@+id/sign_bottom_text"
         android:layout_width="wrap_content"
@@ -46,10 +56,10 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_alignTop="@id/sign_bottom_text"
+        android:layout_alignRight="@id/sign_main_bg"
         android:layout_marginRight="15dp"
         android:gravity="center"
         android:text="其他信息"
-        android:layout_alignRight="@id/sign_main_bg"
         android:textColor="@color/white"
         android:textSize="14sp" />
 
@@ -65,11 +75,12 @@
 
     <ImageView
         android:id="@+id/sign_main_fast_error"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentTop="true"
         android:layout_marginLeft="172dp"
         android:layout_marginTop="4dp"
-        android:layout_alignParentTop="true"
-        android:background="@drawable/icon_evaluation"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"/>
+        android:visibility="gone"
+        android:background="@drawable/icon_evaluation" />
 
 </RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/adapter_sign_laneinfo.xml b/app/src/main/res/layout/adapter_sign_laneinfo.xml
new file mode 100644
index 00000000..261a18f9
--- /dev/null
+++ b/app/src/main/res/layout/adapter_sign_laneinfo.xml
@@ -0,0 +1,41 @@
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="193dp"
+    android:layout_height="78dp"
+    android:background="@drawable/bg_sign_laneinfo"
+    android:orientation="vertical"
+    tools:context="com.navinfo.omqs.ui.activity.map.SignAdapter">
+
+    <LinearLayout
+        android:id="@+id/sign_more_icons_layout"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:gravity="center"
+        android:orientation="horizontal"
+        android:paddingLeft="15dp"
+        android:paddingRight="15dp" />
+
+    <TextView
+        android:id="@+id/sign_bottom_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_marginLeft="15dp"
+        android:layout_marginBottom="5dp"
+        android:gravity="center"
+        android:text="道路名"
+        android:textColor="@color/white"
+        android:textSize="14sp" />
+
+    <TextView
+        android:id="@+id/sign_bottom_right_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@id/sign_bottom_text"
+        android:layout_alignParentRight="true"
+        android:layout_marginRight="15dp"
+        android:gravity="center"
+        android:text="其他信息"
+        android:textColor="@color/white"
+        android:textSize="14sp" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_sign_info.xml b/app/src/main/res/layout/fragment_sign_info.xml
new file mode 100644
index 00000000..acaa2566
--- /dev/null
+++ b/app/src/main/res/layout/fragment_sign_info.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:clickable="true"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:background="@drawable/main_sign_moreinfo_bg"
+    android:padding="8dp"
+    tools:context=".ui.fragment.signMoreInfo.SignMoreInfoFragment">
+
+    <TextView
+        android:id="@+id/sign_info_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:drawableLeft="@drawable/icon_main_moreinfo_text_left"
+        android:drawablePadding="4dp"
+        android:text="电子眼"
+        android:textColor="@color/orange" />
+
+    <ImageView
+        android:id="@+id/sign_info_cancel"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignTop="@id/sign_info_title"
+        android:layout_alignBottom="@id/sign_info_title"
+        android:layout_alignParentRight="true"
+        android:src="@drawable/baseline_cancel_24" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/sign_info_recyclerview"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@id/sign_info_title"
+        android:layout_marginTop="5dp" />
+</RelativeLayout>
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index b2ec0c64..8b897586 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -1,6 +1,10 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
 
+    <color name="lane_info_0" comment="车信普通道路">#FF2271FF</color>
+    <color name="lane_info_1" comment="车信附加道路">#FF00C800</color>
+    <color name="lane_info_2" comment="车信公交道路">#FFFFB400</color>
+
     <color name="white" comment="主要按钮,背景等颜色">#FFFFFF</color> <!--白色 -->
     <color name="button_press_color" comment="默认的按钮按下去时的背景颜色">#F1EBEB</color>
     <color name="default_button_blue_color" comment="蓝色到紫色的渐变开始颜色">#4954ED</color>
diff --git a/collect-library/build.gradle b/collect-library/build.gradle
index eb29aaa7..6b7ed9ba 100644
--- a/collect-library/build.gradle
+++ b/collect-library/build.gradle
@@ -79,7 +79,7 @@ dependencies {
     implementation "net.sf.kxml:kxml2:2.3.0"
     implementation 'org.slf4j:slf4j-api:2.0.7'
     implementation project(":vtm-themes")
-    implementation project(":vtm-android")
+    api project(":vtm-android")
     implementation project(':vtm-extras')
     implementation project(":vtm-http")
 //    implementation "org.mapsforge:vtm-themes:$vtmVersion"
@@ -109,10 +109,8 @@ dependencies {
 
     implementation "com.google.protobuf:protobuf-java:3.6.1"
     implementation "com.wdtinc:mapbox-vector-tile:3.1.0"
-    implementation "com.caverock:androidsvg:1.4"
     implementation "com.badlogicgames.gdx:gdx:1.11.0"
     implementation "com.badlogicgames.gdx:gdx-backend-android:1.11.0"
-    implementation "com.caverock:androidsvg:1.4"
 //    api "org.mapsforge:vtm-jts:$vtmVersion"
     api project(":vtm-jts")
     api 'org.locationtech.jts:jts-core:1.19.0'
diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml
index fadfe6ab..29d2d7b1 100644
--- a/collect-library/src/main/assets/editormarker.xml
+++ b/collect-library/src/main/assets/editormarker.xml
@@ -174,7 +174,8 @@
 
     <!-- omdb -->
     <style-line id="boundaryType" stipple-width="0.1" width="0.1" />
-
+    <style-line id="s2e" dasharray="1,1" repeat-gap="3" repeat-start="0" stroke="#14582c"
+        width="0.1" />
     <!--###### ASSIGNMENT ######-->
 
     <m e="way" k="natural" v="issea|sea">
@@ -1478,83 +1479,83 @@
         </m>
     </m>
 
-    <!-- 自定义渲染样式 -->
-    <m k="navi_type" zoom-max="22" zoom-min="15">
-        <!-- 车道中心线 -->
-        <m v="had_lane_link">
-            <line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#ff0000"
-                width="0.3" />
-        </m>
-        <!-- 车道边线 -->
-        <m v="had_lane_mark_link">
-            <line stipple-width="0.5" stroke="#0000ff" width="0.1" />
-        </m>
-        <!--道路箭头 objectArrow-->
-        <m v="object_arrow">
-            <area fade="5" fill="#88aaaa00" stroke="#ff0000" stroke-width="0.1"></area>
-        </m>
-        <!--人行横道 objectcrosswalk-->
-        <m v="object_crosswalk">
-            <area fill="#88800080" stroke="#ff0000" stroke-width="0.2"></area>
-            <caption style="bold" dy="12" fill="#4D2F08" k="name" size="14" stroke="#ffffff"
-                stroke-width="2.0" />
-            <caption style="bold" dy="-12" fill="#4D2F08" k="ele" size="12" stroke="#ffffff"
-                stroke-width="2.0" />
-        </m>
-        <!--杆状物 objectpole-->
-        <m v="object_pole">
-            <line stipple-width="0.5" stroke="#8800aaaa" width="0.1" />
-        </m>
-        <!--对象标志 objectsymbol-->
-        <m v="object_symbol">
-            <area fill="#880000cc" stroke="#0000cc" stroke-width="0.2"></area>
-        </m>
-        <!--交通信号灯 objectTrfficLights-->
-        <m v="object_trrfic">
-            <area fill="#8800cc00" stroke="#00cc00" stroke-width="0.2"></area>
-        </m>
+<!--    &lt;!&ndash; 自定义渲染样式 &ndash;&gt;-->
+<!--    <m k="navi_type" zoom-max="22" zoom-min="15">-->
+<!--        &lt;!&ndash; 车道中心线 &ndash;&gt;-->
+<!--        <m v="had_lane_link">-->
+<!--            <line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#ff0000"-->
+<!--                width="0.3" />-->
+<!--        </m>-->
+<!--        &lt;!&ndash; 车道边线 &ndash;&gt;-->
+<!--        <m v="had_lane_mark_link">-->
+<!--            <line stipple-width="0.5" stroke="#0000ff" width="0.1" />-->
+<!--        </m>-->
+<!--        &lt;!&ndash;道路箭头 objectArrow&ndash;&gt;-->
+<!--        <m v="object_arrow">-->
+<!--            <area fade="5" fill="#88aaaa00" stroke="#ff0000" stroke-width="0.1"></area>-->
+<!--        </m>-->
+<!--        &lt;!&ndash;人行横道 objectcrosswalk&ndash;&gt;-->
+<!--        <m v="object_crosswalk">-->
+<!--            <area fill="#88800080" stroke="#ff0000" stroke-width="0.2"></area>-->
+<!--            <caption style="bold" dy="12" fill="#4D2F08" k="name" size="14" stroke="#ffffff"-->
+<!--                stroke-width="2.0" />-->
+<!--            <caption style="bold" dy="-12" fill="#4D2F08" k="ele" size="12" stroke="#ffffff"-->
+<!--                stroke-width="2.0" />-->
+<!--        </m>-->
+<!--        &lt;!&ndash;杆状物 objectpole&ndash;&gt;-->
+<!--        <m v="object_pole">-->
+<!--            <line stipple-width="0.5" stroke="#8800aaaa" width="0.1" />-->
+<!--        </m>-->
+<!--        &lt;!&ndash;对象标志 objectsymbol&ndash;&gt;-->
+<!--        <m v="object_symbol">-->
+<!--            <area fill="#880000cc" stroke="#0000cc" stroke-width="0.2"></area>-->
+<!--        </m>-->
+<!--        &lt;!&ndash;交通信号灯 objectTrfficLights&ndash;&gt;-->
+<!--        <m v="object_trrfic">-->
+<!--            <area fill="#8800cc00" stroke="#00cc00" stroke-width="0.2"></area>-->
+<!--        </m>-->
 
-        <m zoom-max="19" zoom-min="15">
-            <text use="ferry" />
-        </m>
+<!--        <m zoom-max="19" zoom-min="15">-->
+<!--            <text use="ferry" />-->
+<!--        </m>-->
 
-        <!--道路方向-->
-        <m v="symbol_object_arrow">
-            <symbol use="oneway"></symbol>
-        </m>
-        <!--杆状物-->
-        <m v="symbol_object_pole">
-            <symbol src="assets:symbols/gondola.svg" />
-        </m>
-        <!--对象标志-->
-        <m v="symbol_object_symbol">
-            <symbol src="assets:symbols/peak.svg" />
-        </m>
-        <!--交通信号灯-->
-        <m v="symbol_object_traffic">
-            <symbol src="assets:symbols/traffic_signal.svg" />
-        </m>
-    </m>
+<!--        &lt;!&ndash;道路方向&ndash;&gt;-->
+<!--        <m v="symbol_object_arrow">-->
+<!--            <symbol use="oneway"></symbol>-->
+<!--        </m>-->
+<!--        &lt;!&ndash;杆状物&ndash;&gt;-->
+<!--        <m v="symbol_object_pole">-->
+<!--            <symbol src="assets:symbols/gondola.svg" />-->
+<!--        </m>-->
+<!--        &lt;!&ndash;对象标志&ndash;&gt;-->
+<!--        <m v="symbol_object_symbol">-->
+<!--            <symbol src="assets:symbols/peak.svg" />-->
+<!--        </m>-->
+<!--        &lt;!&ndash;交通信号灯&ndash;&gt;-->
+<!--        <m v="symbol_object_traffic">-->
+<!--            <symbol src="assets:symbols/traffic_signal.svg" />-->
+<!--        </m>-->
+<!--    </m>-->
 
-    <m k="nav_style">
-        <m v="symbol_object_line">
-            <m k="rule" zoom-max="22" zoom-min="15">
-                <!-- 蓝色黑色间隔线 -->
-                <m v="blue_link">
-                    <line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#00000000"
-                        width="0.1" />
-                </m>
-                <!-- 黄色线 -->
-                <m v="yellow_link">
-                    <line stipple-width="0.1" stroke="#f4ea2a" width="0.1" />
-                </m>
-            </m>
-            <line stipple-width="0.5" stroke="#33aaaa" width="0.3" />
-        </m>
-        <m v="symbol_track_point" zoom-max="25" zoom-min="10">
-            <symbol src="assets:symbols/dot_blue.svg" />
-        </m>
-    </m>
+<!--    <m k="nav_style">-->
+<!--        <m v="symbol_object_line">-->
+<!--            <m k="rule" zoom-max="22" zoom-min="15">-->
+<!--                &lt;!&ndash; 蓝色黑色间隔线 &ndash;&gt;-->
+<!--                <m v="blue_link">-->
+<!--                    <line dasharray="20,20" fix="true" stipple-stroke="#00000000" stroke="#00000000"-->
+<!--                        width="0.1" />-->
+<!--                </m>-->
+<!--                &lt;!&ndash; 黄色线 &ndash;&gt;-->
+<!--                <m v="yellow_link">-->
+<!--                    <line stipple-width="0.1" stroke="#f4ea2a" width="0.1" />-->
+<!--                </m>-->
+<!--            </m>-->
+<!--            <line stipple-width="0.5" stroke="#33aaaa" width="0.3" />-->
+<!--        </m>-->
+<!--        <m v="symbol_track_point" zoom-max="25" zoom-min="10">-->
+<!--            <symbol src="assets:symbols/dot_blue.svg" />-->
+<!--        </m>-->
+<!--    </m>-->
 
     <m k="qi_table">
         <!--车道数-->
@@ -1799,13 +1800,41 @@
                     symbol-width="76"></symbol>
             </m>
             <m k="type" v="s_2_e">
-                <line dasharray="1,1" repeat-gap="3" repeat-start="0" stroke="#14582c"
-                    width="0.1" />
+                <line use="s2e" />
+            </m>
+        </m>
+        <!--电子眼-->
+        <m v="OMDB_ELECTRONICEYE">
+            <m k="angle">
+                <symbol repeat="false" repeat-start="0" rotate="false"
+                    src="assets:symbols/volcano.svg" symbol-height="69" symbol-width="69"></symbol>
+            </m>
+            <caption k="name" fill="#000000" priority="0" size="14" stroke="#ffffff" stroke-width="1.0" dy="-30"></caption>
+            <m k="type" v="angle">
+                <symbol repeat="false" repeat-gap="2000" repeat-start="0" rotate="true"
+                    src="assets:omdb/icon_arrow_right.svg" symbol-height="76"
+                    symbol-width="76"></symbol>
+            </m>
+            <m k="type" v="s_2_e">
+                <line use="s2e" />
+            </m>
+    </m>
+    <!-- 路口 -->
+        <m v="OMDB_INTERSECTION">
+            <m k="type" v="node">
+                <symbol src="assets:symbols/dot_blue_dark.svg"></symbol>
+            </m>
+            <m k="intersectionPid">
+                <symbol src="assets:symbols/dot_magenta.svg"></symbol>
             </m>
         </m>
         <!-- 道路名 -->
         <m v="OMDB_LINK_NAME">
             <text use="road"></text>
         </m>
+        <!-- 车信 -->
+        <m v="OMDB_LANEINFO">
+            <text use="road"></text>
+        </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 a799e01c..f0cbe8f5 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
@@ -1,5 +1,6 @@
 package com.navinfo.collect.library.data.entity
 
+import android.os.Parcelable
 import com.navinfo.collect.library.system.Constant
 import com.navinfo.collect.library.utils.GeometryTools
 import com.navinfo.collect.library.utils.GeometryToolsKt
@@ -8,6 +9,7 @@ import io.realm.RealmObject
 import io.realm.RealmSet
 import io.realm.annotations.Ignore
 import io.realm.annotations.PrimaryKey
+import kotlinx.parcelize.Parcelize
 import org.locationtech.jts.geom.Coordinate
 import org.locationtech.jts.geom.Geometry
 import org.oscim.core.MercatorProjection
@@ -16,13 +18,15 @@ import java.util.*
 /**
  * 渲染要素对应的实体
  * */
-open class RenderEntity() : RealmObject() {
+@Parcelize
+open class RenderEntity() : RealmObject(), Parcelable {
     @PrimaryKey
     var id: String = UUID.randomUUID().toString() // id
     lateinit var name: String //要素名
     lateinit var table: String //要素表名
     var code: Int = 0 // 要素编码
-    var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下
+    var geometry: String =
+        "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下
         get() {
             wkt = GeometryTools.createGeometry(field)
             return field
@@ -56,7 +60,7 @@ open class RenderEntity() : RealmObject() {
     var tileX: RealmSet<Int> = RealmSet() // x方向的tile编码
     var tileY: RealmSet<Int> = RealmSet()  // y方向的tile编码
 
-    constructor(name: String): this() {
+    constructor(name: String) : this() {
         this.name = name
     }
 
@@ -65,9 +69,11 @@ open class RenderEntity() : RealmObject() {
             //道路linkId
             const val linkPid = "linkPid"
         }
+
         object LimitTable {
             const val linkPid = "linkPid"
         }
+
         object KindCodeTable {
             const val linkPid = "linkPid"
         }
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 e0855bb1..44271835 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
@@ -293,7 +293,7 @@ public class GeometryTools {
      * @param coords []
      * @return Geometry
      */
-    public LineString createLineString(Coordinate[] coords) {
+    public static LineString createLineString(Coordinate[] coords) {
         LineString lineString = null;
         GeometryFactory factory = new GeometryFactory();
         lineString = factory.createLineString(coords);