fix: 修改最高级别下线数据出现幽灵渲染的问题

This commit is contained in:
2023-09-08 17:20:39 +08:00
parent 408d98ddea
commit 70b820a358
5 changed files with 53 additions and 8 deletions

View File

@@ -7,14 +7,17 @@ import androidx.annotation.RequiresApi;
import com.navinfo.collect.library.data.entity.ReferenceEntity;
import com.navinfo.collect.library.system.Constant;
import com.navinfo.collect.library.utils.GeometryTools;
import com.navinfo.collect.library.utils.MapParamUtils;
import org.locationtech.jts.geom.Polygon;
import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.QueryResult;
import java.util.List;
import java.util.stream.Collectors;
import io.realm.Realm;
import io.realm.RealmQuery;
@@ -33,7 +36,7 @@ public class OMDBReferenceDataSource implements ITileDataSource {
@Override
public void query(MapTile tile, ITileDataSink mapDataSink) {
// 获取tile对应的坐标范围
if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.OVER_ZOOM) {
if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel < Constant.OVER_ZOOM) {
int m = Constant.OVER_ZOOM - tile.zoomLevel;
int xStart = (int) tile.tileX << m;
int xEnd = (int) ((tile.tileX + 1) << m);
@@ -64,12 +67,16 @@ 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());
mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult);
mapDataSink.completed(QueryResult.SUCCESS);
} else {
mapDataSink.completed(QueryResult.TILE_NOT_FOUND);
}
mapDataSink.completed(QueryResult.SUCCESS);
// Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString());
} else {
mapDataSink.completed(QueryResult.SUCCESS);
mapDataSink.completed(QueryResult.TILE_NOT_FOUND);
}
}

View File

@@ -7,14 +7,17 @@ import androidx.annotation.RequiresApi;
import com.navinfo.collect.library.data.entity.RenderEntity;
import com.navinfo.collect.library.system.Constant;
import com.navinfo.collect.library.utils.GeometryTools;
import com.navinfo.collect.library.utils.MapParamUtils;
import org.locationtech.jts.geom.Polygon;
import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.QueryResult;
import java.util.List;
import java.util.stream.Collectors;
import io.realm.Realm;
import io.realm.RealmQuery;
@@ -32,7 +35,7 @@ public class OMDBTileDataSource implements ITileDataSource {
@Override
public void query(MapTile tile, ITileDataSink mapDataSink) {
// 获取tile对应的坐标范围
if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.OVER_ZOOM) {
if (tile.zoomLevel >= Constant.OMDB_MIN_ZOOM && tile.zoomLevel < Constant.OVER_ZOOM) {
int m = Constant.OVER_ZOOM - tile.zoomLevel;
int xStart = (int) tile.tileX << m;
int xEnd = (int) ((tile.tileX + 1) << m);
@@ -61,12 +64,17 @@ public class OMDBTileDataSource implements ITileDataSource {
realmQuery.endGroup();
}
List<RenderEntity> listResult = realmQuery/*.distinct("id")*/.findAll();
// 数据记录的tile号是以正外接tile号列表此处过滤并未与当前tile相交的数据
if (!listResult.isEmpty()) {
Polygon tilePolygon = GeometryTools.getTilePolygon(tile);
listResult = listResult.stream().filter((RenderEntity renderEntity) -> renderEntity.getWkt().intersects(tilePolygon)).collect(Collectors.toList());
mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult);
mapDataSink.completed(QueryResult.SUCCESS);
} else {
mapDataSink.completed(QueryResult.TILE_NOT_FOUND);
}
mapDataSink.completed(QueryResult.SUCCESS);
} else {
mapDataSink.completed(QueryResult.SUCCESS);
mapDataSink.completed(QueryResult.TILE_NOT_FOUND);
}
}

View File

@@ -2,6 +2,7 @@ package com.navinfo.collect.library.utils;
import android.graphics.Point;
import android.util.Log;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
@@ -13,7 +14,10 @@ import org.locationtech.jts.geom.Polygon;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.operation.linemerge.LineMerger;
import org.oscim.core.GeoPoint;
import org.oscim.core.MercatorProjection;
import org.oscim.core.Tile;
import org.oscim.map.Map;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collection;
@@ -251,6 +255,22 @@ public class GeometryTools {
return gon.toString();
}
/**
* 创建多边形几何
*
* @param coords []
* @return Geometry
*/
public static Polygon createPolygonFromCoords(Coordinate[] coords) {
GeometryFactory factory = new GeometryFactory();
Polygon gon = factory.createPolygon(coords);
if (gon == null)
return null;
return gon;
}
/**
* 创建多边形几何
*
@@ -1579,4 +1599,14 @@ public class GeometryTools {
double radianDegree = 2 * Math.asin(Math.sin(radianDistance / 2) / Math.cos(radianLatitude));
return Math.toDegrees(radianDegree);
}
public static Polygon getTilePolygon(Tile tile) {
// 获取当前tile的起点坐标
double startLongitude = MercatorProjection.tileXToLongitude(tile.tileX, tile.zoomLevel);
double startLatitude = MercatorProjection.tileYToLatitude(tile.tileY, tile.zoomLevel);
double endLongitude = MercatorProjection.tileXToLongitude(tile.tileX+1, tile.zoomLevel);
double endLatitude = MercatorProjection.tileYToLatitude(tile.tileY+1, tile.zoomLevel);
return GeometryTools.createPolygonFromCoords(new Coordinate[]{new Coordinate(startLongitude, startLongitude), new Coordinate(endLongitude, startLatitude),
new Coordinate(endLongitude, endLatitude), new Coordinate(startLongitude, endLatitude), new Coordinate(startLongitude, startLongitude)});
}
}