fix: 修改车信渲染位置错误的问题
This commit is contained in:
parent
b04142fd5d
commit
9db5e0c4b1
@ -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))
|
||||
|
@ -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 -> {
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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 {
|
||||
|
@ -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() {
|
||||
|
@ -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 {
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user