Files
MoGoEagleEye/libraries/mogo-map/src/main/java/com/mogo/map/AMapWrapper.java
2023-03-02 19:54:16 +08:00

344 lines
11 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.mogo.map;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Point;
import android.util.Pair;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.map.center.CenterLine;
import com.mogo.map.marker.AMapInfoWindowAdapter;
import com.mogo.map.marker.AMapMarkerWrapper;
import com.mogo.map.marker.IMogoMarker;
import com.mogo.map.marker.MogoMarkerOptions;
import com.mogo.map.marker.MogoMarkersHandler;
import com.mogo.map.overlay.AMapPolylineWrapper;
import com.mogo.map.overlay.IMogoPolyline;
import com.mogo.map.overlay.MogoPolylineOptions;
import com.mogo.map.road.RoadNameInfo;
import com.mogo.map.uicontroller.AMapUIController;
import com.mogo.map.uicontroller.IMogoMapUIController;
import com.mogo.map.utils.ObjectUtils;
import com.zhidaoauto.map.sdk.open.MapAutoApi;
import com.zhidaoauto.map.sdk.open.data.MapDataApi;
import com.zhidaoauto.map.sdk.open.data.SinglePointRoadInfo;
import com.zhidaoauto.map.sdk.open.marker.Marker;
import com.zhidaoauto.map.sdk.open.marker.MarkerHelper;
import com.zhidaoauto.map.sdk.open.marker.MarkerOptions;
import com.zhidaoauto.map.sdk.open.marker.MarkerSimpleData;
import com.zhidaoauto.map.sdk.open.marker.MultiPointOverlayOptions;
import com.zhidaoauto.map.sdk.open.poyline.Polyline;
import com.zhidaoauto.map.sdk.open.poyline.PolylineOptions;
import com.zhidaoauto.map.sdk.open.query.LonLatPoint;
import com.zhidaoauto.map.sdk.open.tools.MapTools;
import com.zhidaoauto.map.sdk.open.view.MapAutoView;
import com.zhidaoauto.map.sdk.open.view.MapAutoViewHelper;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import mogo.telematics.pad.MessagePad;
import mogo.yycp.api.proto.SocketDownData;
/**
* @author congtaowang
* @since 2019-12-18
* <p>
* 代理自研AMap
*/
public class AMapWrapper implements IMogoMap {
private static final String TAG = "AMapWrapper";
private static MapAutoViewHelper sAMap;
private IMogoMapUIController mMapUIController;
private MapAutoViewHelper mAMap;
private MapAutoView mMapView;
private IMogoUiSettings mUiSettings;
public AMapWrapper(MapAutoViewHelper map, MapAutoView mapView, IMogoMapUIController controller) {
CallerLogger.INSTANCE.i(TAG, "autoop--AMapWrapper: init" + this);
this.mAMap = map;
sAMap = map;
this.mMapView = mapView;
mMapUIController = controller;
// 设置实现自定义 info window
MapAutoApi.INSTANCE.setInfoWindowAdapter(new AMapInfoWindowAdapter());
AMapUIController.getInstance().initClient(mMapUIController);
}
public static MapAutoViewHelper getAMap() {
return sAMap;
}
@Override
public IMogoUiSettings getUiSettings() {
if (!checkAMap()) {
return null;
}
if (mUiSettings == null) {
mUiSettings = new AMapUiSettingsWrapper(mAMap);
}
return mUiSettings;
}
@Override
public IMogoMapUIController getUIController() {
return mMapUIController;
}
@Override
public IMogoMarker addMarker(String tag, MogoMarkerOptions options) {
if (!checkAMap()) {
return null;
}
MarkerOptions markerOptions = ObjectUtils.fromMogo(options);
if (markerOptions == null) {
CallerLogger.INSTANCE.e(TAG, "marker参数为空");
return null;
}
final IMogoMarker mogoMarker = new AMapMarkerWrapper(mAMap.addMarker(markerOptions), options);
if (options.isAutoManager()) {
MogoMarkersHandler.Companion.getMogoMarkersHandler().add(tag, mogoMarker);
}
return mogoMarker;
}
@Override
public void clearAllMarkers() {
if (sAMap != null) {
sAMap.clearAllMarkers();
}
}
@SuppressLint("NewApi")
@Override
public void updateBatchMarkerPosition(HashMap<String, MessagePad.TrackedObject> optionsArrayList) {
if (!checkAMap()) {
return;
}
ArrayList<MarkerSimpleData> markerOptionsArrayList = new ArrayList<>();
optionsArrayList.forEach((s, trackedObject) -> {
MarkerSimpleData markerOptions = ObjectUtils.fromTrafficData(trackedObject);
if (markerOptions != null) {
markerOptionsArrayList.add(markerOptions);
}
});
long time = markerOptionsArrayList.get(0).getTime();
MarkerHelper.INSTANCE.updateBatchMarkerPositon(markerOptionsArrayList, false, FunctionBuildConfig.isBeautyMode ? 8.0f : 0f, 1, time, 1);
}
@SuppressLint("NewApi")
@Override
public void updateBatchAiMarkerPosition(HashMap<String, SocketDownData.CloudRoadDataProto> optionsArrayList) {
if (!checkAMap()) {
return;
}
ArrayList<MarkerSimpleData> markerOptionsArrayList = new ArrayList<>();
optionsArrayList.forEach((s, trackedObject) -> {
MarkerSimpleData markerOptions = ObjectUtils.fromAiData(trackedObject);
if (markerOptions != null) {
markerOptionsArrayList.add(markerOptions);
}
});
long time = markerOptionsArrayList.get(0).getTime();
// 最后一个参数,是否管理锚点的删除
MarkerHelper.INSTANCE.updateBatchMarkerPositon(markerOptionsArrayList, false, FunctionBuildConfig.isBeautyMode ? 8.0f : 0f, 1, time, 1);
}
@Override
public String addPreVehicleModel(int type, int modelRes) {
try {
return MarkerHelper.INSTANCE.addPreVehicleModel(type, modelRes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public void removeMarker(String uuidString) {
try {
MarkerHelper.INSTANCE.removeMarker(uuidString);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public ArrayList<IMogoMarker> addMarkers(String tag, ArrayList<MogoMarkerOptions> options, boolean moveToCenter) {
if (!checkAMap()) {
return null;
}
if (options == null || options.isEmpty()) {
return null;
}
ArrayList<Marker> markers = new ArrayList<>();
ArrayList<MarkerOptions> markerOptions = new ArrayList<>();
ArrayList<IMogoMarker> mogoMarkers = new ArrayList<>();
for (MogoMarkerOptions option : options) {
if (option == null) {
continue;
}
MarkerOptions mo = ObjectUtils.fromMogo(option);
if (mo == null) {
continue;
}
markerOptions.add(mo);
}
if (markerOptions.isEmpty()) {
return null;
}
MultiPointOverlayOptions multiPointOverlayOptions = new MultiPointOverlayOptions();
multiPointOverlayOptions.setData(markerOptions);
multiPointOverlayOptions.setMarkerIcon(R.drawable.marker_blue);
List<MarkerOptions> data = mAMap.addMarkers(multiPointOverlayOptions).getOptions().getData();
for (int i = 0; i < data.size(); i++) {
markers.add(new Marker(data.get(i)));
}
if (markers == null || markers.isEmpty()) {
return null;
}
for (int i = 0; i < markers.size(); i++) {
Marker marker = markers.get(i);
if (marker == null) {
continue;
}
mogoMarkers.add(new AMapMarkerWrapper(marker, options.get(i)));
}
MogoMarkersHandler.Companion.getMogoMarkersHandler().add(tag, mogoMarkers);
return mogoMarkers;
}
@Override
public void clear() {
if (checkAMap()) {
mAMap.clearPanel();
}
}
@Override
public void clear(boolean isKeepMyLocationOverlay) {
if (checkAMap()) {
mAMap.clearPanel();
}
}
@Override
public void setPointToCenter(int x, int y) {
if (checkAMap()) {
LonLatPoint lonLatPoint = MapTools.INSTANCE.fromScreenLocation(new Point(x, y));
mAMap.setCenter(lonLatPoint);
}
}
@Override
public float getScalePerPixel() {
if (checkAMap()) {
return mAMap.getScalePerPixel();
}
return 0;
}
@Override
public void changeZoom(float zoom) {
CallerLogger.INSTANCE.d(TAG, "changeZoom %s", zoom);
if (checkAMap()) {
mAMap.setZoom((int) zoom);
}
}
@Override
public float getZoomLevel() {
if (checkAMap()) {
try {
return mAMap.getZoom();
} catch (Exception e) {
}
}
return 0;
}
@Override
public IMogoPolyline addPolyline(MogoPolylineOptions options) {
if (checkAMap()) {
PolylineOptions polylineOptions = ObjectUtils.fromMogo(options);
CallerLogger.INSTANCE.d(TAG, "addPolyline %s", polylineOptions.toString());
if (polylineOptions == null) {
return null;
}
Polyline polyline = null;
if (polylineOptions.getLineWidth() > 0) {
polyline = mAMap.drawThickLine(polylineOptions);
} else {
polyline = mAMap.drawLine(polylineOptions);
}
return new AMapPolylineWrapper(polyline, options);
}
return null;
}
private boolean checkAMap() {
mAMap = mMapView.getMapAutoViewHelper();
sAMap = mAMap;
if (mAMap == null) {
CallerLogger.INSTANCE.e(TAG, "自研map实例为空请检查");
return false;
}
return true;
}
@Override
public float getRoadWidth(double lon, double lat, float angle, boolean isGpsLocation, boolean isRTK) {
SinglePointRoadInfo singlePointRoadInfo = MapDataApi.INSTANCE.getSinglePointMatchRoad(lon, lat, angle, isGpsLocation, isRTK);
return singlePointRoadInfo != null ? singlePointRoadInfo.getLaneWidth() : 0;
}
@Override
public CenterLine getCenterLineRangeInfo(double lon, double lat, float angle, float distance) {
try {
com.zhidaoauto.map.sdk.open.road.CenterLine info = MapDataApi.INSTANCE.getCenterLineRangeInfo(lon, lat, angle, distance);
CenterLine ret = null;
if (info != null) {
ret = new CenterLine(info.id, info.tile_id, info.road_id, info.lane_id, convert(info.points), info.angle == null ? 0f : info.angle);
}
return ret;
} catch (Throwable t) {
t.printStackTrace();
return null;
}
}
@Override
public RoadNameInfo getRoadName(double lon, double lat, float angle) {
// com.zhidaoauto.map.sdk.open.road.RoadNameInfo info = MapDataApi.INSTANCE.getRoadName(lon, lat, angle);
// RoadNameInfo ret = null;
// if (info != null) {
// ret = new RoadNameInfo(info.tile_id, info.road_id, info.road_name);
// }
return null;
}
private List<Pair<Double, Double>> convert(List<LonLatPoint> points) {
if (points == null || points.isEmpty()) {
return Collections.emptyList();
}
List<Pair<Double, Double>> ret = new ArrayList<>(points.size());
for (LonLatPoint p : points) {
ret.add(Pair.create(p.longitude, p.latitude));
}
return ret;
}
private Context getContext() {
return mMapView.getContext();
}
}