From 9db5e0c4b19c24a572eda4b1ae8731239e5dcc03 Mon Sep 17 00:00:00 2001
From: xiaoyan <xiaoyan159@163.com>
Date: Mon, 9 Oct 2023 11:07:30 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E8=BD=A6=E4=BF=A1?=
 =?UTF-8?q?=E6=B8=B2=E6=9F=93=E4=BD=8D=E7=BD=AE=E9=94=99=E8=AF=AF=E7=9A=84?=
 =?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../com/navinfo/omqs/db/ImportPreProcess.kt   | 29 ++++++++++++-------
 .../personalcenter/PersonalCenterFragment.kt  |  2 +-
 .../map/handler/LayerManagerHandler.kt        |  4 +--
 .../library/map/source/OMDBDataDecoder.java   |  1 -
 .../map/source/OMDBReferenceDataSource.java   | 13 +++++++--
 .../map/source/OMDBReferenceTileSource.java   |  9 +++++-
 .../map/source/OMDBTileDataSource.java        | 14 ++++++++-
 .../library/map/source/OMDBTileSource.java    | 14 +++++++--
 8 files changed, 65 insertions(+), 21 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 392db41d..438319c8 100644
--- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
+++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt
@@ -52,24 +52,33 @@ class ImportPreProcess {
         // 获取当前renderEntity的geometry
         val geometry = renderEntity.wkt
         var radian = 0.0 // geometry的角度,如果是点,获取angle,如果是线,获取最后两个点的方向
-        var point = Coordinate(geometry?.coordinate)
+
+        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 point = geometry!!.coordinates[geometry!!.coordinates.size-1]
+        if (isReverse){
+            // 逆向的话取第一个点作为渲染图标的位置
+            point = geometry.coordinates[0]
+        }
+
         // 如果数据属性中存在angle,则使用该值,否则需要根据line中的数据进行计算
         if (renderEntity?.properties?.get(
                 "angle"
             ) != null
         ) {
+            // 带有angle字段的数据,也有可能是线,需要判断是否需要根据指定字段判断数据是否为逆向
+
             var angle = renderEntity?.properties?.get("angle")?.toDouble()!!
             // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角
             angle = ((450 - angle) % 360)
             radian = Math.toRadians(angle)
         } else {
-            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_LINESTRING == geometry?.geometryType) {
                 var coordinates = geometry.coordinates
                 if (isReverse) {
@@ -79,7 +88,7 @@ class ImportPreProcess {
                 val p2: Coordinate = coordinates.get(coordinates.size - 1)
                 // 计算线段的方向
                 radian = Angle.angle(p1, p2)
-                point = p1
+                point = p2
             }
         }
 
@@ -97,7 +106,7 @@ class ImportPreProcess {
         val coord =
             Coordinate(point.getX() + dy, point.getY() - dx)
 
-        // 记录偏移后的点位或线数据,如果数据为线时,记录的偏移后数据为倒数第二个点右移后,方向与线的最后两个点平行同向的单位向量
+        // 记录偏移后的点位或线数据,如果数据为线时,记录的偏移后数据为最后一个点右移后,方向与线的最后两个点平行同向的单位向量
         if (Geometry.TYPENAME_POINT == geometry?.geometryType) {
             val geometryTranslate: Geometry =
                 GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y))
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 a9876542..64bcc9d6 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
@@ -178,7 +178,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
                     // 定位到指定位置
                     niMapController.mMapView.vtmMap.animator()
 //                        .animateTo(GeoPoint( 40.05108004733645, 116.29187746293708    ))
-                        .animateTo(GeoPoint(40.50704534740206, 115.80404946472662))
+                        .animateTo(GeoPoint(40.07245537956604, 116.239638575623))
                 }
 
                 R.id.personal_center_menu_open_all_layer -> {
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
index 1ee392b7..7006827a 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt
@@ -58,8 +58,8 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP
     private lateinit var omdbReferenceLabelLayer: LabelLayer
     private lateinit var tileGridLayer: TileGridLayer // 用来显示tile号的layer
 
-    private val omdbTileSource by lazy { OMDBTileSource() }
-    private val omdbReferenceTileSource by lazy { OMDBReferenceTileSource() }
+    private val omdbTileSource by lazy { OMDBTileSource(mMapView.vtmMap.viewport()) }
+    private val omdbReferenceTileSource by lazy { OMDBReferenceTileSource(mMapView.vtmMap.viewport()) }
     private val labelTileLoaderHook = LabelTileLoaderHook()
     private val navinfoTileThemeHook = NavinfoTileThemeHook()
 
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java
index fdb2b98a..7c0b4d75 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java
@@ -4,7 +4,6 @@ import static org.oscim.core.MercatorProjection.latitudeToY;
 import static org.oscim.core.MercatorProjection.longitudeToX;
 
 import android.os.Build;
-import android.util.Log;
 
 import androidx.annotation.RequiresApi;
 
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java
index 9cd8765d..61a0334b 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java
@@ -12,6 +12,7 @@ import com.navinfo.collect.library.utils.MapParamUtils;
 
 import org.locationtech.jts.geom.Polygon;
 import org.oscim.layers.tile.MapTile;
+import org.oscim.map.Viewport;
 import org.oscim.tiling.ITileDataSink;
 import org.oscim.tiling.ITileDataSource;
 import org.oscim.tiling.QueryResult;
@@ -24,6 +25,11 @@ import io.realm.RealmQuery;
 
 public class OMDBReferenceDataSource implements ITileDataSource {
     private boolean isUpdate;
+    private Viewport viewport;
+
+    public OMDBReferenceDataSource(Viewport viewport) {
+        this.viewport = viewport;
+    }
 
     private final ThreadLocal<OMDBReferenceDecoder> mThreadLocalDecoders = new ThreadLocal<OMDBReferenceDecoder>() {
         @Override
@@ -48,7 +54,7 @@ public class OMDBReferenceDataSource implements ITileDataSource {
                 yStart = (int) (yStart << m);
                 yEnd = (int) (yEnd << m);
             }
-
+            final int currentTileX = xStart;
 
             if(isUpdate){
                 Realm.getInstance(MapParamUtils.getTaskConfig()).refresh();
@@ -76,7 +82,10 @@ public class OMDBReferenceDataSource implements ITileDataSource {
             List<ReferenceEntity> listResult = realmQuery/*.distinct("id")*/.findAll();
             if (!listResult.isEmpty()) {
                 Polygon tilePolygon = GeometryTools.getTilePolygon(tile);
-                listResult = listResult.stream().filter((ReferenceEntity referenceEntity) -> referenceEntity.getWkt().intersects(tilePolygon)).collect(Collectors.toList());
+                listResult = listResult.stream().filter((ReferenceEntity referenceEntity) -> referenceEntity.getWkt().intersects(tilePolygon))
+                        /*过滤数据,只有最小x(屏幕的最小x或数据的最小x会被渲染,跨Tile的其他数据不再重复渲染)*/
+//                        .filter((ReferenceEntity referenceEntity) -> MercatorProjection.longitudeToTileX(viewport.fromScreenPoint(0,0).getLongitude(), (byte) Constant.DATA_ZOOM) == currentTileX || referenceEntity.getTileX().stream().min(Integer::compare).get() == currentTileX)
+                        .collect(Collectors.toList());
                 mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult);
                 mapDataSink.completed(QueryResult.SUCCESS);
             } else {
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceTileSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceTileSource.java
index 3fc6ea84..5f8b17c4 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceTileSource.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceTileSource.java
@@ -2,11 +2,18 @@ package com.navinfo.collect.library.map.source;
 
 import com.navinfo.collect.library.system.Constant;
 
+import org.oscim.map.Viewport;
 import org.oscim.tiling.ITileDataSource;
 import org.oscim.tiling.OverzoomTileDataSource;
 
 public class OMDBReferenceTileSource extends RealmDBTileSource {
-    private OMDBReferenceDataSource omdbReferenceTileSource = new OMDBReferenceDataSource();
+    private OMDBReferenceDataSource omdbReferenceTileSource;
+    private Viewport viewport;
+
+    public OMDBReferenceTileSource(Viewport viewport) {
+        this.viewport = viewport;
+        this.omdbReferenceTileSource = new OMDBReferenceDataSource(this.viewport);
+    }
 
     @Override
     public ITileDataSource getDataSource() {
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
index 62475226..c6e5be22 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java
@@ -12,6 +12,7 @@ import com.navinfo.collect.library.utils.MapParamUtils;
 
 import org.locationtech.jts.geom.Polygon;
 import org.oscim.layers.tile.MapTile;
+import org.oscim.map.Viewport;
 import org.oscim.tiling.ITileDataSink;
 import org.oscim.tiling.ITileDataSource;
 import org.oscim.tiling.QueryResult;
@@ -24,6 +25,7 @@ import io.realm.RealmQuery;
 
 public class OMDBTileDataSource implements ITileDataSource {
     private boolean isUpdate;
+    private Viewport viewport;
     private final ThreadLocal<OMDBDataDecoder> mThreadLocalDecoders = new ThreadLocal<OMDBDataDecoder>() {
         @Override
         protected OMDBDataDecoder initialValue() {
@@ -31,6 +33,10 @@ public class OMDBTileDataSource implements ITileDataSource {
         }
     };
 
+    public OMDBTileDataSource(Viewport viewport) {
+        this.viewport = viewport;
+    }
+
     @RequiresApi(api = Build.VERSION_CODES.N)
     @Override
     public void query(MapTile tile, ITileDataSink mapDataSink) {
@@ -48,6 +54,7 @@ public class OMDBTileDataSource implements ITileDataSource {
                 yEnd = (int) (yEnd << m);
             }
 
+            final int currentTileX = xStart;
             if(isUpdate){
                 Realm.getInstance(MapParamUtils.getTaskConfig()).refresh();
                 isUpdate = false;
@@ -74,7 +81,12 @@ public class OMDBTileDataSource implements ITileDataSource {
             // 数据记录的tile号是以正外接tile号列表,此处过滤并未与当前tile相交的数据
             if (!listResult.isEmpty()) {
                 Polygon tilePolygon = GeometryTools.getTilePolygon(tile);
-                listResult = listResult.stream().filter((RenderEntity renderEntity) -> renderEntity.getWkt().intersects(tilePolygon)).collect(Collectors.toList());
+                System.out.println("第一条数据的最小x值:" + listResult.get(0).getTileX().stream().min(Integer::compare).get());
+                System.out.println("当前tile的:" + listResult.get(0).getTileX().stream().min(Integer::compare).get());
+                listResult = listResult.stream().filter((RenderEntity renderEntity) -> renderEntity.getWkt().intersects(tilePolygon))
+                        /*过滤数据,只有最小x(屏幕的最小x或数据的最小x会被渲染,跨Tile的其他数据不再重复渲染)*/
+//                        .filter((RenderEntity renderEntity) -> MercatorProjection.longitudeToTileX(viewport.fromScreenPoint(0,0).getLongitude(), (byte) Constant.DATA_ZOOM) == currentTileX || renderEntity.getTileX().stream().min(Integer::compare).get() == currentTileX)
+                        .collect(Collectors.toList());
                 mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult);
                 mapDataSink.completed(QueryResult.SUCCESS);
             } else {
diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java
index 406c27ec..9cda466c 100644
--- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java
+++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileSource.java
@@ -5,17 +5,25 @@ import android.util.Log;
 import com.navinfo.collect.library.data.entity.RenderEntity;
 import com.navinfo.collect.library.system.Constant;
 
+import org.oscim.map.Viewport;
 import org.oscim.tiling.ITileDataSource;
 import org.oscim.tiling.OverzoomTileDataSource;
 
 import io.realm.Realm;
 
 public class OMDBTileSource extends RealmDBTileSource {
-    private OMDBTileDataSource omdbTileSource = new OMDBTileDataSource();
+    private Viewport viewport;
+    private OMDBTileDataSource omdbTileDataSource;
+
+    public OMDBTileSource(Viewport viewport) {
+        this.viewport = viewport;
+        this.omdbTileDataSource = new OMDBTileDataSource(this.viewport);
+    }
+
     @Override
     public ITileDataSource getDataSource() {
        // return new OverzoomTileDataSource(new OMDBTileDataSource(), Constant.OVER_ZOOM);
-        return new OverzoomTileDataSource(omdbTileSource, Constant.OVER_ZOOM);
+        return new OverzoomTileDataSource(omdbTileDataSource, Constant.OVER_ZOOM);
     }
 
     @Override
@@ -32,6 +40,6 @@ public class OMDBTileSource extends RealmDBTileSource {
     @Override
     public void update() {
         super.update();
-        omdbTileSource.update();
+        omdbTileDataSource.update();
     }
 }