Android使用百度地图API实现GPS步行轨迹

摘要:
BMapApiDemoApp:publicclassBMapApiNemoAppextendsApplication{staticBMapApiPDemoAppmDemoApp;//百度MapAPI的管理类BMapManagermBMapMan=null;//授权密钥//TODO:请输入密钥,//应用程序地址:http://dev.baidu.com/wiki/static/imap/key/StringmStrKey=“您的钥匙”;booleanm_bKeyRight=true;//授权密钥正确,验证通过//公共事件监视用于处理公共网络错误,授权验证错误和其他静态错误MyGeneralListenersimplementsMKGeneralListener{@OverridepublicvotionGetNetworkState{Log.d;Toast.makeText(BMapApiDemoApp.mdemoApp.getApplicationContext()),“您的网络出错!”,Toast.LNGTH_LONG).show();BMapApiPublicvotionApp.mdemoApp m_bKeyRight=false;}}@Overridepublic votionCreate(){Log.v;mDemoApp=this;mBMapMan=newBMapManager;booleanisSuccess=mBMapMan.init;//初始化映射sdk成功。如果{mBMapMan.getLocationManager().enableProvider;mBMapMan.getLocattionManager().setNotifyInternal;}否则{//映射sdk初始化失败。无法使用sdk}super,则设置位置侦听时间。onCreate();}@重写//建议在应用程序退出之前调用mapadpi的destruct()函数。为了避免重复初始化导致的时间消耗,publicvotionTerminate(){//TODOAuto-generatedmethodstuff(mBMapMan!OnCreate添加了句子mBMapMan.getLocationManager().enableProvider;以打开GPS位置。RunLineOverlay:publicclassRunLineOverlayextendsOverlay{privateList<GeoPoint>mList;publicRunLineOveray(){//TODOAauto-generatedconstructorstubsuper();mList=newArrayList<GeoPoint˃();}@Overridepublicvoiddraw{//TODOAuto生成的方法stubsuper.draw;投影投影=arg1.getProjection();Paintpaint=newPaint();paint.setColor;paint.setStyle;paint.setStrokeWidth;Pointp1=投影.toPixels;Pointp2=投影.toPixels;对于{p1.x=p2.x;p1.y=p2.y;p2=投影.toPixels;arg0.drawLine;}}publicList<GeoPoint>getmList(){returnmList;}publicvoidsetList{this.mList=mList;{PublicvoidaddGeoPoint{mList.add;}此这是一个很好的例子是一种自定义的叠加,用于根据点在基础地图上绘制轨迹。投影用于转换经度、纬度和屏幕像素。

百度地图Android SDK下载:http://developer.baidu.com/map/sdkandev-download.htm

下面是效果:

QQ截图20121129135007

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

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

QQ截图20121129135408

要修改的是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<GeoPoint> mList;
    
    public RunLineOverlay() {
        // TODO Auto-generated constructor stub
        super();
        mList=new ArrayList<GeoPoint>();
    }
    
    @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<GeoPoint> getmList() {
        return mList;
    }

    public void setmList(List<GeoPoint> 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,然后出去转一圈。

QQ截图20121129135007

免责声明:文章转载自《Android使用百度地图API实现GPS步行轨迹》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇配置ogg从Oracle到PostgreSQL的同步复制json数据网站图片幻灯片效果之左右箭头的制作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用百度地图API实现轨迹回放

调用百度地图API实现路线的轨迹回放功能其实很简单,只要搞懂以下几点即可: 1.需要用Polyline方法先绘制好路线图 2.用Marker添加标注点 3.关键一步,通过结合定时器,使用Marker创建的标注点实例的setPosition改变标注点位置,实现播放功能 代码分享,直接复制即可使用 [html] view plaincopy  <...

vue2.x使用百度地图

在12月份之前在vue项目中使用百度地图我都是在index.html直接应用如下代码 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=你的秘钥"></script> 然后直接在页面直接初始化地图即可,注意地图一定要设置宽和高。...

【转】【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件

【转】【完全开源】百度地图Web service API C#.NET版,带地图显示控件、导航控件、POI查找控件 目录 概述 功能 如何使用 参考帮助 概述 源代码主要包含三个项目,BMap.NET、BMap.NET.WindowsForm以及BMap.NET.WinformDemo。 BMap.NET 对百度地图Web Service API 的一...

百度地图绘制行驶轨迹、折线上添加箭头、修改地图底色

页面代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="initial...

高德地图实现地址检索获取结果列表和坐标

高德开放平台http://lbs.amap.com/api/javascript-api/summary/ 之前使用百度地图API实现地址检索功能,获取检索结果并显示到我们自定义的列表中http://www.cnblogs.com/fozero/p/5924210.html 这里我们换成高德地图同样实现跟之前一样的功能,高德跟百度地图API还是有很大的区别...

【07】覆盖物(百度地图覆盖物笔记)

【07】覆盖物 地图覆盖物概述 所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线和多边形和圆)、信息窗口等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。 地图API提供了如下几种覆盖物: Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法。 Marker:标注表示地图上的点,可自定义标注...