1
百度定位回调监听
此处注意;上次遇到个问题,在室内wifi能够进入if语句,但室外不能够定位,后来移动4g网络下调试,
发现是getlocationtype没有对应的,也就是没有对移动网络对locationType进行处理,当时直接在百度给对demo那直接复制对也没想那么多,浪费了点时间。
BDLocationListener listener = new BDLocationListener() {
@Override public void onReceiveLocation(BDLocation location) {//locationType “wf”代表wifi,“cl”代表基站,“ll”代表GPS,cl定位发起
if (location != null && (location.getLocType() == 161 || location.getLocType() == 66 || location.getLocType() == 61)) { if (location.getRadius() > 50) {//此处能过滤部分定位模式切换导致的定位偏差 return; } if (location.getGpsAccuracyStatus() == BDLocation.GPS_ACCURACY_BAD) { gpsStatus = "弱"; } else if (location.getGpsAccuracyStatus() == BDLocation.GPS_ACCURACY_MID) { gpsStatus = "中"; } else if (location.getGpsAccuracyStatus() == BDLocation.GPS_ACCURACY_GOOD) { gpsStatus = "强"; }
//此处为自己业务去保存轨迹点位到本地数据库 saveTrack(algorithm(location)); } } };
//百度提供定位处理方法
private BDLocation algorithm(BDLocation location) { double curSpeed; if (locationList.isEmpty() || locationList.size() < 2) { TrackPointDto temp = new TrackPointDto(); temp.setLatitude(location.getLatitude()); temp.setLongitude(location.getLongitude()); temp.setCreateTime(TimeTool.getDateString(System.currentTimeMillis())); locationList.add(temp); } else {//与前5次轨迹点进行比较 if (locationList.size() > 5) locationList.removeFirst(); double score = 0; for (int i = 0; i < locationList.size(); ++i) { LatLng lastPoint = new LatLng(locationList.get(i).getLatitude(), locationList.get(i).getLongitude()); LatLng curPoint = new LatLng(location.getLatitude(), location.getLongitude()); double distance = DistanceUtil.getDistance(lastPoint, curPoint); curSpeed = distance / (System.currentTimeMillis() - TimeTool.getLongTime(locationList.get(i).getCreateTime())) / 1000; score += curSpeed * Utils.EARTH_WEIGHT[i]; } // if (score > 0.00000999 && score < 0.00005) { // 经验值,开发者可根据业务自行调整,也可以不使用这种算法 if (score > 0.00000999 && score < 0.00005) { // 经验值,开发者可根据业务自行调整,也可以不使用这种算法 location.setLongitude((locationList.get(locationList.size() - 1).getLongitude() + location.getLongitude()) / 2); location.setLatitude((locationList.get(locationList.size() - 1).getLatitude() + location.getLatitude()) / 2); } TrackPointDto newLocation = new TrackPointDto(); newLocation.setLatitude(location.getLatitude()); newLocation.setLongitude(location.getLongitude()); newLocation.setCreateTime(TimeTool.getDateString(System.currentTimeMillis())); locationList.add(newLocation); } return location; }由于我的查看轨迹是在一个新开的activity上进行,所以要根据轨迹id查询数据库获取点位进行绘制
轨迹的id生成是 开始/暂停 一个时间段内进行重新生成,以达到绘制轨迹时能够分段;
下面是绘制轨迹的方法:
/** * 画轨迹 */ List<LatLng> latLngList = new ArrayList<>(); MyLocationData locData; protected void drawMyRoute(List<LatLng> latLngList) { if (latLngList.size() > 1) { draw(latLngList); } else if (latLngList.size() > 0) {//如果只有一个点的话进行定位 if (locData == null) { locData = new MyLocationData.Builder() .accuracy(40.0f) .direction(100).latitude(latLngList.get(0).latitude) .longitude(latLngList.get(0).longitude).build(); if (mBaiduMap != null) { mBaiduMap.setMyLocationData(locData); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(latLngList.get(0)).zoom(zoom); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } } } } private MapStatusUpdate msUpdate = null; private OverlayOptions overlay; //覆盖物 private PolylineOptions polyline = null; //路线覆盖物 private BitmapDescriptor realtimeBitmap; private Overlay overlay1; public void draw(List<LatLng> latLngList) { Log.i("drawTrack___", "draw"); LatLng latLng = latLngList.get(latLngList.size() - 1); MapStatus mapStatus = new MapStatus.Builder().target(latLng).zoom(zoom).build(); msUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus); // LatLngBounds bounds = new LatLngBounds.Builder().include(latLng).include(latLng).build(); // msUpdate = MapStatusUpdateFactory.newLatLngBounds(bounds); // if (overlay != null) { // mBaiduMap.clear(); // } if (overlay1 != null) { overlay1.remove(); } realtimeBitmap = BitmapDescriptorFactory.fromResource(R.mipmap.icon_gcoding); overlay = new MarkerOptions().position(latLng).icon(realtimeBitmap).zIndex(9).draggable(true); if (latLngList.size() >= 2) {// && pointList.size() <= 10000 polyline = new PolylineOptions().width(15).color(Color.GREEN).points(latLngList); } //添加 if (polyline != null && mBaiduMap != null) { overlay1 = mBaiduMap.addOverlay(polyline); } //添加图层 if (msUpdate != null && mBaiduMap != null) { mBaiduMap.setMapStatus(msUpdate); } //添加红色小图片 if (overlay != null && mBaiduMap != null) { overlay1 = mBaiduMap.addOverlay(overlay); } }