您的位置:首页 > 移动开发 > Android开发

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

2017-07-06 13:50 1411 查看
摘要: BaiduMap,记录一下

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Trace Android baidu.mapapi
相关文章推荐