import android.graphics.Color; import android.os.Bundle; import android.widget.RelativeLayout; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.Overlay; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.PolylineOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.model.LatLngBounds; import com.baidu.trace.LBSTraceClient; import com.baidu.trace.api.track.HistoryTrackRequest; import com.baidu.trace.api.track.HistoryTrackResponse; import com.baidu.trace.api.track.OnTrackListener; import com.baidu.trace.api.track.SortType; import com.baidu.trace.api.track.TrackPoint; import com.baidu.trace.model.StatusCodes; import com.zxrf.android.R; import com.zxrf.android.common.activity.CommonActivity; import com.zxrf.android.common.base.SupportDisplay; import com.zxrf.android.common.util.ToastUtil; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; public class TrackqueryActivity extends CommonActivity { // Track service ID private long serviceId = user_serviceId; // Equipment Identity private String entityName = getIMEI(); private HistoryTrackRequest historyTrackRequest; private BaiduMap Map; private MapView map_view; private LBSTraceClient mTraceClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView(R.layout.activity_trackquery); map_view = (MapView) findViewById(R.id.map_view); Map = map_view.getMap(); mTraceClient = new LBSTraceClient(getApplicationContext()); historyTrackRequest = new HistoryTrackRequest(mSequenceGenerator.incrementAndGet(), serviceId, entityName); Init(); } private AtomicInteger mSequenceGenerator = new AtomicInteger(); private void Init(){ //Set the start and end time of the track query // start time (unit: seconds) long startTime = System.currentTimeMillis() / 1000 - 12 * 60 * 60; // end time (unit: seconds) long endTime = System.currentTimeMillis() / 1000; // set start time historyTrackRequest.setStartTime(startTime); // set end time historyTrackRequest.setEndTime(endTime); // Query historical track historyTrackRequest.setPageIndex(pageIndex); historyTrackRequest.setPageSize(PAGE_SIZE); mTraceClient.queryHistoryTrack (historyTrackRequest, mTrackListener); } /** * Track point collection */ private List<LatLng> trackPoints = new ArrayList<>(); public static final int PAGE_SIZE = 5000; /** * Track sorting rules */ private SortType sortType = SortType.asc; private int pageIndex = 1; // Initialize track listener OnTrackListener mTrackListener = new OnTrackListener() { // History track callback @Override public void onHistoryTrackCallback(HistoryTrackResponse response) { int toal = response.getTotal(); if (StatusCodes.SUCCESS != response.getStatus()) { ToastUtil.show(response.getMessage()); }else if (0 == toal){ ToastUtil.show("No track found"); }else { List<TrackPoint> points = response.getTrackPoints(); if (null != points) { for (TrackPoint trackPoint : points) { if (!MapUtils.isZeroPoint(trackPoint.getLocation().getLatitude(), trackPoint.getLocation().getLongitude())) { trackPoints.add(new LatLng(trackPoint.getLocation().latitude, trackPoint.getLocation().longitude)); } } } } if (toal > PAGE_SIZE*pageIndex){ historyTrackRequest.setPageIndex(++pageIndex); Init(); } else { drawHistoryTrack(trackPoints, sortType); } } }; @Override protected void resetLayout() { RelativeLayout layout = (RelativeLayout) findViewById(R.id.rl_activity_track_query_viewgroup); SupportDisplay.resetAllChildViewParam(layout); } public BitmapDescriptor bmStart = null; public BitmapDescriptor bmEnd = null; public BitmapDescriptor bmArrowPoint = null; /** * route cover */ public Overlay polylineOverlay = null; private Marker mMoveMarker = null; private MapStatus mapStatus = null; /** * Draw historical track */ public void drawHistoryTrack( final List<LatLng> points, SortType sortType) { // Before drawing a new overlay, clear the previous overlay Map.clear(); if (null != mMoveMarker) { mMoveMarker.remove(); mMoveMarker = null; } if (points == null || points.size() == 0) { if (null != polylineOverlay) { polylineOverlay.remove(); polylineOverlay = null; } return; } //resource bmStart = BitmapDescriptorFactory.fromResource(R.mipmap.icon_start); bmEnd = BitmapDescriptorFactory.fromResource(R.mipmap.icon_end); bmArrowPoint = BitmapDescriptorFactory.fromResource(R.mipmap.icon_point); if (points.size() == 1) { OverlayOptions startOptions = new MarkerOptions().position(points.get(0)).icon(bmStart) .zIndex(9).draggable(true); Map.addOverlay(startOptions); animateMapStatus(points.get(0), 18.0f); return; } LatLng startPoint; LatLng endPoint; if (sortType == SortType.asc) { startPoint = points.get(0); endPoint = points.get(points.size() - 1); } else { startPoint = points.get(points.size() - 1); endPoint = points.get(0); } // add start icon OverlayOptions startOptions = new MarkerOptions() .position(startPoint).icon(bmStart) .zIndex(9).draggable(true); // add end icon OverlayOptions endOptions = new MarkerOptions().position(endPoint) .icon(bmEnd).zIndex(9).draggable(true); // add route (track) OverlayOptions polylineOptions = new PolylineOptions().width(10) .color(Color.BLUE).points(points); Map.addOverlay(startOptions); Map.addOverlay(endOptions); polylineOverlay = Map.addOverlay(polylineOptions); OverlayOptions markerOptions = new MarkerOptions().flat(true).anchor(0.5f, 0.5f).icon(bmArrowPoint) .position(points.get(points.size() - 1)) .rotate((float) MapUtils.getAngle(points.get(0), points.get(1))); mMoveMarker = (Marker) Map.addOverlay(markerOptions); animateMapStatus(points); } public void animateMapStatus(LatLng point, float zoom) { MapStatus.Builder builder = new MapStatus.Builder(); mapStatus = builder.target(point).zoom(zoom).build(); Map.animateMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus)); } public void animateMapStatus(List<LatLng> points) { if (null == points || points.isEmpty()) { return; } LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (LatLng point : points) { builder.include(point); } MapStatusUpdate msUpdate = MapStatusUpdateFactory.newLatLngBounds(builder.build()); Map.animateMapStatus(msUpdate); } }
MapUtils class
import com.baidu.mapapi.model.LatLng; /** * Created by Timor on 2017/6/30. */ public class MapUtils { /** * Whether the latitude and longitude is the (0,0) point * * @return */ public static boolean isZeroPoint(double latitude, double longitude) { return isEqualToZero(latitude) && isEqualToZero(longitude); } /** * Check if the double value is 0 * * @param value * * @return */ public static boolean isEqualToZero(double value) { return Math.abs(value - 0.0) < 0.01 ? true : false; } /** * Calculate the rotation angle of the icon according to two points */ public static double getAngle(LatLng fromPoint, LatLng toPoint) { double slope = getSlope(fromPoint, toPoint); if (slope == Double.MAX_VALUE) { if (toPoint.latitude > fromPoint.latitude) { return 0; } else { return 180; } } float deltAngle = 0; if ((toPoint.latitude - fromPoint.latitude) * slope < 0) { deltAngle = 180; } double radio = Math.atan(slope); return 180 * (radio / Math.PI) + deltAngle - 90; } /** * Calculate the slope */ public static double getSlope(LatLng fromPoint, LatLng toPoint) { if (toPoint.longitude == fromPoint.longitude) { return Double.MAX_VALUE; } return (toPoint.latitude - fromPoint.latitude) / (toPoint.longitude - fromPoint.longitude); } }