Android studio 百度地图SDK之地图定位与运动轨迹绘制

Android开发的前期准备

Android配置在百度地图SDK官网上有详细的说明。具体可以参考官网的教程,笔者觉得官网的总结的很细,笔者初学,就不耍大刀了。
以下就是官网地址:
https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak

当然,按照官网上的步骤,初学会有一些小问题,稍后会在另一篇文章中展现笔者在初学遇见的问题与解决方法。

在最起初,遇见的问题,让笔者摸不着头脑,找不到错误的原因,也搜索了很多文章,都快放弃了,还好,到后面解决了。

言归正传。

地图图层显示与定位

地图SDK提供了3种预置的地图类型,包括普通地图,卫星图,空白地图。另外提供了2种常用图层实时路况图以及百度城市热力图

可以根据自己的需求选择。笔者用的是普通地图
上代码:

// An highlighted block
public class MyMap extends AppCompatActivity {

    private MapView mMapView=null;
    LocationClient mLocationClient;
    BaiduMap mbaiduMap;
    MyLocationListener myLocationListener;
    LocationClientOption option;
    LatLng latLng;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_my_map);
        tv_1=findViewById(R.id.tv_mapmun);

        //这里是询问用户是否开启定位等权限
        List<String> permissionList = new ArrayList<>();
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        }
        if(!permissionList.isEmpty()){
            String[] permissions =permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(this, permissions, 1);
        }
        initLocation();

    }
    
    private void initLocation(){
        mMapView=findViewById(R.id.bmapView);
        mbaiduMap=mMapView.getMap();
        ppp=new ArrayList<LatLng>();


        mLocationClient=new LocationClient(this);

        if(mLocationClient != null&& !mLocationClient.isStarted()){
            mLocationClient.requestLocation();
            mLocationClient.start();
        }

        option=new LocationClientOption();
        myLocationListener=new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
        option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
        option.setOpenGps(true);
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        option.setCoorType("bd09ll");
        option.setIsNeedAddress(true);
        option.setNeedDeviceDirect(true);
        option.setScanSpan(1001);
        mLocationClient.setLocOption(option);

        mLocationClient.start();


    }
public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //mapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null){
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
    }
}

    @Override
    protected void onStart() {
        super.onStart();
        mbaiduMap.setMyLocationEnabled(true);
        if (mLocationClient.isStarted())
            mLocationClient.start();
    }

    @Override
    public void onResume() {
        super.onResume();
        mMapView.onResume();

    }

    @Override
    public void onPause() {
        super.onPause();
        mMapView.onPause();
    }

    @Override
    public void onDestroy() {

        mLocationClient.stop();
        mbaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView=null;
        super.onDestroy();
        mMapView.onDestroy();

    }


}
//地图初始化
public class DemoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.initialize(this);
        SDKInitializer.setCoordType(CoordType.BD09LL);
    }
}

以上就是实现地图的全部代码,记得打开存储权限,不然不会显示图层只有空白。完成以上步骤就可以在应用上显示自己的定位。

这是实现后的图片
在这里插入图片描述

运动轨迹的简单绘制

运动轨迹实现方法用的是:
每隔一定的时间收集当前位置的信息,把多个点连起来,绘制成轨迹展现。


 public void onReceiveLocation(BDLocation bdLocation) {
            if(bdLocation ==null||mMapView ==null){
                return;
            }
            MyLocationData locData=new MyLocationData.Builder()
                    .accuracy(bdLocation.getRadius())
                    .direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude())
                    .build();

            mbaiduMap.setMyLocationData(locData);

            if(frist){
                frist=false;
                latLng = new LatLng(bdLocation.getLatitude(),
                        bdLocation.getLongitude());
                MapStatus.Builder builder=new MapStatus.Builder();
                builder.target(latLng).zoom(18.0f);
                mbaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
     

                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
                mbaiduMap.animateMapStatus(msu);
            }


            LatLng pointsss=new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
            if(pointsss.longitude>0&&pointsss.latitude>0)
                ppp.add(pointsss);
            if(ppp.size()>=2){
                OverlayOptions mOverlay=new PolylineOptions()
                        .width(10)
                        .color(0xAAFF0000)
                        .points(ppp);
                Overlay mPolyline=(Polyline)mbaiduMap.addOverlay(mOverlay);
                mPolyline.setZIndex(3);
            }


//在日志中打印出点的位置信息,方便观察
            Log.i("MyMap",  " latitude:" + bdLocation.getLatitude()
                    + " longitude:" + bdLocation.getLongitude() + ppp.size());


        }
    }

以上就是全部的代码。

在绘制轨迹时,需要把第一个点(也就是在几内亚湾)去掉,因为系统最开始会定位到那个点,具体的原因笔者也不清楚。

希望给大家一点帮助和参考。

1


  1. 笔者初学,有很多错误,望大家指正。 ↩︎

  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值