骑行应用开发《五》百度地图定位

百度地图定位算是比较简单的,用了百度地图官网的api,jar包,还有例子,在上面修修改改就可以了,我这里只有一个activity,代码有注释

package zoombigimage.com.mokeride;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.baidu.android.common.logging.Log;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;

import zoombigimage.com.mokeride.uitl.OrientationListener;

public class MyLocationActivity extends Activity implements View.OnClickListener, BDLocationListener, OrientationListener.OnOrientationListener {

    private MapView mMapView = null;
    private TextView mMapNormal;
    private TextView mMapSate;
    private BaiduMap mBaiduMap;
    private BitmapDescriptor mCurrentMarker;
    /**
     * 当前定位的模式
     */
    private MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
    private LocationClient mLocationClient;
    private double mCurrentLongitude;
    private double mCurrentLantitude;
    private boolean isFristLocation = true;
    private OrientationListener mOrientationListener;
    private int mXDirection;
    private float mCurrentAccracy;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_my_location);
        initMyLocation();
        initOritationListener();
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mMapNormal = (TextView) findViewById(R.id.normal);
        mMapSate = (TextView) findViewById(R.id.satellite);
        mMapNormal.setOnClickListener(this);
        mMapSate.setOnClickListener(this);
        mBaiduMap = mMapView.getMap();
        //普通地图
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        //开启交通图
        mBaiduMap.setTrafficEnabled(true);

        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(mBaiduMap.getMaxZoomLevel()).build()));
    }

    private void initMyLocation() {
        // 定位初始化
        mLocationClient = new LocationClient(getApplicationContext());
        mLocationClient.registerLocationListener(this);
        // 设置定位的相关配置
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);// 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(10000); //设置发起定位请求的间隔时间为5000ms
        mLocationClient.setLocOption(option);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mBaiduMap.setMyLocationEnabled(false);
        mLocationClient.unRegisterLocationListener(this);
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        if (mMapView != null) {

            mMapView.onResume();
        }
    }

    @Override
    protected void onStop() {
        mLocationClient.stop();
        mOrientationListener.stop();
        super.onStop();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }

    @Override
    protected void onStart() {
        // 开启图层定位
        mBaiduMap.setMyLocationEnabled(true);
        if (!mLocationClient.isStarted()) {
            mLocationClient.start();
        }
        mOrientationListener.start();
        super.onStart();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.normal:
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
                break;
            case R.id.satellite:
                //卫星地图
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
                break;
        }

        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(mBaiduMap.getMaxZoomLevel()).build()));
    }

    @Override
    public void onReceiveLocation(BDLocation location) {
        //开启定位图层
        mBaiduMap.setMyLocationEnabled(true);
        mCurrentAccracy = location.getRadius();
        MyLocationData locData = new MyLocationData.Builder()
                .accuracy(location.getRadius())
                // 此处设置开发者获取到的方向信息,顺时针0-360
                .direction(100).latitude(location.getLatitude())
                .longitude(location.getLongitude()).build();
        // 设置定位数据
        mBaiduMap.setMyLocationData(locData);
        mCurrentLantitude = location.getLatitude();
        mCurrentLongitude = location.getLongitude();
        // 设置定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标)
        mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.ihz);
        MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker);
        mBaiduMap.setMyLocationConfigeration(config);

        // 第一次定位时,将地图位置移动到当前位置

        if (isFristLocation) {
            isFristLocation = false;
            LatLng ll = new LatLng(location.getLatitude(),
                    location.getLongitude());
            MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
            mBaiduMap.animateMapStatus(u);
        }
    }


    /**
     * 初始化方向传感器
     */
    private void initOritationListener() {
        mOrientationListener = new OrientationListener(getApplicationContext());
        mOrientationListener.setOnOrientationListener(new OrientationListener.OnOrientationListener() {
            @Override
            public void onOrientationChanged(float x) {
                mXDirection = (int) x;
                Log.e("initOritationListener","initOritationListener === " + mXDirection);

                // 构造定位数据
                MyLocationData locData = new MyLocationData.Builder()
                        .accuracy(mCurrentAccracy)
                        // 此处设置开发者获取到的方向信息,顺时针0-360
                        .direction(mXDirection)
                        .latitude(mCurrentLantitude)
                        .longitude(mCurrentLongitude).build();
                // 设置定位数据
                mBaiduMap.setMyLocationData(locData);
                // 设置自定义图标
                BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.oritention);
                MyLocationConfiguration config = new MyLocationConfiguration(
                        mCurrentMode, true, mCurrentMarker);
                mBaiduMap.setMyLocationConfigeration(config);

            }
        });


    }

    @Override
    public void onOrientationChanged(float x) {
    }
}



<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    >

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:id="@+id/normal"
            android:text="街道视图"
            android:padding="10dp"
            android:layout_marginRight="10dp"
            android:background="#96325874"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/satellite"
            android:text="卫星视图"
            android:padding="10dp"
            android:background="#96325874"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>


</FrameLayout>

我加上了一个方向传感器,值得注意的是定位时间不要过于频繁,我一般都是四到六秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值