百度地图的集成定位与路径规划

本文通过代码展示了如何在Android应用中集成百度地图,实现定位功能和路径规划。首先在XML和代码中配置基础设置,接着在baseActivity初始化百度SDK。LocationActivity继承baseActivity并添加异常监听,同时介绍了火星坐标偏移量的获取方法。提供了完整的demo下载链接供开发者参考,但需自行申请百度API key。
摘要由CSDN通过智能技术生成

不说了直接上代码

**1.在配置文件中**
<!-- 百度地图的权限 -->
    <!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
    <!-- 用于读取手机当前的状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <!-- 访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    </uses-permission>
    <!--在application配置服务与key-->
    <!-- 百度地图所用的key -->
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="x00wfDGOo7RRpc8jaIoRwGDCRrZIv5lL" />
        <!-- 百度地图所用的服务 -->
        <!-- 另注:android:enabled="true" 要注意了  需要定位是 此处的参数为true  若不定位则无所谓 -->
        <service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
        </service>

2.在xml中

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

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

3.在代码中

  • 定位界面(主要代码)
    – 如果看不清楚有demo可以自行下载(下载后需要更改key值 在百度API官网申请自己的key)

这是baseActivity做了一些对百度sdk的初始化

private MyReceiver receiver;
    public MapView bmapView;
    public BaiduMap baiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initSDK();
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(com.example.mapdamo.R.layout.map);
        bmapView = (MapView) findViewById(R.id.bmapView);
        baiduMap = bmapView.getMap();
        initMap();
    }
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(receiver);
            bmapView.onDestroy();
        }

        @Override
        protected void onResume() {
            super.onResume();
            bmapView.onResume();

        }


        @Override
        protected void onPause() {
            super.onPause();
            bmapView.onPause();
        }
    public abstract void initMap();

    private void initSDK() {
        SDKInitializer.initialize(getApplicationContext());
        receiver = new MyReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
        filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
        registerReceiver(receiver, filter);

    }

    class MyReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR
                    .equals(intent.getAction())) {
            }
            if (SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR
                    .equals(intent.getAction())) {
            }

        }

    }

这是LocationActivity继承自baseActivity

public void initMap() {
        //建立定位对象
        loClient = new LocationClient(getApplicationContext());
        //初始化定位
        initLocation();
        //设置监听
        loClient.registerLocationListener(myListener);
        //开始定位
        if (!loClient.isStarted()) {
            loClient.start();
        }
    }

    /**
     * 设置定位参数
     */
    private void initLocation() {
        // 设置定位请求参数
        LocationClientOption option = new LocationClientOption();
        // 设置定位精度
        option.setLocationMode(LocationMode.Hight_Accuracy);
        // 设置经纬度格式
        option.setCoorType("bd09ll");
        // 设置请求间隔
        option.setScanSpan(5000);
        // 设置返回数据包括地址信息
        option.setIsNeedAddress(true);
        // 设置返回数据包括机头方向
        option.setNeedDeviceDirect(true);
        // 设置参数
        loClient.setLocOption(option);
        // 开启定位
        baiduMap.setMyLocationEnabled(true);
        // 更改地图的缩放级别 3-19
        MapStatusUpdate mapStatusUpdate2 = MapStatusUpdateFactory.zoomTo(17.0f);
        baiduMap.animateMapStatus(mapStatusUpdate2);
    }

    /**
     * 接受定位后返回的信息
     * 
     * @author xu-pc
     *
     */
    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            //得到返回码
            int i = bdLocation.getLocType();
            Log.i("123", "返回码是"+i);
            //拿到偏移量
            MyOrientationListener myOrientationListener = new MyOrientationListener(
                    LocationActivity.this);
            myOrientationListener
                    .setOnOrientationListener(new OnOrientationListener() {
                        @Override
                        public void onOrientationChanged(float x) {
                            mCurrentX = x;//偏移量
                        }
                    });
            baiduMap.setMyLocationData(new MyLocationData.Builder()
                    .direction(mCurrentX).accuracy(bdLocation.getRadius())
                    .latitude(bdLocation.getLatitude())
                    .longitude(bdLocation.getLongitude()).build());
            Log.e("123", "经度:" + bdLocation.getLatitude());
            Log.e("123", "纬度:" + bdLocation.getLongitude()); 
            //移动到当前位置
            centerToMyLocation(bdLocation.getLatitude(),
                    bdLocation.getLongitude());

        }

    }

    /**
     * 定位到所在位置
     * 
     * @param mLongtitude
     * @param mLatitude
     */
    private void centerToMyLocation(double mLatitude, double mLongtitude) {
        latLng = new LatLng(mLatitude, mLongtitude);
        msu = MapStatusUpdateFactory.newLatLng(latLng);//
        baiduMap.animateMapStatus(msu);
    }

    /**
     * 退出时停止定位
     */
    @Override
    protected void onStop() {

        super.onStop();
        loClient.stop();
        // 关闭定位
        baiduMap.setMyLocationEnabled(false);
    }

这是关于设置广播监听地图的异常


package com.example.mapdamo.uitls;

import com.baidu.mapapi.SDKInitializer;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
/**
 *  设置广播监听地图的异常
 * @author xu-pc
 *
 */
public class BaiduReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // 网路异常
        if (SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR
                .equals(intent.getAction())) {
            Log.i("123", "网路异常");
        }
        // 权限异常
        if (SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR
                .equals(intent.getAction())) {
            Log.i("123", "权限异常");
        }

    }

}

这是关于火星坐标进行偏移量的获取(在LocationActivity用到)

package com.example.mapdamo.uitls;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class MyOrientationListener implements SensorEventListener
{
    private SensorManager mSensorManager;
    private Context mContext;
    private Sensor mSensor;
    private float lastX;

    public MyOrientationListener(Context context)
    {
        this.mContext = context;
    }

    @SuppressWarnings("deprecation")
    public void start()
    {
        mSensorManager = (SensorManager) mContext
                .getSystemService(Context.SENSOR_SERVICE);
        if (mSensorManager != null)
        {
            mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
        }

        if (mSensor != null)
        {
            mSensorManager.registerListener(this, mSensor,
                    SensorManager.SENSOR_DELAY_UI);
        }
    }

    public void stop()
    {
        mSensorManager.unregisterListener(this);
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1)
    {
        // TODO Auto-generated method stub

    }

    @SuppressWarnings(
    { "deprecation" })
    @Override
    public void onSensorChanged(SensorEvent event)
    {
        if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)
        {
            float x = event.values[SensorManager.DATA_X];

            if (Math.abs(x - lastX) > 1.0)
            {
                if (mOnOrientationListener != null)
                {
                    mOnOrientationListener.onOrientationChanged(x);
                }
            }

            lastX = x;

        }
    }

    private OnOrientationListener mOnOrientationListener;

    public void setOnOrientationListener(
            OnOrientationListener mOnOrientationListener)
    {
        this.mOnOrientationListener = mOnOrientationListener;
    }

    public interface OnOrientationListener
    {
        void onOrientationChanged(float x);
    }

}

下面是demo的连接

百度地图定位与路径规划下载地址
百度地图官方demo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值