From 101ac56f11b151a1c5fc4c7531ea6071086c3e20 Mon Sep 17 00:00:00 2001 From: renwenjie Date: Tue, 12 Apr 2022 15:31:17 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20"[RouterOpt]=E8=BD=A6=E5=89=8D?= =?UTF-8?q?=E5=BC=95=E5=AF=BC=E7=BA=BF=E6=8B=96=E5=B0=BE=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=BC=98=E5=8C=962"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit a0f0d3c2 --- .../core/function/map/IdentifyDataDrawer.java | 2 +- .../function/smp/SmallMapDirectionView.java | 4 +- .../mogo/eagle/core/data/map/MogoLatLng.java | 2 - .../eagle/core/data/map/MogoLocation.java | 18 -- .../java/com/mogo/map/AMapViewWrapper.java | 48 +---- .../java/com/mogo/map/utils/ObjectUtils.java | 2 - .../common/utils/DrivingDirectionUtils.java | 63 +++---- .../routeoverlay/MogoRouteOverlayManager.java | 169 ++++++++++-------- .../routeoverlay/RouteOverlayDrawer.java | 154 +++++----------- 9 files changed, 181 insertions(+), 281 deletions(-) diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java index 88ec2fdf89..f56a931402 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/map/IdentifyDataDrawer.java @@ -141,7 +141,7 @@ public class IdentifyDataDrawer { CallerLogger.INSTANCE.d(M_HMI + "arrow47", "uuid: " + data.getUuid() + " , 40~90差值范围 , 上一帧 : " + cacheData.getHeading() + " , 当前帧 : " + data.getHeading()); } if (Math.abs(cacheData.getHeading() - data.getHeading()) > 90) { - double degree = DrivingDirectionUtils.getDegreeOfCar2Poi(cacheData.getLongitude(), cacheData.getLatitude(), data.getLongitude(), data.getLatitude(), cacheData.getHeading()); + int degree = DrivingDirectionUtils.getDegreeOfCar2Poi(cacheData.getLongitude(), cacheData.getLatitude(), data.getLongitude(), data.getLatitude(), Double.valueOf(cacheData.getHeading()).intValue()); if (degree > 90) { CallerLogger.INSTANCE.d(M_HMI + "arrow47", "uuid: " + data.getUuid() + " , 夹角 : " + degree + " , 修正 上一帧 : " + cacheData.getHeading() + " , 当前帧 : " + data.getHeading()); correctData = data.toBuilder().setHeading(cacheData.getHeading()).build(); diff --git a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapDirectionView.java b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapDirectionView.java index 20cf3b9707..a86bf21e7a 100644 --- a/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapDirectionView.java +++ b/core/function-impl/mogo-core-function-map/src/main/java/com/mogo/eagle/core/function/smp/SmallMapDirectionView.java @@ -222,9 +222,11 @@ public class SmallMapDirectionView double poiLon = pointLocal.longitude; double poiLat = pointLocal.latitude; float carAngle = carLocal.getBearing(); + // 计算车辆与点之间的夹角 - long diffAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( + int diffAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( carLon, carLat, poiLon, poiLat, (int) carAngle); + return diffAngle <= 90; } diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java index 4277761efe..ae61f4523a 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLatLng.java @@ -26,8 +26,6 @@ public class MogoLatLng implements Parcelable { public String provider; - public double acceleration; - public MogoLatLng( double lat, double lon ) { this.lat = lat; this.lon = lon; diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLocation.java b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLocation.java index 66c97bdf58..9397785bb4 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLocation.java +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/map/MogoLocation.java @@ -31,8 +31,6 @@ public class MogoLocation implements Cloneable, Parcelable { private String floor = ""; private int gpsAccuracyStatus = 0; private int satellite = 0; - private long duration = 0; - private float acceleration = 0f; public float getBearing() { return bearing; @@ -154,22 +152,6 @@ public class MogoLocation implements Cloneable, Parcelable { this.gpsAccuracyStatus = gpsAccuracyStatus; } - public long getDuration() { - return duration; - } - - public void setDuration(long duration) { - this.duration = duration; - } - - public void setAcceleration(float acceleration) { - this.acceleration = acceleration; - } - - public float getAcceleration() { - return this.acceleration; - } - public int getSatellite() { return satellite; } diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java index b206f598ce..3f301a61d1 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/AMapViewWrapper.java @@ -12,9 +12,6 @@ import android.graphics.Point; import android.graphics.Rect; import android.location.Location; import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.os.SystemClock; import android.os.Trace; import android.text.TextUtils; import android.util.Log; @@ -289,9 +286,6 @@ public class AMapViewWrapper implements IMogoMapView, mMapView.setOnCameraChangeListener(null); CallerLogger.INSTANCE.d(TAG, "map onDestroy"); } - if (mLocationTask != null) { - mainHandler.removeCallbacks(mLocationTask); - } } @Override @@ -648,52 +642,18 @@ public class AMapViewWrapper implements IMogoMapView, return ObjectUtils.transformCenterLine(MapDataApi.INSTANCE.getCenterLineInfo(lon, lat, angle)); } - - - - private static class LocationTask implements Runnable { - - private MogoLocation location; - - public void setMoGoLocation(MogoLocation location) { - this.location = location; - } - - @Override - public void run() { - if (location != null) { - CallerMapLocationListenerManager.INSTANCE.invokeMapLocationChangeListener(location); - location = null; - } - } - } - - private volatile LocationTask mLocationTask; - - private final Handler mainHandler = new Handler(Looper.getMainLooper()); - @Override public void onLocationChanged(@NotNull com.zhidaoauto.map.sdk.open.location.MogoLocation location) { - MogoLocation currentLocation = ObjectUtils.fromLocation(location); - if (Looper.myLooper() == Looper.getMainLooper()) { - CallerMapLocationListenerManager.INSTANCE.invokeMapLocationChangeListener(currentLocation); - } else { - if (mLocationTask == null) { - mLocationTask = new LocationTask(); - } - mLocationTask.setMoGoLocation(currentLocation); - mainHandler.removeCallbacks(mLocationTask); - mainHandler.post(mLocationTask); - } + MogoLocation mLastLocation = ObjectUtils.fromLocation(location); + UiThreadHandler.post(() -> CallerMapLocationListenerManager.INSTANCE.invokeMapLocationChangeListener(mLastLocation)); - long start = SystemClock.elapsedRealtime(); Location sysLocation = new Location(location.getProvider()); sysLocation.setAltitude(location.getAltitude()); sysLocation.setLatitude(location.getLat()); sysLocation.setLongitude(location.getLon()); sysLocation.setProvider(location.getProvider()); sysLocation.setAccuracy(location.getAcceleration()); - sysLocation.setTime(location.duration); + sysLocation.setTime(location.getDuration()); sysLocation.setBearing((float) location.getHeading()); sysLocation.setSpeed(location.getSpeed()); @@ -707,6 +667,7 @@ public class AMapViewWrapper implements IMogoMapView, .putString(SharedPrefsConstants.LOCATION_LONGITUDE, String.valueOf(location.getLon())); } + if (MogoCarLocationChangedListenerRegister.getInstance().getListener() != null) { MogoCarLocationChangedListenerRegister.getInstance().getListener().onCarLocationChanged2(sysLocation); } @@ -726,7 +687,6 @@ public class AMapViewWrapper implements IMogoMapView, CallerLogger.INSTANCE.d(TAG, "同步定位:" + GsonUtils.toJson(location)); } } - Log.d("TTTTT", "xxxxx:" + (SystemClock.elapsedRealtime() - start)); } @Override diff --git a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java index 3b1d94b60c..d2dae39072 100644 --- a/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java +++ b/libraries/mogo-map/src/main/java/com/mogo/map/utils/ObjectUtils.java @@ -171,8 +171,6 @@ public class ObjectUtils { location.setDistrict(aLocation.getDistrict()); location.setProvince(aLocation.getProvince()); location.setAdCode(aLocation.getAdCode()); - location.setDuration(aLocation.getDuration()); - location.setAcceleration(aLocation.getAcceleration()); // location.setAccuracy( aLocation.getAccuracy() ); // location.setTime( aLocation.getTime() ); // location.setLocationDetail( aLocation.getLocationDetail() ); diff --git a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java index ab781d5f9a..a2514c954a 100644 --- a/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java +++ b/modules/mogo-module-common/src/main/java/com/mogo/module/common/utils/DrivingDirectionUtils.java @@ -2,8 +2,6 @@ package com.mogo.module.common.utils; import static java.lang.Math.PI; -import android.util.Pair; - /** * author : donghongyu * e-mail : 1358506549@qq.com @@ -13,35 +11,40 @@ import android.util.Pair; */ public class DrivingDirectionUtils { - - public static long getDegreeOfCar2Poi(double x1, double y1, double x2, double y2, double x1_angle) { - Pair newPoint = calculateNewPoint(x1, y1, x1_angle, 10); - if (newPoint != null) { - double angle = getAngle(x1, y1, newPoint.first, newPoint.second, x2, y2); - return Math.round(angle + 0.5); + /** + * 计算车辆行驶方向 与 poi点到车辆的连线 间的夹角 + * + * @param carLon 车辆位置 lon + * @param carLat 车辆位置 lat + * @param poiLon poi 位置 lon + * @param poiLat poi 位置 lat + * @param carAngle 车辆行驶方向 + * @return + */ + public static int getDegreeOfCar2Poi(double carLon, double carLat, double poiLon, double poiLat, int carAngle) { + int poiAngle = 0; + // 以子午线作为y轴 计算两点的余切 再将余切值转化为角度 + double _angle = Math.atan2(Math.abs(carLon - poiLon), Math.abs(carLat - poiLat)) * (180 / PI); + if (poiLon > carLon) { + // poi 在 车辆位置的第1象限 + if (poiLat > carLat) { + poiAngle = (int) _angle; + } + // poi 在 车辆位置的第2象限 + else { + poiAngle = 180 - (int) _angle; + } + } else { + // poi 在 车辆位置的第3象限 + if (poiLat < carLat) { + poiAngle = (int) _angle + 180; + } + // poi 在 车辆位置的第4象限 + else { + poiAngle = 360 - (int) _angle; + } } - return 0; - } - - private static double getAngle(double sx, double sy, double x1, double y1, double x2, double y2) { - x1 = x1 - sx; - y1 = y1 - sy; - x2 = x2 - sx; - y2 = y2 - sy; - double product = x1 * x2 + y1 * y2; - double radians = Math.acos(product / (Math.sqrt(Math.pow(x1, 2.0) + Math.pow(y1, 2.0)) * Math.sqrt(Math.pow(x2, 2.0) + Math.pow(y2, 2.0)))); - return Math.toDegrees(radians); - } - - public static Pair calculateNewPoint(double x, double y, double angle, double distance) { - if (distance == 0) { - return null; - } - double radian = Math.toRadians(angle); - double radianCandle = Math.toRadians(90.0 - angle); - double nX = x + distance * Math.sin(radian) / 100000.0; - double nY = y + distance * Math.sin(radianCandle) / 100000.0; - return Pair.create(nX, nY); + return calculationAngle(poiAngle, carAngle); } /** diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java index dc2aea5040..7ad39389d2 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/MogoRouteOverlayManager.java @@ -3,7 +3,6 @@ package com.mogo.module.service.routeoverlay; import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_OLD_ROUTE; import android.content.Context; -import android.os.SystemClock; import androidx.annotation.NonNull; @@ -18,12 +17,12 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotPlanningListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapLocationListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; +import com.mogo.module.common.utils.DrivingDirectionUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import mogo.telematics.pad.MessagePad; @@ -39,7 +38,7 @@ public class MogoRouteOverlayManager implements private int STATUS_AUTOPILOT = 0;//0 非自动驾驶 ; 1 自动驾驶 private MogoLatLng mEnding; private MogoLocation mLocation; - private final List mTrajectoryList = new ArrayList<>(); + private List mTrajectoryList = new ArrayList<>(); private MogoRouteOverlayManager(Context context) { mContext = context; @@ -63,52 +62,37 @@ public class MogoRouteOverlayManager implements return sInstance; } - private StringBuilder trajectoryMsg = null; + private void intiDrawer() { + RouteOverlayDrawer.getInstance(mContext).initDraw(); + } @Override - public void onAutopilotTrajectory(List items) { - long start = SystemClock.elapsedRealtime(); - try { - if (items == null || items.size() == 0) { - return; - } - if (trajectoryMsg == null) { - trajectoryMsg = new StringBuilder(256); - } - if (trajectoryMsg.length() > 0) { - trajectoryMsg.setLength(0); - } - if (mLocation == null) { - return; - } - trajectoryMsg.append("{"); - trajectoryMsg.append(SystemClock.elapsedRealtime()).append(";"); - trajectoryMsg.append(mLocation.getLongitude()).append(";"); - trajectoryMsg.append(mLocation.getLatitude()).append(";"); - trajectoryMsg.append(mLocation.getAltitude()).append(";"); - trajectoryMsg.append(mLocation.getBearing()).append(";"); - trajectoryMsg.append(mLocation.getSpeed()).append(";"); - List points = new ArrayList<>(); - for (int i = 0; i < items.size(); i++) { - // 临时解决车尾拖线问题,丢弃距离车最近的几个经纬度,原因是惯性导航的中心靠近车尾,会导致经纬度靠近尾部,且两个数据不同频 - MessagePad.TrajectoryPoint a = items.get(i); - double lon = a.getLongitude(); - double lat = a.getLatitude(); - trajectoryMsg.append(lon).append(","); - trajectoryMsg.append(lat).append(","); - MogoLatLng latLng = new MogoLatLng(lat, lon); - latLng.acceleration = a.getAcceleration(); - points.add(latLng); - } - synchronized (mTrajectoryList) { - mTrajectoryList.clear(); - mTrajectoryList.addAll(points); - } - trajectoryMsg.append("}"); - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, trajectoryMsg.toString()); - } finally { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "--- onAutopilotTrajectory -- cost:" + (SystemClock.elapsedRealtime() - start) + " ms"); + public void onAutopilotTrajectory(List trajectoryInfos) { + if (trajectoryInfos == null || trajectoryInfos.size() == 0) { + return; } + StringBuilder builder = new StringBuilder(); + builder.append("{"); + builder.append(System.currentTimeMillis()).append(";"); + builder.append(mLocation.getLongitude()).append(";"); + builder.append(mLocation.getLatitude()).append(";"); + builder.append(mLocation.getAltitude()).append(";"); + builder.append(mLocation.getBearing()).append(";"); + builder.append(mLocation.getSpeed()).append(";"); + List mogoLatLngs = new ArrayList<>(); + for (int i = 0; i < trajectoryInfos.size(); i++) { + // 临时解决车尾拖线问题,丢弃距离车最近的几个经纬度,原因是惯性导航的中心靠近车尾,会导致经纬度靠近尾部,且两个数据不同频 + if (i > 5) { + + MessagePad.TrajectoryPoint a = trajectoryInfos.get(i); + builder.append(a.getLongitude()).append(","); + builder.append(a.getLatitude()).append(","); + mogoLatLngs.add(new MogoLatLng(a.getLatitude(), a.getLongitude())); + } + } + + mTrajectoryList = mogoLatLngs; + builder.append("}"); } @Override @@ -152,7 +136,7 @@ public class MogoRouteOverlayManager implements if (arrivalNotification == null) { return; } - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "onArriveAt data : " + arrivalNotification); + CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "onArriveAt data : " + arrivalNotification.toString()); // //演示模式下 到达终点将忽略 引导线绘制 选项关闭 // FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData = false; } @@ -165,37 +149,66 @@ public class MogoRouteOverlayManager implements @Override public void onLocationChanged(@Nullable MogoLocation location) { - long start = SystemClock.elapsedRealtime(); - boolean isExcept = false; - try { - if (location == null) { - isExcept = true; - return; - } - if (mLocation != null && mLocation.getLongitude() == location.getLongitude() && mLocation.getLatitude() == location.getLatitude()) { - return; - } - LinkedList points; - synchronized (mTrajectoryList) { - points = new LinkedList<>(mTrajectoryList); - } - if (points.isEmpty()) { - isExcept = true; - return; - } - if (points.size() < 2) { - isExcept = true; - return; - } - if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || STATUS_AUTOPILOT == 1) { - RouteOverlayDrawer.getInstance(mContext).drawTrajectoryList(location, points); - } - } finally { - mLocation = location; - if (isExcept) { - RouteOverlayDrawer.getInstance(mContext).setVisible(false); - } - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "--- onLocationChanged -- cost:" + (SystemClock.elapsedRealtime() - start) + " ms"); +// mLocation = location; +// if (mTrajectoryList.isEmpty()) { +// return; +// } +// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG , "onLocationChanged : " + mTrajectoryList.size()); +// ArrayList list = new ArrayList(); +// for (MogoLatLng latLng : mTrajectoryList) { +// if (!isPointOnCarFront(mLocation, latLng)) { +// list.add(latLng); +// } +// } +// +// StringBuilder builder = new StringBuilder(); +// for (int i = 0; i < list.size(); i++) { +// MogoLatLng latLng = (MogoLatLng) list.get(i); +// builder.append(latLng.getLon()).append(","); +// builder.append(latLng.getLat()).append(","); +// } +// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG , "onLocationChanged : " + GsonUtils.toJson(builder.toString())); +// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG ,"onLocationChanged size = " + list.size() + "---TrajectoryData = " + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData + "----" + STATUS_AUTOPILOT); +// if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || STATUS_AUTOPILOT == 1) { +// RouteOverlayDrawer.getInstance(mContext).drawTrajectoryList(list); +// } + + mLocation = location; + List temp = mTrajectoryList; + if (temp.isEmpty()) { + return; + } +// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG , "onLocationChanged: size = "+ mTrajectoryList.size()+" ----- "+mLocation.getLongitude()+"-"+mLocation.getLatitude()); + ArrayList list = new ArrayList(); + MogoLatLng carlatLng = new MogoLatLng(CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat(),CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon()); + list.add(carlatLng); + for (MogoLatLng latLng : temp) { +// if(!isPointOnCarFront(mLocation,latLng)){ + list.add(latLng); +// } + } +// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "TrajectoryData = " + FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData + "---status = " + STATUS_AUTOPILOT + "----size = " + list.size()); + if (FunctionBuildConfig.isIgnoreConditionsDrawAutopilotTrajectoryData || STATUS_AUTOPILOT == 1) { + RouteOverlayDrawer.getInstance(mContext).drawTrajectoryList(list); + } + } + + + public boolean isPointOnCarFront(MogoLocation carLocal, MogoLatLng pointLocal) { + double carLon = carLocal.getLongitude(); + double carLat = carLocal.getLatitude(); + double poiLon = pointLocal.lon; + double poiLat = pointLocal.lat; + float carAngle = carLocal.getBearing(); + + // 计算车辆与点之间的夹角 + int diffAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( + carLon, carLat, poiLon, poiLat, (int) carAngle); +// CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG,"diffAngle:"+diffAngle); + if (diffAngle <= 90) { + return true; + } else { + return false; } } diff --git a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java index 9522945452..a8f04250de 100644 --- a/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java +++ b/modules/mogo-module-service/src/main/java/com/mogo/module/service/routeoverlay/RouteOverlayDrawer.java @@ -6,12 +6,8 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; -import android.os.Handler; -import android.os.HandlerThread; -import android.os.SystemClock; import com.mogo.eagle.core.data.map.MogoLatLng; -import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.util.ColorUtils; @@ -22,23 +18,20 @@ import com.mogo.map.marker.MogoMarkerOptions; import com.mogo.map.overlay.IMogoOverlayManager; import com.mogo.map.overlay.IMogoPolyline; import com.mogo.map.overlay.MogoPolylineOptions; -import com.mogo.module.common.utils.DrivingDirectionUtils; import com.mogo.module.service.R; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; public class RouteOverlayDrawer { private static final String TAG = "MogoRouteOverlayManager"; - private volatile IMogoPolyline mMoGoPolyline; + private IMogoPolyline mMoGoPolyline; // 连接线参数 private final MogoPolylineOptions mPolylineOptions; - - private Handler mRenderHandler; - + // 线路径集合 + private final List mPolylinePointList; // 渐变色 private final List mPolylineColors; private final Bitmap endingBitmap; @@ -53,30 +46,14 @@ public class RouteOverlayDrawer { mPolylineOptions = new MogoPolylineOptions(); mPolylineOptions.zIndex(75000f); mPolylineOptions.setGps(true); + // 绘制路径集合 + mPolylinePointList = new ArrayList<>(); // 引导线颜色, mPolylineColors = new ArrayList<>(); mContext = context; mogoOverlayManager = MogoOverlayManager.getInstance(); endingBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_route_ending); - - List list = new ArrayList<>(); - int[] startColor = ColorUtils.hexToArgb("#CC64C3EA"); - int[] endColor = ColorUtils.hexToArgb("#0064C3EA"); - list.add(Color.argb(startColor[0], startColor[1], startColor[2], startColor[3])); - list.add(Color.argb(endColor[0], endColor[1], endColor[2], endColor[3])); - mPolylineColors.addAll(list); - - // 线条粗细,渐变,渐变色值 - mPolylineOptions.width(20).useGradient(true).colorValues(mPolylineColors); - HandlerThread renderTask = new HandlerThread("xxxx") { - @Override - protected void onLooperPrepared() { - super.onLooperPrepared(); - mRenderHandler = new Handler(getLooper()); - } - }; - renderTask.start(); } public static RouteOverlayDrawer getInstance(Context context) { @@ -126,6 +103,7 @@ public class RouteOverlayDrawer { if (mMoGoPolyline != null) { mMoGoPolyline.remove(); mMoGoPolyline = null; + mPolylinePointList.clear(); mPolylineColors.clear(); } } @@ -136,91 +114,57 @@ public class RouteOverlayDrawer { MogoMarkerManager.getInstance(mContext).removeMarkers(markerType); } - private class RenderTask implements Runnable { - private volatile LinkedList routeList; - private volatile MogoLocation location; - public void setData(MogoLocation location, LinkedList routeList) { - this.location = location; - this.routeList = routeList; - } - - @Override - public void run() { - try { - long drawStart = SystemClock.elapsedRealtime(); - double lon = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon(); - double lat = CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat(); - if (lon == 0.0 || lat == 0.0) { - return; - } - LinkedList points = this.routeList; - MogoLocation location = this.location; - if (location != null && points != null && points.size() > 0) { - int i = 0; - int max = Math.min(20, points.size() / 2); - while (i++ < max) { - MogoLatLng first = points.peek(); - if (first == null) { - continue; - } - if (!isPointOnCarFront(lon, lat, location.getBearing(), first.lon, first.lat)) { - points.poll(); - } - } - points.addFirst(new MogoLatLng(lat, lon)); - if (mMoGoPolyline == null || mMoGoPolyline.isDestroyed()) { - mPolylineOptions.points(points); - mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions); - } else { - mPolylineOptions.points(points); - mMoGoPolyline.setOption(mPolylineOptions); - } - if (mMoGoPolyline != null && !mMoGoPolyline.isDestroyed() && !mMoGoPolyline.isVisible()) { - mMoGoPolyline.setVisible(true); - } - } else { - if(mMoGoPolyline != null) { - mMoGoPolyline.setVisible(false); - } - } - long drawEnd = SystemClock.elapsedRealtime(); - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "drawTrajectoryList cost : " + (drawEnd - drawStart)); - } catch (Throwable t) { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "drawTrajectoryList error : " + t); + public void drawTrajectoryList(List routeList) { +// clearMogoRouteOverlay(); + mPolylinePointList.clear(); + if (routeList != null && routeList.size() > 0) { + for (MogoLatLng latLng : routeList) { + mPolylinePointList.add(latLng); } - } + mPolylineColors.clear(); +// mPolylineColors.addAll(ColorUtils.gradientAlpha_("#FF2AAFFD", "#7b2965ED", "#002965ED", mPolylinePointList.size())); + List list = new ArrayList<>(); +// list = ColorUtils.gradientAlpha("#FF2AAFFD", "#002965ED", mPolylinePointList.size()); + int[] startColor = ColorUtils.hexToArgb("#CC64C3EA"); + int[] endColor = ColorUtils.hexToArgb("#0064C3EA"); + list.add(Color.argb(startColor[0], startColor[1], startColor[2], startColor[3])); + list.add(Color.argb(endColor[0], endColor[1], endColor[2], endColor[3])); - private boolean isPointOnCarFront(double car_lon, double car_lat, double car_head, double lon, double lat) { - long start = SystemClock.elapsedRealtime(); - try { - // 计算车辆与点之间的夹角 - long diffAngle = DrivingDirectionUtils.getDegreeOfCar2Poi( - car_lon, car_lat, lon, lat, car_head); - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "isPointOnCarFront: angle->" + diffAngle); - return diffAngle < 90; - } finally { - CallerLogger.INSTANCE.d(M_OLD_ROUTE + TAG, "isPointOnCarFront cost:" + (SystemClock.elapsedRealtime() - start) + "ms"); + mPolylineColors.addAll(list); + // 线条粗细,渐变,渐变色值 + mPolylineOptions.width(20).useGradient(true).colorValues(mPolylineColors); + if (mMoGoPolyline == null || mMoGoPolyline.isDestroyed()) { + mPolylineOptions.points(mPolylinePointList); + mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions); + } else { + mPolylineOptions.points(mPolylinePointList); + mMoGoPolyline.setOption(mPolylineOptions); } } } - private volatile RenderTask mRenderTask; + public void initDraw() { + mPolylinePointList.clear(); + MogoLatLng latLng = new MogoLatLng( + CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lat(), + CallerAutoPilotStatusListenerManager.INSTANCE.getCurWgs84Lon()); + mPolylinePointList.add(latLng); + mPolylinePointList.add(latLng); + mPolylineColors.clear(); + long start = System.currentTimeMillis(); + List list = new ArrayList<>(); + list = ColorUtils.gradientAlpha("#FF2AAFFD", "#002965ED", mPolylinePointList.size()); - public void drawTrajectoryList(MogoLocation carLoc, LinkedList routeList) { - if (mRenderTask == null) { - mRenderTask = new RenderTask(); - } - mRenderTask.setData(carLoc, routeList); - if (mRenderHandler != null) { - mRenderHandler.removeCallbacks(mRenderTask); - mRenderHandler.post(mRenderTask); - } - } - - public void setVisible(boolean isVisible) { - if (mMoGoPolyline != null && !mMoGoPolyline.isDestroyed()) { - mMoGoPolyline.setVisible(isVisible); + mPolylineColors.addAll(list); + // 线条粗细,渐变,渐变色值 + mPolylineOptions.width(12).useGradient(true).colorValues(mPolylineColors); + if (mMoGoPolyline == null || mMoGoPolyline.isDestroyed()) { + mPolylineOptions.points(mPolylinePointList); + mMoGoPolyline = mogoOverlayManager.addPolyline(mPolylineOptions); + } else { + mPolylineOptions.points(mPolylinePointList); + mMoGoPolyline.setOption(mPolylineOptions); } } }