百度鹰眼轨迹查询历史轨迹并显示在地图上

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 {
    // 轨迹服务ID
    private long serviceId = user_serviceId;
    // 设备标识
    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(){

//设置轨迹查询起止时间
// 开始时间(单位:秒)
        long startTime = System.currentTimeMillis() / 1000 - 12 * 60 * 60;
// 结束时间(单位:秒)
        long endTime = System.currentTimeMillis() / 1000;
// 设置开始时间
        historyTrackRequest.setStartTime(startTime);
// 设置结束时间
        historyTrackRequest.setEndTime(endTime);
        // 查询历史轨迹
        historyTrackRequest.setPageIndex(pageIndex);
        historyTrackRequest.setPageSize(PAGE_SIZE);
        mTraceClient.queryHistoryTrack(historyTrackRequest, mTrackListener);
    }

    /**
     * 轨迹点集合
     */
    private List<LatLng> trackPoints = new ArrayList<>();
    public static final int PAGE_SIZE = 5000;
    /**
     * 轨迹排序规则
     */
    private SortType sortType = SortType.asc;

    private int pageIndex = 1;
    // 初始化轨迹监听器
    OnTrackListener mTrackListener = new OnTrackListener() {
        // 历史轨迹回调
        @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("未查询到轨迹");
            }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;
    /**
     * 路线覆盖物
     */
    public Overlay polylineOverlay = null;
    private Marker mMoveMarker = null;
    private MapStatus mapStatus = null;
    /**
     * 绘制历史轨迹
     */
    public void drawHistoryTrack( final List<LatLng> points, SortType sortType) {
        // 绘制新覆盖物前,清空之前的覆盖物
        Map.clear();
        if (null != mMoveMarker) {
            mMoveMarker.remove();
            mMoveMarker = null;
        }
        if (points == null || points.size() == 0) {
            if (null != polylineOverlay) {
                polylineOverlay.remove();
                polylineOverlay = null;
            }
            return;
        }
//资源文件
        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);
        }

        // 添加起点图标
        OverlayOptions startOptions = new MarkerOptions()
                .position(startPoint).icon(bmStart)
                .zIndex(9).draggable(true);
        // 添加终点图标
        OverlayOptions endOptions = new MarkerOptions().position(endPoint)
                .icon(bmEnd).zIndex(9).draggable(true);

        // 添加路线(轨迹)
        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类
import com.baidu.mapapi.model.LatLng;

/**
 * Created by Timor on 2017/6/30.
 */

public class MapUtils {


    /**
     * 经纬度是否为(0,0)点
     *
     * @return
     */
    public static boolean isZeroPoint(double latitude, double longitude) {
        return isEqualToZero(latitude) && isEqualToZero(longitude);
    }
    /**
     * 校验double数值是否为0
     *
     * @param value
     *
     * @return
     */
    public static boolean isEqualToZero(double value) {
        return Math.abs(value - 0.0) < 0.01 ? true : false;
    }

    /**
     * 根据两点算取图标转的角度
     */
    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;
    }
    /**
     * 算斜率
     */
    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);
    }
}

猜你喜欢

转载自my.oschina.net/u/2355512/blog/1082890
今日推荐