From 71dab4d22b11e2b124a919c5536ed9522f6f872c Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Mon, 22 May 2023 17:48:20 +0800
Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=E4=BB=A5submodule=E6=96=B9?=
 =?UTF-8?q?=E5=BC=8F=E5=BC=95=E5=85=A5vtm=E6=BA=90=E7=A0=81=EF=BC=8C?=
 =?UTF-8?q?=E6=96=B9=E4=BE=BF=E5=90=8E=E7=BB=AD=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitmodules                                   |  3 ++
 .../java/com/navinfo/omqs/rule/LeftPanel.kt   |  5 --
 build.gradle                                  | 11 ++--
 collect-library/build.gradle                  | 52 ++++++++++++-------
 gradle/wrapper/gradle-wrapper.properties      |  2 +-
 settings.gradle                               | 41 +++++++++++++++
 vtm                                           |  1 +
 7 files changed, 88 insertions(+), 27 deletions(-)
 create mode 100644 .gitmodules
 delete mode 100644 app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt
 create mode 160000 vtm

diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..5c54078a
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "vtm"]
+	path = vtm
+	url = git@github.com:mapsforge/vtm.git
diff --git a/app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt b/app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt
deleted file mode 100644
index e4214c05..00000000
--- a/app/src/main/java/com/navinfo/omqs/rule/LeftPanel.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.navinfo.omqs.rule
-
-class LeftPanel {
-
-}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 0a318d80..5900d1f1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,9 +8,14 @@ buildscript {
     }
 }
 plugins {
-    id 'com.android.application' version '7.3.1' apply false
-    id 'com.android.library' version '7.3.1' apply false
+    id 'com.android.application' version '7.4.2' apply false
+    id 'com.android.library' version '7.4.2' apply false
     id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
     id 'com.google.dagger.hilt.android' version '2.44' apply false
-
 }
+static def androidCompileSdk() { return 33 }
+allprojects {
+    ext.gdxVersion = "1.11.0"
+    ext.gwtVersion = "2.8.2"
+    ext.slf4jVersion = "1.7.28"
+}
\ No newline at end of file
diff --git a/collect-library/build.gradle b/collect-library/build.gradle
index 85910984..eb29aaa7 100644
--- a/collect-library/build.gradle
+++ b/collect-library/build.gradle
@@ -45,6 +45,12 @@ android {
     sourceSets {
         main {
             jniLibs.srcDirs = ['libs']
+            file("../vtm/vtm-android/natives").eachDir() { dir ->
+                jniLibs.srcDirs += "${dir.path}/lib"
+            }
+            file("../vtm/vtm-android-gdx/natives").eachDir() { dir ->
+                jniLibs.srcDirs += "${dir.path}/lib"
+            }
         }
     }
 }
@@ -72,25 +78,34 @@ dependencies {
     // VTM依赖
     implementation "net.sf.kxml:kxml2:2.3.0"
     implementation 'org.slf4j:slf4j-api:2.0.7'
-    api "org.mapsforge:vtm:$vtmVersion"
-    implementation "org.mapsforge:vtm-themes:$vtmVersion"
-    implementation "org.mapsforge:vtm-android:$vtmVersion"
-    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-armeabi-v7a"
-    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-arm64-v8a"
-    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-x86"
-    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-x86_64"
-    implementation "org.mapsforge:vtm-http:$vtmVersion"
+    implementation project(":vtm-themes")
+    implementation project(":vtm-android")
+    implementation project(':vtm-extras')
+    implementation project(":vtm-http")
+//    implementation "org.mapsforge:vtm-themes:$vtmVersion"
+//    implementation "org.mapsforge:vtm-android:$vtmVersion"
+//    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-armeabi-v7a"
+//    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-arm64-v8a"
+//    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-x86"
+//    runtimeOnly "org.mapsforge:vtm-android:$vtmVersion:natives-x86_64"
+//    implementation "org.mapsforge:vtm-http:$vtmVersion"
 
-    implementation "org.mapsforge:vtm-json:$vtmVersion"
-    implementation "org.mapsforge:vtm-gdx:$vtmVersion"
-    implementation "org.mapsforge:vtm-android-mvt:$vtmVersion"
-    implementation "org.mapsforge:vtm-mvt:$vtmVersion"
+    implementation project(":vtm-json")
+//    implementation project(":vtm-gdx")
+//    implementation project(":vtm-gdx-poi3d")
+    implementation project(":vtm-android-mvt")
+    implementation project(":vtm-mvt")
+//    implementation "org.mapsforge:vtm-json:$vtmVersion"
+//    implementation "org.mapsforge:vtm-gdx:$vtmVersion"
+//    implementation "org.mapsforge:vtm-android-mvt:$vtmVersion"
+//    implementation "org.mapsforge:vtm-mvt:$vtmVersion"
 
-    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-armeabi-v7a"
-    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-arm64-v8a"
-    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-x86"
-    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-x86_64"
-    implementation "org.mapsforge:vtm-android-gdx:$vtmVersion"
+//    implementation project(":vtm-android-gdx")
+//    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-armeabi-v7a"
+//    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-arm64-v8a"
+//    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-x86"
+//    runtimeOnly "org.mapsforge:vtm-android-gdx:$vtmVersion:natives-x86_64"
+//    implementation "org.mapsforge:vtm-android-gdx:$vtmVersion"
 
     implementation "com.google.protobuf:protobuf-java:3.6.1"
     implementation "com.wdtinc:mapbox-vector-tile:3.1.0"
@@ -98,7 +113,8 @@ dependencies {
     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 "org.mapsforge:vtm-jts:$vtmVersion"
+    api project(":vtm-jts")
     api 'org.locationtech.jts:jts-core:1.19.0'
     implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.11'
     implementation 'com.squareup.okio:okio:3.3.0'
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index fce747eb..690a555d 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
 #Tue Mar 21 10:15:37 CST 2023
 distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
 distributionPath=wrapper/dists
 zipStorePath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
diff --git a/settings.gradle b/settings.gradle
index b39629d4..edc00b4f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -30,5 +30,46 @@ dependencyResolutionManagement {
     }
 }
 rootProject.name = "OMQualityInspection"
+
 include ':app'
 include ':collect-library'
+//include ':vtm:vtm'
+//include ':vtm:vtm-android'
+//include ':vtm:vtm-android-gdx'
+//include ':vtm:vtm-android-mvt'
+//include ':vtm:vtm-extras'
+//include ':vtm:vtm-gdx'
+//include ':vtm:vtm-gdx-poi3d'
+//include ':vtm:vtm-http'
+//include ':vtm:vtm-json'
+//include ':vtm:vtm-jts'
+//include ':vtm:vtm-models'
+//include ':vtm:vtm-mvt'
+//include ':vtm:vtm-theme-comparator'
+//include ':vtm:vtm-themes'
+include ':vtm'
+include ':vtm-models'
+include ':vtm-themes'
+include ':vtm-android-mvt'
+include ':vtm-android-gdx'
+include ':vtm-android'
+include ':vtm-mvt'
+include ':vtm-gdx'
+include ':vtm-jts'
+include ':vtm-http'
+include ':vtm-json'
+include ':vtm-extras'
+include ':vtm-gdx-poi3d'
+project(':vtm').projectDir = new File(rootDir, 'vtm/vtm/')
+project(':vtm-models').projectDir = new File(rootDir, 'vtm/vtm-models/')
+project(':vtm-themes').projectDir = new File(rootDir, 'vtm/vtm-themes/')
+project(':vtm-android-mvt').projectDir = new File(rootDir, 'vtm/vtm-android-mvt/')
+project(':vtm-android-gdx').projectDir = new File(rootDir, 'vtm/vtm-android-gdx/')
+project(':vtm-android').projectDir = new File(rootDir, 'vtm/vtm-android/')
+project(':vtm-mvt').projectDir = new File(rootDir, 'vtm/vtm-mvt/')
+project(':vtm-gdx').projectDir = new File(rootDir, 'vtm/vtm-gdx/')
+project(':vtm-jts').projectDir = new File(rootDir, 'vtm/vtm-jts/')
+project(':vtm-http').projectDir = new File(rootDir, 'vtm/vtm-http/')
+project(':vtm-json').projectDir = new File(rootDir, 'vtm/vtm-json/')
+project(':vtm-extras').projectDir = new File(rootDir, 'vtm/vtm-extras/')
+project(':vtm-gdx-poi3d').projectDir = new File(rootDir, 'vtm/vtm-gdx-poi3d/')
diff --git a/vtm b/vtm
new file mode 160000
index 00000000..1ee201a4
--- /dev/null
+++ b/vtm
@@ -0,0 +1 @@
+Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a

From d0c0eb97ba73c367981de22e39ebb91f10b624df Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Tue, 23 May 2023 15:37:12 +0800
Subject: [PATCH 2/9] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0git=E5=BF=BD?=
 =?UTF-8?q?=E7=95=A5=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitignore b/.gitignore
index 8ccc4f86..4e2ca589 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@
 .externalNativeBuild
 .cxx
 local.properties
+./vtm/
\ No newline at end of file

From f4ddc2768d31d9abf6ec0db53ed1e386873f5915 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Tue, 23 May 2023 15:39:11 +0800
Subject: [PATCH 3/9] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0git=E5=BF=BD?=
 =?UTF-8?q?=E7=95=A5=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 4e2ca589..3e0cedc7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,4 @@
 .externalNativeBuild
 .cxx
 local.properties
-./vtm/
\ No newline at end of file
+/vtm/
\ No newline at end of file

From 7f6ae65e62bac16b71fe788f8a2ee281a7cb726d Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Tue, 23 May 2023 15:41:36 +0800
Subject: [PATCH 4/9] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0geometry=E5=8F=B3?=
 =?UTF-8?q?=E7=A7=BB=E5=87=BD=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/navinfo/omqs/db/ImportPreProcess.kt   | 39 +++++++++++++++++++
 1 file changed, 39 insertions(+)

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 ba4a91d7..dfdf88ea 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -1,6 +1,11 @@
 package com.navinfo.omqs.db
 
 import com.navinfo.collect.library.data.entity.RenderEntity
+import com.navinfo.collect.library.utils.GeometryTools
+import org.locationtech.jts.algorithm.Angle
+import org.locationtech.jts.geom.Coordinate
+import org.locationtech.jts.geom.Geometry
+
 
 class ImportPreProcess {
     /**
@@ -11,4 +16,38 @@ class ImportPreProcess {
         renderEntity.properties["foo"] = "bar"
         return renderEntity
     }
+
+    /**
+     * 计算指定数据指定方向的坐标
+     * */
+    fun translateRight(renderEntity: RenderEntity): RenderEntity {
+        // 获取当前renderEntity的geometry
+        val geometry = renderEntity.wkt
+        var angle = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
+        var point = Coordinate(geometry?.coordinate)
+        if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
+            angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
+        } 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)
+            // 计算线段的方向
+            angle = Angle.angle(p1, p2)
+            point = p2
+        }
+
+        // 将角度转换为弧度
+        val radian = Math.toRadians(angle)
+
+        // 计算偏移距离
+        val dx: Double = GeometryTools.convertDistanceToDegree(5.0, geometry?.coordinate?.y!!) * Math.cos(radian)
+        val dy: Double = GeometryTools.convertDistanceToDegree(5.0, geometry?.coordinate?.y!!) * Math.sin(radian)
+
+        // 计算偏移后的点
+        val coord =
+            Coordinate(point.getX() + dy, point.getY() - dx)
+
+        // 将这个点记录在数据中
+        renderEntity.properties["geometry"] = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)).toString()
+        return renderEntity
+    }
 }
\ No newline at end of file

From 47495bd6ef6958435c833f21b29e9e37bd571816 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Tue, 23 May 2023 15:42:45 +0800
Subject: [PATCH 5/9] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0vtm=E5=AD=90?=
 =?UTF-8?q?=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 vtm | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/vtm b/vtm
index 1ee201a4..ab81b783 160000
--- a/vtm
+++ b/vtm
@@ -1 +1 @@
-Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a
+Subproject commit ab81b7838c8659e650ac30cd052bb807e445b317

From f160f1dd006a9e1042fe856fb04fc9ed92a4640f Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Tue, 23 May 2023 15:44:41 +0800
Subject: [PATCH 6/9] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9git=E5=BF=BD?=
 =?UTF-8?q?=E7=95=A5=E6=96=87=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/.gitignore b/.gitignore
index 3e0cedc7..f6c5d058 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,4 @@
 /build
 /captures
 .externalNativeBuild
-.cxx
-local.properties
-/vtm/
\ No newline at end of file
+.cxx
\ No newline at end of file

From 4d579d87c4cb48cc23ebdc08199cc0e196bf484d Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Wed, 24 May 2023 14:04:11 +0800
Subject: [PATCH 7/9] =?UTF-8?q?fix:=20=E5=A2=9E=E5=8A=A0=E5=8F=B3=E5=81=8F?=
 =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=A7=92=E5=BA=A6?=
 =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/src/main/assets/omdb_config.json          | 13 +++----
 .../com/navinfo/omqs/bean/ImportConfig.kt     | 34 ++++++++++---------
 .../com/navinfo/omqs/db/ImportPreProcess.kt   | 31 +++++++++++++----
 .../personalcenter/PersonalCenterFragment.kt  |  2 +-
 vtm                                           |  2 +-
 5 files changed, 51 insertions(+), 31 deletions(-)

diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json
index 411acf54..a3937a5c 100644
--- a/app/src/main/assets/omdb_config.json
+++ b/app/src/main/assets/omdb_config.json
@@ -25,6 +25,12 @@
 					"v": "0",
 					"klib": "maxSpeed",
 					"vlib": "限"
+				},
+				{
+					"k": "geometry",
+					"v": "~",
+					"klib": "geometry",
+					"vlib": "translateRight()"
 				}
 			]
         },
@@ -76,12 +82,7 @@
             "code": 2041,
             "name": "车道数",
 			"transformer": [
-				{
-					"k": "laneS2e",
-					"v": "~",
-					"klib": "left_00",
-					"vlib": "laneNumLeft00()"
-				}
+
 			]
         }
 	}
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 ed5ba35a..1e15ce0d 100644
--- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt
+++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt
@@ -32,23 +32,25 @@ class ImportConfig {
             }
             // 开始解析key和value,并对数据进行匹配
             m@ for (k in processKeyOrValue(key)) {
-                for (v in processKeyOrValue(value)) {
-                    if ("~" == v &&renderEntity.properties.containsKey(k)) { // ~符可以匹配任意元素
-                        if (valuelib.endsWith("()")) { // 以()结尾,说明该value配置是一个function,需要通过反射调用指定方法
-                            val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") }
-                            method.call(preProcess, renderEntity)
-                        } else {
-                            renderEntity.properties[keylib] = valuelib
+                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)
+                            } 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)
+                            } else {
+                                renderEntity.properties[keylib] = valuelib
+                            }
+                            break@m
                         }
-                        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)
-                        } else {
-                            renderEntity.properties[keylib] = valuelib
-                        }
-                        break@m
                     }
                 }
             }
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 dfdf88ea..1ce234b4 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -23,21 +23,19 @@ class ImportPreProcess {
     fun translateRight(renderEntity: RenderEntity): RenderEntity {
         // 获取当前renderEntity的geometry
         val geometry = renderEntity.wkt
-        var angle = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
+        var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
         var point = Coordinate(geometry?.coordinate)
         if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
-            angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
+            val angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
+            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)
             // 计算线段的方向
-            angle = Angle.angle(p1, p2)
+            radian = Angle.angle(p1, p2)
             point = p2
         }
 
-        // 将角度转换为弧度
-        val radian = Math.toRadians(angle)
-
         // 计算偏移距离
         val dx: Double = GeometryTools.convertDistanceToDegree(5.0, geometry?.coordinate?.y!!) * Math.cos(radian)
         val dy: Double = GeometryTools.convertDistanceToDegree(5.0, geometry?.coordinate?.y!!) * Math.sin(radian)
@@ -47,7 +45,26 @@ class ImportPreProcess {
             Coordinate(point.getX() + dy, point.getY() - dx)
 
         // 将这个点记录在数据中
-        renderEntity.properties["geometry"] = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)).toString()
+        val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y))
+        renderEntity.geometry = geometryTranslate.toString()
         return renderEntity
     }
+
+    fun addAngleFromGeometry(renderEntity: RenderEntity): String {
+        renderEntity.properties.put("angle", "0")
+        if (renderEntity.wkt!=null) {
+            val geometry = renderEntity.wkt
+            if (geometry?.numPoints!!>=2) {
+                val p1: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 2)!!
+                val p2: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 1)!!
+                val angle = Angle.angle(p1, p2).toString()
+                // 计算线段的方向
+                renderEntity.properties["angle"] = angle
+                return angle
+            } else {
+                renderEntity.properties["angle"] = "90"
+            }
+        }
+        return "0"
+    }
 }
\ No newline at end of file
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 b0d14d37..52b16caa 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
@@ -111,7 +111,7 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks {
                     viewModel.readRealmData()
                     // 定位到指定位置
                     niMapController.mMapView.vtmMap.animator()
-                        .animateTo(GeoPoint(40.1012346774074730, 116.25571303257621))
+                        .animateTo(GeoPoint(30.26491197757836, 113.8408333015833 ))
                 }
                 R.id.personal_center_menu_task_list -> {
                     findNavController().navigate(R.id.TaskManagerFragment)
diff --git a/vtm b/vtm
index ab81b783..dd13e533 160000
--- a/vtm
+++ b/vtm
@@ -1 +1 @@
-Subproject commit ab81b7838c8659e650ac30cd052bb807e445b317
+Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323

From 80b8b60556fc6515043c5575790c534d27582e2c Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Wed, 24 May 2023 17:12:34 +0800
Subject: [PATCH 8/9] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE?=
 =?UTF-8?q?=E5=AF=BC=E5=85=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/navinfo/omqs/db/ImportPreProcess.kt   | 21 +++++++++++--------
 1 file changed, 12 insertions(+), 9 deletions(-)

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 1ce234b4..5091a0ab 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -51,18 +51,21 @@ class ImportPreProcess {
     }
 
     fun addAngleFromGeometry(renderEntity: RenderEntity): String {
-        renderEntity.properties.put("angle", "0")
-        if (renderEntity.wkt!=null) {
-            val geometry = renderEntity.wkt
-            if (geometry?.numPoints!!>=2) {
-                val p1: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 2)!!
-                val p2: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 1)!!
-                val angle = Angle.angle(p1, p2).toString()
+        if (!renderEntity.properties.containsKey("angle")) {
+            if (renderEntity.wkt!=null) {
+                val geometry = renderEntity.wkt
+                var angle: String = "90"
+                if (geometry?.numPoints!!>=2) {
+                    val p1: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 2)!!
+                    val p2: Coordinate = geometry?.coordinates?.get(geometry.coordinates.size - 1)!!
+                    // 弧度转角度
+                    angle = Math.toDegrees(Angle.angle(p1, p2)).toString()
+                } else {
+                    angle = "90"
+                }
                 // 计算线段的方向
                 renderEntity.properties["angle"] = angle
                 return angle
-            } else {
-                renderEntity.properties["angle"] = "90"
             }
         }
         return "0"

From 22f52429f4def5591d5c32f3451ed3081f9eb959 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Fri, 26 May 2023 13:46:32 +0800
Subject: [PATCH 9/9] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=99=AE=E9=80=9A?=
 =?UTF-8?q?=E4=BA=A4=E9=99=90=E7=9A=84=E6=98=BE=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 app/src/main/assets/omdb_config.json          |  2 +-
 .../com/navinfo/omqs/db/ImportPreProcess.kt   | 41 ++++++++++++++++++-
 collect-library/resources/rendertheme.xsd     |  1 +
 .../src/main/assets/editormarker.xml          | 17 ++++----
 .../library/data/entity/RenderEntity.kt       |  2 +-
 5 files changed, 52 insertions(+), 11 deletions(-)

diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json
index ce84ea34..d7ac2a91 100644
--- a/app/src/main/assets/omdb_config.json
+++ b/app/src/main/assets/omdb_config.json
@@ -131,7 +131,7 @@
 					"k": "geometry",
 					"v": "~",
 					"klib": "geometry",
-					"vlib": "translateRight()"
+					"vlib": "translateRightWithAngle()"
 				}
 			]
 		},
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 5091a0ab..51bebc84 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -5,6 +5,7 @@ import com.navinfo.collect.library.utils.GeometryTools
 import org.locationtech.jts.algorithm.Angle
 import org.locationtech.jts.geom.Coordinate
 import org.locationtech.jts.geom.Geometry
+import org.oscim.core.GeoPoint
 
 
 class ImportPreProcess {
@@ -37,8 +38,8 @@ class ImportPreProcess {
         }
 
         // 计算偏移距离
-        val dx: Double = GeometryTools.convertDistanceToDegree(5.0, geometry?.coordinate?.y!!) * Math.cos(radian)
-        val dy: Double = GeometryTools.convertDistanceToDegree(5.0, geometry?.coordinate?.y!!) * Math.sin(radian)
+        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 coord =
@@ -50,6 +51,42 @@ class ImportPreProcess {
         return renderEntity
     }
 
+    /**
+     * 将要素按照点位角度的垂直方向右移5米,并生成一个按照垂直角度指向方向的线段,用以显示有方向的图标
+     * */
+    fun translateRightWithAngle(renderEntity: 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) {
+            val angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!!
+            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)
+            // 计算线段的方向
+            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)
+        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 geometryTranslate: Geometry = GeometryTools.createLineString(listOf(pointStart, pointEnd))
+        renderEntity.geometry = geometryTranslate.toString()
+        return renderEntity
+    }
+
     fun addAngleFromGeometry(renderEntity: RenderEntity): String {
         if (!renderEntity.properties.containsKey("angle")) {
             if (renderEntity.wkt!=null) {
diff --git a/collect-library/resources/rendertheme.xsd b/collect-library/resources/rendertheme.xsd
index d77fee4f..3d4d76c5 100644
--- a/collect-library/resources/rendertheme.xsd
+++ b/collect-library/resources/rendertheme.xsd
@@ -94,6 +94,7 @@
             <xs:enumeration value="name"/>
             <xs:enumeration value="maxSpeed"/><!--最高速度-->
             <xs:enumeration value="minSpeed"/><!--最低速度-->
+            <xs:enumeration value="angle"/><!--角度-->
             <xs:enumeration value="ref"/>
         </xs:restriction>
     </xs:simpleType>
diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml
index afc8a751..d8d52cf1 100644
--- a/collect-library/src/main/assets/editormarker.xml
+++ b/collect-library/src/main/assets/editormarker.xml
@@ -1730,7 +1730,7 @@
                         stroke-width="1.0"></caption>
                 </m>
                 <m v="1">
-                    <caption k="maxSpeed" fill="#000000" priority="0" size="16" stroke="#ffffff"
+                    <caption k="maxSpeed" fill="#000000" priority="0" size="14" stroke="#ffffff"
                         stroke-width="1.0"></caption>
                     <symbol src="assets:omdb/icon_4002_1.png" symbol-width="46" symbol-height="46"></symbol>
 <!--                    <circle fill="#ffffff" radius="28" scale-radius="true" stroke="#00ff00" stroke-width="6"/>-->
@@ -1818,14 +1818,14 @@
             <m k="speedFlag">
                 <m v="0">
                     <!--                    <symbol src="assets:omdb/round_speedlimit.svg" symbol-width="30" symbol-height="30"></symbol>-->
-                    <caption k="maxSpeed" fill="#000000" priority="0" size="16" stroke="#ffffff"
+                    <caption k="maxSpeed" fill="#000000" priority="0" size="14" stroke="#ffffff"
                         stroke-width="1.0"></caption>
                     <symbol src="assets:omdb/icon_4003_0.png" symbol-width="46" symbol-height="46"></symbol>
                     <caption k="minSpeed" dy="-28" fill="#000000" priority="0" size="14" stroke="#ffffff"
                         stroke-width="1.0"></caption>
                 </m>
                 <m v="1">
-                    <caption k="maxSpeed" fill="#000000" priority="0" size="16" stroke="#ffffff"
+                    <caption k="maxSpeed" fill="#000000" priority="0" size="14" stroke="#ffffff"
                         stroke-width="1.0"></caption>
                     <symbol src="assets:omdb/icon_4003_1.png" symbol-width="46" symbol-height="46"></symbol>
                     <caption k="minSpeed" dy="-28" fill="#000000" priority="0" size="14" stroke="#ffffff"
@@ -1837,14 +1837,14 @@
         <m v="OMDB_SPEEDLIMIT_VAR">
             <m v="0">
                 <!--                    <symbol src="assets:omdb/round_speedlimit.svg" symbol-width="30" symbol-height="30"></symbol>-->
-                <caption k="maxSpeed" fill="#000000" priority="0" size="16" stroke="#ffffff"
+                <caption k="maxSpeed" fill="#000000" priority="0" size="14" stroke="#ffffff"
                     stroke-width="1.0"></caption>
                 <symbol src="assets:omdb/icon_4004_0.png" symbol-width="46" symbol-height="46"></symbol>
                 <caption k="minSpeed" dy="-28" fill="#000000" priority="0" size="14" stroke="#ffffff"
                     stroke-width="1.0"></caption>
             </m>
             <m v="1">
-                <caption k="maxSpeed" fill="#000000" priority="0" size="16" stroke="#ffffff"
+                <caption k="maxSpeed" fill="#000000" priority="0" size="14" stroke="#ffffff"
                     stroke-width="1.0"></caption>
                 <symbol src="assets:omdb/icon_4004_1.png" symbol-width="46" symbol-height="46"></symbol>
                 <caption k="minSpeed" dy="-28" fill="#000000" priority="0" size="14" stroke="#ffffff"
@@ -1860,7 +1860,7 @@
             <m k="direct">
                 <m v="2">
 <!--                    <lineSymbol src="assets:omdb/oneway_right.svg"></lineSymbol>-->
-                    <symbol src="assets:omdb/oneway_right.svg" ></symbol>
+                    <lineSymbol src="assets:omdb/oneway_right.svg" ></lineSymbol>
                 </m>
                 <m v="3">
 <!--                    <lineSymbol src="assets:omdb/oneway_left.svg"></lineSymbol>-->
@@ -1874,7 +1874,10 @@
         </m>
         <!--普通交限-->
         <m v="OMDB_RESTRICTION">
-            <symbol src="assets:omdb/icon_4006_0.png" repeat="false" symbol-width="46" symbol-height="46" rotate="false"></symbol>
+            <symbol src="assets:omdb/icon_4006_0.png" repeat="false" symbol-width="35" symbol-height="35" rotate="true" repeat-start="0" ></symbol>
+<!--            <line stroke="#14582c" width="0.1"/>-->
+<!--            <caption k="angle" fill="#000000" priority="0" size="14" stroke="#ffffff"-->
+<!--                stroke-width="1.0"></caption>-->
         </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 853ab265..a799e01c 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
@@ -22,7 +22,7 @@ open class RenderEntity() : RealmObject() {
     lateinit var name: String //要素名
     lateinit var table: String //要素表名
     var code: Int = 0 // 要素编码
-    var geometry: String = ""
+    var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下
         get() {
             wkt = GeometryTools.createGeometry(field)
             return field