百度地图

作者: 夜沐下的星雨 | 来源:发表于2020-06-11 16:24 被阅读0次

三方的通用流程

1、注册、创建应用、获取appkey
2、下载SDK并导入到项目中
3、配置清单文件、在application初始化数据
4、代码处理

百度地图流程:

1.登录帐号且创建应用:

如果没有百度地图开发者帐号,需要申请。然后登陆后,找到控制台,创建一个应用,获取SHA-1串号,最终获取appkey

创建应用:
找到应用管理

获取SHA1:

SHA1码 发布版和开发版
发布版和开发版,这两个建议都填写上,因为平时是使用开发版,到上线的使用发布版。

可以参考:http://lbsyun.baidu.com/index.php?title=FAQ/SHA1

a.通过androidstudio 命令获取SHA1:

Androidstudio顶部菜单栏 view
找到Terminal ,然后输入以下命令
keytool -list -v -keystore xxxxxxxx.android\debug.keystore -alias androiddebugkey
其中xxxxxxxx.android\debug.keystore 是自己的studio默认签名。如:C:\Users\chen.android\debug.keystore
输入以后会提示输入密码:默认密码是android
最后如下:


最后提交:记录appkey。

b.通过androidstudio gradle 获取SHA1:

右上角有个Gradle菜单栏,点击打开菜单,找到自己的项目如testmap,找到signingReport,双击执行。就会生成SHA1.这是最快捷的方式。


c.自己电脑黑窗口(命令控制台 :keytool)

keytool -list -v -keystore xxxxxxxx.android\debug.keystore -alias androiddebugkey
其中xxxxxxxx.android\debug.keystore 是自己的studio默认签名。如:C:\Users\chen.android\debug.keystore
输入以后会提示输入密码:默认密码是android



2.下载sdk和案例:

下载SDK

3.配置:

A.配置jar包 和so:


B.在app目录下的build.gradle文件中android块中配置sourceSets标签,如果没有使用该标签则新增,详细配置代码如下:
sourceSets {
           main {
               jniLibs.srcDir 'libs'
           }
    }

C. 配置AndroidManifest.xml文件:
在<application>中加入如下代码配置开发密钥(AK):

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="开发者 key" />  

  <service android:name="com.baidu.location.f"
        android:enabled="true"
        android:process=":remote"/>
</application>

开发者 key 是自己创建的应用:


在<application/>外部添加如下权限声明:(依赖)
<!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

注:自Android6.0起部分权限的使用需要开发者在代码中动态申请。

D.新建一个自定义的Application,在其onCreate方法中完成SDK的初始化。示例代码如下:

  //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        SDKInitializer.initialize(this);
        //自4.3.0起,百度地图SDK所有接口均支持百度坐标和国测局坐标,用此方法设置您使用的坐标类型.
        //包括BD09LL和GCJ02两种坐标,默认是BD09LL坐标。
        SDKInitializer.setCoordType(CoordType.BD09LL);

在AndroidManifest.xml文件中声明该Application


E.创建地图Activity,管理MapView生命周期
注意:在项目中使用地图的时候要特别注意合理地管理地图生命周期,这非常重要。

以下示例代码简述对地图生命周期的管理:

public class MainActivity extends Activity {  
    private MapView mMapView = null;  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.activity_main);  
        //获取地图控件引用  
        mMapView = (MapView) findViewById(R.id.bmapView);  
    }  
    @Override  
    protected void onResume() {  
       super.onResume();  
       //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
       mMapView.onResume();  
    }  
    @Override  
    protected void onPause() {  
      super.onPause();  
      //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
      mMapView.onPause();  
    } 
    @Override  
    protected void onDestroy() {  
      super.onDestroy();  
      //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
      mMapView.onDestroy();  
    }  
}

通过添加View显示地图
百度地图SDK支持不用通过layout文件中添加MapView控件,直接在Java代码中添加MapView的方式来展示地图,示例如下:

1创建MapView对象
MapView mapView = new MapView(this);
2添加MapView对象
setContentView(mapView);

另外,在Java代码中添加MapView的方式支持通过BaiduMapOptions对象根据需求构造包含特定地图状态类型和控件显示状态的MapView对象。示例如下:

1定义BaiduMapOptions对象
BaiduMapOptions options = new BaiduMapOptions();
2设置需要的状态
//设置地图模式为卫星地图
options.mapType(BaiduMap.MAP_TYPE_SATELLITE);
3创建MapView对象
MapView mapView = new MapView(this, options);
4添加MapView对象
setContentView(mapView);

地图类型:

       BaiduMap baiduMap = mvMap.getMap();
        //普通地图 ,baiduMap是地图控制器对象
        baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        //卫星地图
        baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
        //空白地图
        baiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
        //开启交通图
        baiduMap.setTrafficEnabled(true);
        //开启热力图
        baiduMap.setBaiduHeatMapEnabled(true);
        //开启地图的定位图层
        baiduMap.setMyLocationEnabled(true);

定位:
配置AndroidManifest.xml文件
加入如下权限使用声明依赖


<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        mMapView = (MapView) findViewById(R.id.bmapView);  
        BaiduMap baiduMap = mvMap.getMap();
        开启地图的定位图层
        mBaiduMap.setMyLocationEnabled(true);
        initLocation();
    }
构造地图数据
我们通过继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据,并将其传给MapView。
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);
    }
}
通过LocationClient发起定位
 private void initLocation() {
      //定位初始化
      mLocationClient = new LocationClient(this);

    //通过LocationClientOption设置LocationClient相关参数
    LocationClientOption option = new LocationClientOption();
    option.setOpenGps(true); // 打开gps
    option.setCoorType("bd09ll"); // 设置坐标类型
    option.setScanSpan(1000);

    //设置locationClientOption
    mLocationClient.setLocOption(option);

    //注册LocationListener监听器
    MyLocationListener myLocationListener = new MyLocationListener();
    mLocationClient.registerLocationListener(myLocationListener);
    //开启地图定位图层
    mLocationClient.start();
}

自己的定位

 //如果已经定位了,只需要将地图界面移动到用户所在位置即可
        //改变地图手势的中心点(地图的中心点)
        //mLocation 是定位时获取到的用户位置信息对象
        latitude = mLocation.getLatitude();
        mLatitude.setText("纬度:"+ latitude);
        longitude = mLocation.getLongitude();
        mLongitude.setText("经度:"+ longitude);
        LatLng latLng = new LatLng(latitude, longitude);
        //改变地图手势中心点
        baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(latLng));

覆盖物:

   //获取当前地图屏幕中心点的坐标
        LatLng target = baiduMap.getMapStatus().target;
        //定义maker 坐标点
        LatLng point = new LatLng(target.latitude, target.longitude);
        //构建marker图标
        BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.btn_icon_read);
        //构建markerOption,用于在地图上添di加marker
        MarkerOptions markerOptions = new MarkerOptions().position(point).icon(bitmapDescriptor);
        //在地图上添加marker,并显示
        baiduMap.addOverlay(markerOptions);

POI检索

     //创建POI检索实例
        mPoiSearch = PoiSearch.newInstance();
        //创建POI检索监听器
        OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    baiduMap.clear();

                    //创建PoiOverlay对象
                    PoiOverlay poiOverlay = new PoiOverlay(baiduMap);

                    //设置Poi检索数据
                    poiOverlay.setData(poiResult);

                    //将poiOverlay添加至地图并缩放至合适级别
                    poiOverlay.addToMap();
                    poiOverlay.zoomToSpan();
                }
            }
            @Override
            public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {

            }
            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

            }
            //废弃
            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

            }
        };

        //设置检索监听器
        mPoiSearch.setOnGetPoiSearchResultListener(listener);
        /**
         *  PoiCiySearchOption 设置检索属性
         *  city 检索城市
         *  keyword 检索内容关键字
         *  pageNum 分页页码
         */
      /*  mPoiSearch.searchInCity(new PoiCitySearchOption()
                .city("北京") //必填
                .keyword("美食") //必填
                .pageNum(10));*/


        /**
         * POI周边检索
         * 以天安门为中心,搜索半径100米以内的餐厅
         */
       /* mPoiSearch.searchNearby(new PoiNearbySearchOption()
                .location(new LatLng(39.915446, 116.403869))
                .radius(10000)
                .keyword("餐厅")
                .pageNum(10));*/


        /**
         * POI区域检索(矩形区域检索)
         * 设置矩形检索区域
         */
        LatLngBounds searchBounds = new LatLngBounds.Builder()
                .include(new LatLng( 39.92235, 116.380338 ))
                .include(new LatLng( 39.947246, 116.414977))
                .build();

        /**
         * 在searchBounds区域内检索餐厅
         */
        mPoiSearch.searchInBound(new PoiBoundSearchOption()
                .bound(searchBounds)
                .keyword("餐厅"));

PoiOverlay 要复制百度地图原代码中:

要复制:poiOverLay 和Over LayManager 到项目中


步行导航:
配置AndroidManifest.xml文件
加入如下权限使用声明

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

<uses-permission android:name="android.permission.VIBRATE"/>

<uses-permission android:name="android.permission.CAMERA" />

将assets 中的BaiduBikeNavi_Resource_v6_3_0.png 添加上才能初始化成功

        
        //1. 获取导航控制类
        
   

        b// 引擎初始化
        WalkNavigateHelper.getInstance().initNaviEngine(this, new IWEngineInitListener() {
            @Override
            public void engineInitSuccess() {
                //引擎初始化成功的回调
                routeWalkPlanWithParam();
                Log.e(TAG, "engineInitSuccess: " );
            }

            @Override
            public void engineInitFail() {
                //引擎初始化失败的回调
                Log.e(TAG, "engineInitFail: ");
            }
        });
    




    private static final String TAG = "MapActivity";
     // 2.创建routeWalkPlanWithParam方法:
    private void routeWalkPlanWithParam() {
        //起终点位置
        LatLng startPt = new LatLng(40.047416, 116.312143);
        LatLng endPt = new LatLng(40.048424, 116.313513);
        //构造WalkNaviLaunchParam
        mParam = new WalkNaviLaunchParam().stPt(startPt).endPt(endPt);
        //发起算路
        WalkNavigateHelper.getInstance().routePlanWithParams(mParam, new IWRoutePlanListener() {
            @Override
            public void onRoutePlanStart() {
                //开始算路的回调
                Log.e(TAG, "onRoutePlanStart: " );
            }

            @Override
            public void onRoutePlanSuccess() {
                //算路成功
                //跳转至诱导页面
                Intent intent = new Intent(MapActivity.this, WNaviGuideActivity.class);
                startActivity(intent);
                Log.e(TAG, "onRoutePlanSuccess: ");
            }

            @Override
            public void onRoutePlanFail(WalkRoutePlanError walkRoutePlanError) {
                //算路失败的回调
                Log.e(TAG, "onRoutePlanFail: " );
            }
        });
    }


//在清单文件声明
  <activity android:name=".WNaviGuideActivity"></activity>

//3.创建WNaviGuideActivity 必须继承Acitivty
public class WNaviGuideActivity extends Activity {

    private WalkNavigateHelper mNaviHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //获取WalkNavigateHelper实例
        try {
            mNaviHelper = WalkNavigateHelper.getInstance();
//获取诱导页面地图展示View
            View view = mNaviHelper.onCreate(WNaviGuideActivity.this);
            if (view != null) {
                setContentView(view);
            }
            mNaviHelper.startWalkNavi(WNaviGuideActivity.this);
      } catch (Exception ex) {

        }


        mNaviHelper.setWalkNaviStatusListener(new IWNaviStatusListener() {
            /**
             * 普通步行导航模式和步行AR导航模式的切换
             * 导航模式
             * @param
             * @param walkNaviModeSwitchListener 步行导航模式切换的监听器
             */
            @Override
            public void onWalkNaviModeChange(int mode, WalkNaviModeSwitchListener walkNaviModeSwitchListener) {
                mNaviHelper.switchWalkNaviMode(WNaviGuideActivity.this, mode, walkNaviModeSwitchListener);
            }

            @Override
            public void onNaviExit() {

            }
        });
        mNaviHelper.setRouteGuidanceListener(this, new IWRouteGuidanceListener() {
            //诱导图标更新
            @Override
            public void onRouteGuideIconUpdate(Drawable drawable) {

            }

            //诱导类型枚举
            @Override
            public void onRouteGuideKind(RouteGuideKind routeGuideKind) {

            }

            /**
             * 诱导信息
             * @param charSequence 第一行显示的信息,如“沿当前道路”
             * @param charSequence1  第二行显示的信息,比如“向东出发”,第二行信息也可能为空
             */
            @Override
            public void onRoadGuideTextUpdate(CharSequence charSequence, CharSequence charSequence1) {

            }

            //总的剩余距离
            @Override
            public void onRemainDistanceUpdate(CharSequence charSequence) {

            }

            //总的剩余时间
            @Override
            public void onRemainTimeUpdate(CharSequence charSequence) {

            }

            //GPS状态发生变化,来自诱导引擎的消息
            @Override
            public void onGpsStatusChange(CharSequence charSequence, Drawable drawable) {

            }

            //已经开始偏航
            @Override
            public void onRouteFarAway(CharSequence charSequence, Drawable drawable) {

            }

            //偏航规划中
            @Override
            public void onRoutePlanYawing(CharSequence charSequence, Drawable drawable) {

            }

            //重新算路成功
            @Override
            public void onReRouteComplete() {

            }

            //抵达目的地
            @Override
            public void onArriveDest() {

            }

            @Override
            public void onIndoorEnd(Message message) {

            }

            @Override
            public void onFinalEnd(Message message) {

            }

            //震动
            @Override
            public void onVibrate() {

            }

        });
    }
//要写一下三个生命周期
    @Override
    protected void onResume() {
        super.onResume();
        mNaviHelper.resume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mNaviHelper.pause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mNaviHelper.quit();
    }
}


当初始化引擎不成功要在assets 中添加BaiduBikeNavi_Resource_v6_3_0.png

路径规划:

        //创建路线规划检索实例
       RoutePlanSearch mSearch = RoutePlanSearch.newInstance();
        //创建路线规划检索结果监听器
        OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
                //创建WalkingRouteOverlay实例
                WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);
                if (walkingRouteResult.getRouteLines().size() > 0) {
                    //获取路径规划数据,(以返回的第一条数据为例)
                    //为WalkingRouteOverlay实例设置路径数据
                    overlay.setData(walkingRouteResult.getRouteLines().get(0));
                    //在地图上绘制WalkingRouteOverlay
                    overlay.addToMap();
                }
            }

            @Override
            public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {

            }

            @Override
            public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {

            }

            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {

            }

            @Override
            public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {

            }

            @Override
            public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {

            }

        };
        //设置路线规划检索监听器
        mSearch.setOnGetRoutePlanResultListener(listener);
        //准备起终点信息
        PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", "西二旗地铁站");
        PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "百度科技园");
        //发起检索
        mSearch.walkingSearch((new WalkingRoutePlanOption())
                .from(stNode)
                .to(enNode));

WalkingRouteOverlay的创建要复制百度地图原代码中:

要复制:walkingRouteOverlay到项目中


相关文章

网友评论

    本文标题:百度地图

    本文链接:https://www.haomeiwen.com/subject/hkumtktx.html