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 e7bb6345..9cd42673 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 @@ -177,7 +177,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 mThreadLocalDecoders = new ThreadLocal() { @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 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 mThreadLocalDecoders = new ThreadLocal() { @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(); } }