百度定位绘制轨迹

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);
        }

    }




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章