博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android使用百度地图API实现GPS步行轨迹
阅读量:6389 次
发布时间:2019-06-23

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

百度地图Android SDK下载:

下面是效果:

采样点取得太频繁所以看起来像是一个个点。。。   可以自己设计算法只取有用的点。

 

 

 

为了方便,我直接修改百度提供的示例代码。

要修改的是BMapApiDemoApp.java,LocationOverlay.java还有自定义一个继承自Overlay的RunLineOverlay。

 

 

BMapApiDemoApp:

public class BMapApiDemoApp extends Application {        static BMapApiDemoApp mDemoApp;        //百度MapAPI的管理类    BMapManager mBMapMan = null;        // 授权Key    // TODO: 请输入您的Key,    // 申请地址:http://dev.baidu.com/wiki/static/imap/key/    String mStrKey = "你的Key";    boolean m_bKeyRight = true;    // 授权Key正确,验证通过        // 常用事件监听,用来处理通常的网络错误,授权验证错误等    static class MyGeneralListener implements MKGeneralListener {        @Override        public void onGetNetworkState(int iError) {            Log.d("MyGeneralListener", "onGetNetworkState error is "+ iError);            Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(), "您的网络出错啦!",                    Toast.LENGTH_LONG).show();        }        @Override        public void onGetPermissionState(int iError) {            Log.d("MyGeneralListener", "onGetPermissionState error is "+ iError);            if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {                // 授权Key错误:                Toast.makeText(BMapApiDemoApp.mDemoApp.getApplicationContext(),                         "请在BMapApiDemoApp.java文件输入正确的授权Key!",                        Toast.LENGTH_LONG).show();                BMapApiDemoApp.mDemoApp.m_bKeyRight = false;            }        }    }    @Override    public void onCreate() {        Log.v("BMapApiDemoApp", "onCreate");        mDemoApp = this;        mBMapMan = new BMapManager(this);        boolean isSuccess = mBMapMan.init(this.mStrKey, new MyGeneralListener());        // 初始化地图sdk成功,设置定位监听时间        if (isSuccess) {             mBMapMan.getLocationManager().enableProvider(MKLocationManager.MK_GPS_PROVIDER);            mBMapMan.getLocationManager().setNotifyInternal(10, 5);        }        else {            // 地图sdk初始化失败,不能使用sdk        }                super.onCreate();    }    @Override    //建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗    public void onTerminate() {        // TODO Auto-generated method stub        if (mBMapMan != null) {            mBMapMan.destroy();            mBMapMan = null;        }        super.onTerminate();    }}

mStrKey的值是你申请来的Key,申请地址上面有。

onCreate里加了句mBMapMan.getLocationManager().enableProvider(MKLocationManager.MK_GPS_PROVIDER);用来打开GPS位置。

 

 

RunLineOverlay:

public class RunLineOverlay extends Overlay {        private List
mList; public RunLineOverlay() { // TODO Auto-generated constructor stub super(); mList=new ArrayList
(); } @Override public void draw(Canvas arg0, MapView arg1, boolean arg2) { // TODO Auto-generated method stub super.draw(arg0, arg1, arg2); Projection projection = arg1.getProjection(); Paint paint=new Paint(); paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5.0f); Point p1=projection.toPixels(mList.get(0), null); Point p2=projection.toPixels(mList.get(0), null); for (GeoPoint item : mList) { p1.x=p2.x; p1.y=p2.y; p2=projection.toPixels(item, null); arg0.drawLine(p1.x, p1.y, p2.x, p2.y, paint); } } public List
getmList() { return mList; } public void setmList(List
mList) { this.mList = mList; } public void addGeoPoint(GeoPoint point){ mList.add(point); }}

这是一个自定义的用于在底图上根据点画出轨迹的覆盖物。Projection用于经纬度和屏幕像素点的转换。大概功能就是取出经纬度点然后转成屏幕像素点然后连成轨迹。

 

 

LocationOverlay:

public class LocationOverlay extends MapActivity {    MapView mMapView = null;    LocationListener mLocationListener = null;//onResume时注册此listener,onPause时需要Remove    MyLocationOverlay mLocationOverlay = null;    //定位图层    RunLineOverlay mRunLine=null;        protected void onCreate(Bundle savedInstanceState) {                super.onCreate(savedInstanceState);        setContentView(R.layout.mapviewdemo);                BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();        if (app.mBMapMan == null) {            app.mBMapMan = new BMapManager(getApplication());            app.mBMapMan.init(app.mStrKey, new BMapApiDemoApp.MyGeneralListener());        }        app.mBMapMan.start();        // 如果使用地图SDK,请初始化地图Activity        super.initMapActivity(app.mBMapMan);                mMapView = (MapView)findViewById(R.id.bmapView);        mMapView.setBuiltInZoomControls(true);        //设置在缩放动画过程中也显示overlay,默认为不绘制        mMapView.setDrawOverlayWhenZooming(true);                // 添加定位图层        mLocationOverlay = new MyLocationOverlay(this, mMapView);        mMapView.getOverlays().add(mLocationOverlay);                // 注册定位事件        mLocationListener = new LocationListener(){            @Override            public void onLocationChanged(Location location) {                if (location != null){                    GeoPoint pt = new GeoPoint((int)(location.getLatitude()*1e6),                            (int)(location.getLongitude()*1e6));                    if(mRunLine==null)                    {mRunLine=new RunLineOverlay();                    mRunLine.addGeoPoint(pt);                    mMapView.getOverlays().add(mRunLine);}else                        mRunLine.addGeoPoint(pt);                    mMapView.getController().animateTo(pt);                }            }        };    }    @Override    protected void onPause() {        BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();        app.mBMapMan.getLocationManager().removeUpdates(mLocationListener);        mLocationOverlay.disableMyLocation();        mLocationOverlay.disableCompass(); // 关闭指南针        app.mBMapMan.stop();        super.onPause();    }    @Override    protected void onResume() {        BMapApiDemoApp app = (BMapApiDemoApp)this.getApplication();        // 注册定位事件,定位后将地图移动到定位点        app.mBMapMan.getLocationManager().requestLocationUpdates(mLocationListener);        mLocationOverlay.enableMyLocation();        mLocationOverlay.enableCompass(); // 打开指南针        app.mBMapMan.start();        super.onResume();    }    @Override    protected boolean isRouteDisplayed() {        // TODO Auto-generated method stub        return false;    }}

主要修改的代码是

public void onLocationChanged(Location location) {

                if (location != null){
                    GeoPoint pt = new GeoPoint((int)(location.getLatitude()*1e6),
                            (int)(location.getLongitude()*1e6));
                    if(mRunLine==null)
                    {mRunLine=new RunLineOverlay();
                    mRunLine.addGeoPoint(pt);
                    mMapView.getOverlays().add(mRunLine);}else
                        mRunLine.addGeoPoint(pt);
                    mMapView.getController().animateTo(pt);
                }

 

当位置改变是这个方法会被调用。功能就是把新位置放入mRunLine。当然第一次要mMapView.getOverlays().add(mRunLine);把mRunLine放进mMapView的覆盖物列表,这样当mMapView被重绘时mRunLine的draw方法就会被调用。

 

改好后运行程序,列表点击Overlaytest,然后出去转一圈。

posted on
2012-11-29 14:16 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/kagami/archive/2012/11/29/2794544.html

你可能感兴趣的文章
【python】python path,macports,easy-install,numpy,scipy,ipython,matplotlib,集成工具...
查看>>
学习进度总结
查看>>
ACCESS模糊查询出现"内存溢出"原因是日文片假名
查看>>
Error setting expression 'XXX' with value 设置表达式“XXX”时出错 解决方法
查看>>
javascript获取url参数和script标签中获取url参数
查看>>
CF359D:Pair of Numbers(数论)
查看>>
进制转换展示
查看>>
张泉灵:做投资这半年哭过的时间比前十年都多
查看>>
c++将bool变量以文字形式打印
查看>>
洛谷P1111 修复公路 并查集 图论 最小生成树
查看>>
微名汇-微信公众平台功能开发(微信聊天机器人)
查看>>
A2W和W2A :很好的多字节和宽字节字符串的转换宏
查看>>
_T和_L的区别
查看>>
我个人的javascript和css命名规范
查看>>
android ANR产生原因和解决办法
查看>>
kylin的安装与配置
查看>>
我的java学习之路--Reflect专题
查看>>
Android Intent的setClass和setClassName的区别
查看>>
php-fpm nginx 使用 curl 请求 https 出现 502 错误
查看>>
西宁海关首次对外展示截获500余件有害生物标本
查看>>