博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度定位---连续定位
阅读量:6090 次
发布时间:2019-06-20

本文共 6325 字,大约阅读时间需要 21 分钟。

hot3.png

连续定位

package com.qu.weibao.demo;import java.util.LinkedList;import com.baidu.location.BDAbstractLocationListener;import com.baidu.location.BDLocation;import com.baidu.location.LocationClientOption;import com.qu.waibao.R;import com.qu.weibao.service.LocationService;import com.qu.weibao.service.Utils;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.utils.DistanceUtil;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/*** * 定位滤波demo,实际定位场景中,可能会存在很多的位置抖动,此示例展示了一种对定位结果进行的平滑优化处理 * 实际测试下,该平滑策略在市区步行场景下,有明显平滑效果,有效减少了部分抖动,开放算法逻辑,希望能够对开发者提供帮助 * 注意:该示例场景仅用于对定位结果优化处理的演示,里边相关的策略或算法并不一定适用于您的使用场景,请注意!!! * */public class LocationFilter extends Activity {	private MapView mMapView = null;	private BaiduMap mBaiduMap;	private Button reset;	private LocationService locService;	/**	 * 存放历史定位结果的链表,最大存放当前结果的前5次定位结果	 */	private LinkedList
locationList = new LinkedList
(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.locationfilter); mMapView = (MapView) findViewById(R.id.bmapView); reset = (Button) findViewById(R.id.clear); /** * 在地图上显示定位的配置 */ mBaiduMap = mMapView.getMap(); mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(15)); locService = ((LocationApplication) getApplication()).locationService; LocationClientOption mOption = locService.getDefaultLocationClientOption(); mOption.setLocationMode(LocationClientOption.LocationMode.Battery_Saving); mOption.setCoorType("bd09ll"); locService.setLocationOption(mOption); locService.registerListener(listener); locService.start(); } /*** * 定位结果回调,在此方法中处理定位结果 */ BDAbstractLocationListener listener = new BDAbstractLocationListener() { @Override public void onReceiveLocation(BDLocation location) { if (location != null && (location.getLocType() == 161 || location.getLocType() == 66)) { Message locMsg = locHander.obtainMessage(); Bundle locData; /** * 采用算法来减小移动过快的时候定位图标的抖动 */ locData = Algorithm(location); if (locData != null) { locData.putParcelable("loc", location); locMsg.setData(locData); locHander.sendMessage(locMsg); } } } }; /*** * 平滑策略代码实现方法,主要通过对新定位和历史定位结果进行速度评分, * 来判断新定位结果的抖动幅度,如果超过经验值,则判定为过大抖动,进行平滑处理,若速度过快, * 则推测有可能是由于运动速度本身造成的,则不进行低速平滑处理 * @param location * @return Bundle */ private Bundle Algorithm(BDLocation location) { Bundle locData = new Bundle(); double curSpeed = 0; if (locationList.isEmpty() || locationList.size() < 2) { LocationEntity temp = new LocationEntity(); temp.location = location; temp.time = System.currentTimeMillis(); locData.putInt("iscalculate", 0); 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).location.getLatitude(), locationList.get(i).location.getLongitude()); LatLng curPoint = new LatLng(location.getLatitude(), location.getLongitude()); //计算当前的位置与前面位置的间距,来计算位移的速度 double distance = DistanceUtil.getDistance(lastPoint, curPoint); curSpeed = distance / (System.currentTimeMillis() - locationList.get(i).time) / 1000; score += curSpeed * Utils.EARTH_WEIGHT[i]; } // 经验值,开发者可根据业务自行调整,也可以不使用这种算法 if (score > 0.00000999 && score < 0.00005) { //当前纬度一半+前面保存的纬度 location.setLongitude( (locationList.get(locationList.size() - 1).location.getLongitude() + location.getLongitude()) / 2); //当前精度一半+前面保存的精度 location.setLatitude( (locationList.get(locationList.size() - 1).location.getLatitude() + location.getLatitude()) / 2); locData.putInt("iscalculate", 1); } else { locData.putInt("iscalculate", 0); } LocationEntity newLocation = new LocationEntity(); newLocation.location = location; newLocation.time = System.currentTimeMillis(); locationList.add(newLocation); } return locData; } /*** * 接收定位结果消息,并显示在地图上 */ private Handler locHander = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); try { BDLocation location = msg.getData().getParcelable("loc"); int iscal = msg.getData().getInt("iscalculate"); if (location != null) { LatLng point = new LatLng(location.getLatitude(), location.getLongitude()); // 构建Marker图标 BitmapDescriptor bitmap = null; if (iscal == 0) { bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_openmap_mark); // 非推算结果 } else { bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_openmap_focuse_mark); // 推算结果 } // 构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions().position(point).icon(bitmap); // 在地图上添加Marker,并显示 mBaiduMap.addOverlay(option); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point)); } } catch (Exception e) { // TODO: handle exception } } }; @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 locService.unregisterListener(listener); locService.stop(); mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); reset.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if (mBaiduMap != null) mBaiduMap.clear(); } }); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } /** * 封装定位结果和时间的实体类 */ class LocationEntity { BDLocation location; long time; }}

 

转载于:https://my.oschina.net/quguangle/blog/1863454

你可能感兴趣的文章
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>
Linux系统磁盘管理
查看>>
hdu 2191 (多重背包+二进制优化)
查看>>
home.php
查看>>
neo4j---删除关系和节点
查看>>
redis分布式锁redisson
查看>>
什么样的企业可以称之为初创企业?
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
newinstance()和new有什么区别
查看>>
android下载封装类
查看>>
[node] 用 node-webkit 开发桌面应用
查看>>
Nginx访问控制和虚拟主机
查看>>
report widget not working for external users
查看>>
windows phone 摄像头得到图片是旋转90°
查看>>
Linux--sed使用
查看>>
没有显示器的情况下安装和使用树莓派
查看>>
【android】使用handler更新UI
查看>>