From 6d5e0d952bda3b9b510c4bccef498af48b01947d Mon Sep 17 00:00:00 2001 From: tongchenfei Date: Thu, 4 Mar 2021 19:45:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=96=E8=BD=A6=E9=81=93?= =?UTF-8?q?=E8=B7=AF=E5=90=B8=E9=99=84=E5=8F=98=E9=81=93=E7=AA=81=E5=85=80?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mogo/map/impl/custom/AMapViewWrapper.java | 5 +-- .../custom/utils/PointInterpolatorUtil.java | 9 ++++-- .../common/utils/SimpleHandlerThreadPool.java | 32 +++++++++++++++---- .../service/intent/MockIntentHandler.java | 2 +- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java index 8abeebce04..145ec8c136 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/AMapViewWrapper.java @@ -1031,9 +1031,10 @@ public class AMapViewWrapper implements IMogoMapView, && !singlePointRoadInfo.getCoords().isEmpty() ) { double matchedPoint[] = PointInterpolatorUtil.mergeToRoad( wgs[0], wgs[1], singlePointRoadInfo.getCoords() ); // return CoordinateUtils.transformWgsToGcj( matchedPoint[1], matchedPoint[0] ); + double[] trans = CoordinateUtils.transformWgsToGcj(matchedPoint[1], matchedPoint[0]); - matchedPoint = CoordinateUtils.transformWgsToGcj( matchedPoint[1], matchedPoint[0] ); - + matchedPoint[0] = trans[0]; + matchedPoint[1] = trans[1]; // MarkerOptions options // = new MarkerOptions(); // options.markerIcon( R.drawable.red ) diff --git a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java index 32a34e0fe7..7c8629624a 100644 --- a/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java +++ b/libraries/map-custom/src/main/java/com/mogo/map/impl/custom/utils/PointInterpolatorUtil.java @@ -24,11 +24,10 @@ public class PointInterpolatorUtil { * n in 1 .. a-1 * n == 0 时,xn = x1 * n == a 时,xn = x2 - * + *

* 将xn依次插入x1到x2之间 * * @param points 待插值点集 - * * @deprecated 这个方法有问题,并不能算出来想要的值 */ @Deprecated @@ -63,7 +62,11 @@ public class PointInterpolatorUtil { LonLatPoint end = road.get(closeEnd); Logger.d(TAG, "mergeToRoad start: " + closeStart + " end: " + closeEnd); // return getMid(start, end); - return getFoot(lon, lat, start, end); + double[] foot = getFoot(lon, lat, start, end); + + float d = CoordinateUtils.calculateLineDistance(foot[0], foot[1], lon, lat); + Logger.d(TAG, "distance to mid line==" + d); + return new double[]{foot[0], foot[1], d}; } private static int closeStart = 0; diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java index 1052712b76..d34349694f 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/SimpleHandlerThreadPool.java @@ -31,6 +31,7 @@ public class SimpleHandlerThreadPool { private static final String TAG = "SimpleHandlerThreadPool"; private HandlerThread renderThread = new HandlerThread("one-frame-render-thread"); private Handler renderHandler; + private SimpleHandlerThreadPool() { renderThread.start(); renderHandler = new Handler(renderThread.getLooper()); @@ -108,6 +109,7 @@ public class SimpleHandlerThreadPool { private final Map markerCache = new ArrayMap<>(); private final Map roadDataCache = new ArrayMap<>(); private final Map lastExecutionTimeCache = new ArrayMap<>(); + private final Map isMatchStatusCache = new ArrayMap<>(); private void rendCarOneFrame(CloudRoadData cloudRoadData) { if (cloudRoadData == null) { @@ -127,6 +129,7 @@ public class SimpleHandlerThreadPool { || AdasRecognizedResultDrawer.getInstance().hasCached(uniqueKey)) { return; } + IMogoMarker marker = markerCache.get(uniqueKey); CloudRoadData lastPosition = roadDataCache.put(uniqueKey, cloudRoadData); if (marker == null || marker.isDestroyed()) { @@ -140,22 +143,39 @@ public class SimpleHandlerThreadPool { } } - if(cloudRoadData.getFromType() == CloudRoadData.FROM_MY_LOCATION) { + if (cloudRoadData.getFromType() == CloudRoadData.FROM_MY_LOCATION) { double[] matchedPoint = SnapshotSetDataDrawer.getInstance().matchRoad(cloudRoadData.getLon(), cloudRoadData.getLat(), cloudRoadData.getHeading(), true ); + Boolean isMathch = isMatchStatusCache.get(uniqueKey); if (matchedPoint != null) { - cloudRoadData.setLon(matchedPoint[0]); - cloudRoadData.setLat(matchedPoint[1]); + if ((isMathch == null || !isMathch)) { + if (matchedPoint[2] < 0.5) { + isMathch = true; + } + } else { + if (matchedPoint[2] > 1) { + isMathch = false; + } + } + if (isMathch == null) { + isMathch = false; + } + isMatchStatusCache.put(uniqueKey, isMathch); + + if (isMathch) { + cloudRoadData.setLon(matchedPoint[0]); + cloudRoadData.setLat(matchedPoint[1]); + } } } final IMogoMarker finalMarker = marker; Logger.d(TAG, "work in " + Thread.currentThread().getName()); - renderHandler.post(()->{ + renderHandler.post(() -> { // 由于地图现在不支持addDynamicAnchorPosition并发,所以工作线程仅做相关计算,真正绘制发送到另外一条绘制线程中做 if (lastPosition != null && !lastPosition.equals(cloudRoadData)) { long interval = SnapshotSetDataDrawer.getInstance().computeAnimDuration(lastPosition.getSystemTime(), cloudRoadData.getSystemTime(), lastPosition.getSatelliteTime(), cloudRoadData.getSatelliteTime()); @@ -176,11 +196,11 @@ public class SimpleHandlerThreadPool { public void removeDirtyMarker(Collection keys) { Map result = new ArrayMap<>(keys.size()); for (String key : keys) { - if(markerCache.containsKey(key)) { + if (markerCache.containsKey(key)) { result.put(key, markerCache.remove(key)); } } - SnapshotSetDataDrawer.getInstance().sendMessage( MSG_REMOVE_DIRTY_MARKERS, result ); + SnapshotSetDataDrawer.getInstance().sendMessage(MSG_REMOVE_DIRTY_MARKERS, result); } } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java index 96891e40db..54388ab963 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/intent/MockIntentHandler.java @@ -557,7 +557,7 @@ public class MockIntentHandler implements IntentHandler { break; case 47: mLocationMockHandler.sendEmptyMessageDelayed( 1, 200L ); -// mLocationMockHandler.sendEmptyMessageDelayed( 2, 0 ); + mLocationMockHandler.sendEmptyMessageDelayed( 2, 0 ); // mLocationMockHandler.sendEmptyMessageDelayed( 21, 200 ); // mLocationMockHandler.sendEmptyMessageDelayed( 3, 300L ); break;