百度地图的使用

百度地图的使用

API地址 http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_2_0/index.html

百度地图平台 http://lbsyun.baidu.com/

准备工作

  1. 获取API Key

  2. 建立工程

  3. 添加地图引擎到android工程

  4. 添加权限

    <!-- 这个权限用于进行网络定位-->
       <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
       <!-- 这个权限用于访问GPS定位-->
       <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
       <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
       <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
       <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
       <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
       <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
       <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
       <!-- 用于读取手机当前的状态-->
       <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
       <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
       <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
       <!-- 访问网络,网络定位需要上网-->
       <uses-permission android:name="android.permission.INTERNET" />
       <!-- SD卡读取权限,用户写入离线定位数据-->
       <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
       <!--允许应用读取低级别的系统日志文件 -->
       <uses-permission android:name="android.permission.READ_LOGS"/>

  5. 初始化地图引擎

    1. 在清单文件中,在中的添加key

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

    2. 必须在setContentView之前,校验key。

      注意:在SDK各功能组件使用之前都需要调用

      SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中

      public class MainActivity extends Activity {  
        @Override  
        protected void onCreate(Bundle savedInstanceState) {  
            super.onCreate(savedInstanceState);   
             initSdk();
            setContentView(R.layout.activity_main);  
           //获取地图控件引用  
            mMapView = (MapView) findViewById(R.id.bmapView);
        }  
      }

      initSdk()

      //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
      //注意该方法要再setContentView方法之前实现  
      SDKInitializer.initialize(getApplicationContext());
      
      //注册广播接收者,接受校验key的通知
      IntentFilter filter = new IntentFilter();
            filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
            filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
            registerReceiver(new MyReceiver(), filter);

      广播接收者 MyReceiver

      //广播接收者
        class MyReceiver extends BroadcastReceiver {
      
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
                    Toast.makeText(context, "网络出问题了", Toast.LENGTH_SHORT).show();
                } else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
                    Toast.makeText(context, "key校验失败", Toast.LENGTH_SHORT).show();
                }
            }
        }

  6. 引入布局 com.baidu.mapapi.MapView

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

  7. 初始化地图设置

    在setContentView(R.layout.hello)之后,初始化地图设置

    initSdk();//初始化SDK
    setContentView(R.layout.hello);
    init();//初始化地图设置

    init()

    init(){
     //去掉缩放按钮
     mapView.showZoomControls(false);
     //去掉标尺
     mapView.showScaleControl(false);
     //设置缩放级别
     //2.X版本 3~19级  3D效果,优化占用空间
     //1.X版本 3~18级
     // BaiduMap 用于控制MapView 移动、旋转、缩放
     BaiduMap baiduMap = mMapView.getMap();
     baiduMap.setMapStatus(MapStatusUpdataFactory.zoomTo(19));//默认是1级
     //设置中心点,参数是经纬度
     baiduMap.setMapStatus(MapStatusUpdataFactory.newLatLng(new LatLng(111111,1111111)));
    
    }

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

地图相关操作

基本操作

  1. 放大

    baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
  2. 缩小

    baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
  3. 旋转

    平面旋转,以中间为中心旋转,范围0~360度

    //设置平面旋转
    //获取当前地图对象的旋转角度
    float rotate = baiduMap.getMapStatus().rotate;
    //设置对象旋转的角度
    MapStatus rotateStatus = new MapStatus.Builder().rotate(rotate + 30).build();
    //将设置的角度设置给地图对象
    baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(rotateStatus));

    俯角旋转 ,范围0~45度

    //设置俯角旋转
    //获取当前地图对象的俯角
    float overlook = baiduMap.getMapStatus().overlook;
    //设置对象旋转的角度
    MapStatus overlookStatus = new MapStatus.Builder().overlook(overlook -15).build();
    //将设置的俯角设置给地图对象
    baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(overlookStatus));
  4. 移动

    baiduMap.animateMapStatus(MapStatusUpdataFactory.newLatLng(new LatLng(22222222,22222222)));

图层分类

  1. 底图

    //展示底图
    baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  2. 卫星图

    //展示卫星图
    baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
  3. 交通图

    //展示交通图
    baiduMap.setTrafficEnabled(true);

覆盖物

–本地覆盖物的抽象基类:OverlayOptions(核心类)

–圆形覆盖物: CircleOptions

创建圆形: CircleOptions() 。 
设置圆心坐标:center(LatLng center)
设置圆填充颜色:fillColor(int color) ,16进制如:#00ff0000 透明、红、绿、蓝
设置圆半径:radius(int radius) 
设置圆边框信息:stroke(Stroke stroke)
设置圆是否可见:visible(boolean visible)
设置圆zIndex(显示优先级)信息:zIndex(int zIndex),值越大优先级越高

–文字覆盖物: TextOptions

创建文字覆盖物对象, TextOptions()
设置文字覆盖物地理坐标:position(LatLng position)
设置文字覆盖物旋转角度,逆时针:rotate(float rotate)
设置文字覆盖物的文字内容:text(java.lang.String text)
设置文字覆盖物字体:typeface(Typeface typeface)
设置文字覆盖物可见性:visible(boolean visible)
设置文字覆盖物 zIndex:zIndex(int zIndex)
设置文字覆盖物对齐方式,默认居中对齐:align(int alignX, int alignY)
设置文字覆盖物背景颜色:bgColor(int bgColor)
设置文字覆盖物额外信息:extraInfo(Bundle extraInfo)
设置文字覆盖物字体颜色,默认黑色:fontColor(int color)
设置文字覆盖物字体大小:fontSize(int size)

–marker覆盖物: MarkerOptions

某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类。或者用来标记位置某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类。或者用来标记位置

设置 marker 覆盖物的位置坐标:position(LatLng position)
设置 marker 覆盖物的标题:title(java.lang.String title)
设置 Marker 覆盖物的图标:icon(BitmapDescriptor icon)
设置 marker 是否允许拖拽,默认不可拖拽:draggable(boolean draggable)

–圆点覆盖物:DotOptions

–ground覆盖物:GroundOverlayOptions

–多边形覆盖物:PolygonOptions

–折线覆盖物:PolylineOptions

–弧线覆盖物:ArcOptions

  1. 创建一个类BaseActivity继承基类Activity,初始化地图引擎(也可以不抽取父类,直接在第二步中初始化引擎)

    public class BaseActivity extends Activity {
    
       @InjectView(R.id.mapview)
       MapView mapview;
    
       LatLng latLng = new LatLng(39.995685, 116.364061);
       private BaiduMap baiduMap;
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           //初始化引擎
           SDKInitializer.initialize(getApplicationContext());
           setContentView(R.layout.activity_common);
           ButterKnife.inject(this);
    
           baiduMap = mapview.getMap();
           baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(latLng));
    
       }
    
       //管理地图对象的生命周期
       @Override
       protected void onResume() {
           super.onResume();
           mapview.onResume();
       }
    
       @Override
       protected void onPause() {
           super.onPause();
           mapview.onPause();
       }
    
       @Override
       protected void onDestroy() {
           super.onDestroy();
           mapview.onDestroy();
       }
    }
  2. 创建类继承BaseActivity

    public class MarkerOptionsDemo extends BaseActivity{
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           ondraw();
       }

  3. draw()

    private void draw(){
     MarkerOptions option = new MarkerOption();//创建覆盖物对象
     ...//覆盖物的其他设置
     baiduMap.addOverlay(option);//将覆盖物设置在地图上
    }

搜索

核心类: PoiSearch和OnGetPoiSearchResultListener

         RoutePlanSearch和OnGetRoutePlanResultListener

实现思路

–初始化PoiSearch类,通过setOnGetPoiSearchResultListener方法注册搜索结果的监听对象OnGetPoiSearchResultListener ,实现异步搜索服务。

–通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。

–注意, OnGetPoiSearchResultListener只支持一个,以最后一次设置为准

结合覆盖物展示搜索

–本地搜索覆盖物:PoiOverlay

–驾车路线覆盖物:DrivingRouteOverlay

–步行路线覆盖物:WalkingRouteOverlay

–换乘路线覆盖物:TransitOverlay

  • POI(Point of interest兴趣点) 三种搜索方式
    • 根据范围和检索词发起范围搜索 searchInBound

    • 周边检索 searchNearby

    • 城市poi检索 searchInCity

    • poi 详细信息检索 searchPoiDetail

    1. 创建一个类继承BaseActivity,创建search()方法;
    public class SearchInBoundDemo extends BaseActivity{
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
    
           search();
       }
    1. search();
    private void search() {
           //创建PoiSerch实例
           PoiSearch poiSearch = PoiSearch.newInstance();
           //设置poi检索监听者
           poiSearch.setOnGetPoiSearchResultListener(new MyListener());
    
           //创建范围搜索PoiBoundSearchOption对象
           PoiBoundSearchOption option = new PoiBoundSearchOption();
           //设置搜索内容
           option.keyword("公交");
    
           //设置搜索范围对象
           LatLngBounds bound = new LatLngBounds.Builder()
                   .include(new LatLng(40.107704,116.375825)) //设置搜索范围坐标
                   .include(new LatLng(40.103565,116.370292)) //设置搜索范围坐标
                   .build();                                  //创建搜索范围对象
    
           //设置搜索范围
           option.bound(bound);
    
           //将搜索设置赋给PoiSearch对象
           poiSearch.searchInBound(option);
       }
    
    1. 返回结果

      class MyListener implements OnGetPoiSearchRestultListener{
      
           //poi 查询结果回调
           @Override
           public void onGetPoiResult(PoiResult poiResult) {
               //如果没有数据,弹出吐司
               if (poiResult == null || poiResult.error.equals("SearchResult.ERRORNO.RESULT_NOT_FOUND")) {
                   Toast.makeText(SearchInBoundDemo.this, "没有数据", Toast.LENGTH_SHORT).show();
                   return;
               }
      
               //创建覆盖物对象
               MyPoiOverLay poiOverLay = new MyPoiOverLay(baiduMap);
               //将事件传递给覆盖物
               baiduMap.setOnMarkerClickListener(poiOverLay);
               //设置数据
               poiOverLay.setData(poiResult);
               //展示到地图
               poiOverLay.addToMap();
      
           }
      
           //poi 详情查询结果回调
           @Override
           public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
      
           }
      }

    2. 创建覆盖物类,重写onPoiClick()方法,设置点击事件

         private class MyPoiOverLay extends PoiOverlay{
      
             public MyPoiOverLay(BaiduMap baiduMap) {
                 super(baiduMap);
             }
      
             //设置点击事件
             @Override
             public boolean onPoiClick(int i) {
                 //根据当前点击位置,获取当前覆盖物
                 PoiInfo poiInfo = getPoiResult().getAllPoi().get(i);
                 //弹出吐司提示
                 Toast.makeText(SearchInBoundDemo.this, poiInfo.address, Toast.LENGTH_SHORT).show();
                 return true;
             }
         }
  • 路线搜索(驾车为例)
    1. 创建一个类继承BaseActivity,在onCreate方法中创建search()方法;

      “`java
      public class SearchInBoundDemo extends BaseActivity{
      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

            search();
        }
      

      “`

    2. search();

      “`java
      private void search() {

            //创建路线搜索对象
            RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();
            //设置检索监听者
            routePlanSearch.setOnGetRoutePlanResultListener(new MyListener());
      
            //创建驾车路线规划参数
            DrivingRoutePlanOption option = new DrivingRoutePlanOption();
            //设置驾车路线策略
            option.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_FEE_FIRST);
      

      // ECAR_AVOID_JAM
      // 驾车策略: 躲避拥堵
      // ECAR_DIS_FIRST
      // 驾乘检索策略常量:最短距离
      // ECAR_FEE_FIRST
      // 驾乘检索策略常量:较少费用
      // ECAR_TIME_FIRST
      // 驾乘检索策略常量:时间优先

            //设置出行开始节点
            PlanNode start = PlanNode.withLocation(latLng);
            option.from(start);
            //设置结束节点
            PlanNode end = PlanNode.withCityNameAndPlaceName("北京", "天安门");
            option.to(end);
      
            //设置途经点
            //创建集合,用于存储途经点
            ArrayList<PlanNode> list = new ArrayList<>();
            list.add(PlanNode.withLocation(new LatLng(39.917661,116.215064)));
            option.passBy(list);
      
            //将参数设置给路线搜索对象
            routePlanSearch.drivingSearch(option);
      
        }
      

      “`

    3. 搜索结果处理

      “`java
      private class MyListener implements OnGetRoutePlanResultListener {
      //步行路线结果
      @Override
      public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {

           }
      
           //公交换乘路线结果
           @Override
           public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
      
           }
      
           //驾车路线结果
           @Override
           public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
      
               if(drivingRouteResult==null||drivingRouteResult.error.equals(SearchResult.ERRORNO.RESULT_NOT_FOUND)){
                   Toast.makeText(DrivingSearchDemo.this, "没有数据", Toast.LENGTH_SHORT).show();
                   return;
               }
               DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(baiduMap);
               // 给覆盖物传递事件
               baiduMap.setOnMarkerClickListener(drivingRouteOverlay);
               drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(0));
               drivingRouteOverlay.addToMap();
               drivingRouteOverlay.zoomToSpan();
           }
       }
      

      “`

定位

  1. 配置清单文件

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

    public class MyLocationDemo extends BaseActivity{
    
       public LocationClient mLocationClient = null;
       public BDLocationListener myListener = new MyListener();
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
    
           location();
       }
    
       private void location() {
           //创建定位服务客户端对象
           mLocationClient = new LocationClient(this);
           //注册定位监听函数
           mLocationClient.registerLocationListener(myListener);
    
           //配置定位参数
           LocationClientOption option = new LocationClientOption();
    
           //设置定位模式,可选,高精度,低功耗,仅设备,默认高精度
           option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
           //设置坐标类型
           option.setCoorType("bd09ll");
           //设置扫描间隔,可选,默认0,即仅定位一次
           int span = 1000;
           option.setScanSpan(span);
           //设置是否需要地址信息,默认为无地址
           option.setIsNeedAddress(true);
           //可选,默认false,设置是否使用gps
           option.setOpenGps(true);
           //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
           option.setLocationNotify(true);
           //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
           option.setIgnoreKillProcess(false);
           //可选,默认false,设置是否收集CRASH信息,默认收集
           option.SetIgnoreCacheException(false);
    
           //将参数配置设置给定位服务端
           mLocationClient.setLocOption(option);
    
           //设置定位的展示模式
           BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
           MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, icon);
           baiduMap.setMyLocationConfigeration(config);

    }

    @Override
    protected void onStart() {
    super.onStart();
    //开始定位
    mLocationClient.start();
    }

    @Override
    protected void onPause() {
    super.onPause();
    //停止定位
    mLocationClient.stop();
    }

    private class MyListener implements BDLocationListener {
    @Override
    public void onReceiveLocation(BDLocation bdLocation) {
    //展示定位结果
    MyLocationData data = new MyLocationData.Builder()
    .latitude(bdLocation.getLatitude())
    .longitude(bdLocation.getLongitude())
    .build();

           // 打开定位图层
           baiduMap.setMyLocationEnabled(true);
           //设置定位数据, 只有先允许定位图层后设置数据才会生效
           baiduMap.setMyLocationData(data);
    
       }
    

    }
    }public class MyLocationDemo extends BaseActivity{

    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyListener();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

       location();
    

    }

    private void location() {
    //创建定位服务客户端对象
    mLocationClient = new LocationClient(this);
    //注册定位监听函数
    mLocationClient.registerLocationListener(myListener);

       //配置定位参数
       LocationClientOption option = new LocationClientOption();
    
       //设置定位模式,可选,高精度,低功耗,仅设备,默认高精度
       option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
       //设置坐标类型
       option.setCoorType("bd09ll");
       //设置扫描间隔,可选,默认0,即仅定位一次
       int span = 1000;
       option.setScanSpan(span);
       //设置是否需要地址信息,默认为无地址
       option.setIsNeedAddress(true);
       //可选,默认false,设置是否使用gps
       option.setOpenGps(true);
       //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
       option.setLocationNotify(true);
       //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
       option.setIgnoreKillProcess(false);
       //可选,默认false,设置是否收集CRASH信息,默认收集
       option.SetIgnoreCacheException(false);
    
       //将参数配置设置给定位服务端
       mLocationClient.setLocOption(option);
    
       //设置定位的展示模式
       BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
       MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, icon);
       baiduMap.setMyLocationConfigeration(config);
    

    }

    @Override
    protected void onStart() {
    super.onStart();
    //开始定位
    mLocationClient.start();
    }

    @Override
    protected void onPause() {
    super.onPause();
    //停止定位
    mLocationClient.stop();
    }

    private class MyListener implements BDLocationListener {
    @Override
    public void onReceiveLocation(BDLocation bdLocation) {
    //展示定位结果
    MyLocationData data = new MyLocationData.Builder()
    .latitude(bdLocation.getLatitude())
    .longitude(bdLocation.getLongitude())
    .build();

           // 打开定位图层
           baiduMap.setMyLocationEnabled(true);
           //设置定位数据, 只有先允许定位图层后设置数据才会生效
           baiduMap.setMyLocationData(data);
    
       }
    

    }
    }

    
    
    
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值