百度地图学习笔记(Android版)

百度地图3.0开发(首先去申请应用程序的key)
 
 ------------key教验------------
  1,自定义广播
     public class SDKReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
            String s = intent.getAction();
            TextView text = (TextView) findViewById(R.id.text_Info);
            text.setTextColor(Color.RED);
            if (s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
                text.setText("key 验证出错! 请在 AndroidManifest.xml 文件中检查 key 设置");
            } else if (s
                    .equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
                text.setText("网络出错");
            }
        }
    }
  2,注册广播
        // 注册 SDK 广播监听者
        IntentFilter iFilter = new IntentFilter();
        iFilter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
        iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
        SDKReceiver  mReceiver = new SDKReceiver();
        registerReceiver(mReceiver, iFilter);// 注册

 ------------设置地图中心点------------

    LatLng p = new LatLng(22.547619, 114.109202);//中心点纬度和经度
    mMapView = new MapView(this, new BaiduMapOptions().mapStatus(new MapStatus.Builder()
        .target(p).build()));
       
       其中BaiduMapOptions:设置地图是否可以拖拽手势,旋转,指南针,地图状态(默认为天安门)等
       MapStatus:地图状态(控制中心点,缩放级别,旋转角度,俯仰角度)
       MapStatus status =new MapStatus.Builder()
            .target(p)//中心点
                        .overlook(120)//俯仰角度
                        .rotate(6.0f)//缩放大小
                        .build();
------------地图事件的监听------------
1,首先通过mapView.getMap()获取到BaiduMap(定义了地图对象的操作方法与接,地图状态和事件的监听都是通过它完成的)对象
2,通过BaiduMap的setOnXXX方法绑定各类事件;

BaiduMap还可以设置地图的模式(普通地图,卫星地图)

------------标注覆盖物------------
 
LatLng point = new LatLng(39.963175, 116.400244); //定义Maker坐标点
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);  //构建Marker图标  
//构建MarkerOption,用于在地图上添加Marker  
OverlayOptions option = new MarkerOptions()  
    .position(point)  
    .icon(bitmap)
    .title("B");  
mBaiduMap.addOverlay(option);//在地图上添加Marker,并显示

覆盖物分类:
 ArcOptions,弧线
 CircleOptions,圆
 DotOptions,点
 GroundOverlayOptions,
 MarkerOptions,带图标标记
 PolygonOptions,多边形覆盖物
 PolylineOptions,折线覆盖物
 TextOptions文字

 点击的时候弹出覆盖物:

//创建InfoWindow展示的view  
Button button = new Button(getApplicationContext());  
button.setBackgroundResource(R.drawable.popup);  
//定义用于显示该InfoWindow的坐标点  
LatLng pt = new LatLng(39.86923, 116.397428);  
//创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
InfoWindow mInfoWindow = new InfoWindow(button, pt, -47);  
//显示InfoWindow  
mBaiduMap.showInfoWindow(mInfoWindow);

--------------------------------------------------------------------------------


------------百度地图计算距离------------
double distance =DistanceUtil.getDistance(point2, point);

------------百度地图定位功能实现--------------------
  1,实现BDLocationListener定位接口
    public class MyLocationListenner implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {//定位请求回调函数
            // map view 销毁后不在处理新接收的位置
            if (location == null || mMapView == null)
                return;
            MyLocationData locData = new MyLocationData.Builder() //MyLocationData 定位数据
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100)//定位数据的方向信息
                                        .latitude(location.getLatitude())//定位数据的纬度
                    .longitude(location.getLongitude())/定位数据的经度
                                        .build();
            mBaiduMap.setMyLocationData(locData);

            if (isFirstLoc) {
                isFirstLoc = false;
                LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                mBaiduMap.animateMapStatus(u);
                Log.d(TAG, location.getLatitude()+":"+location.getLongitude());
            }
        }

        public void onReceivePoi(BDLocation poiLocation) {
        }
    }
     2,定位初始化及定位条件
           
        mBaiduMap.setMyLocationEnabled(true);// 开启定位
        // 定位初始化
        mLocClient = new LocationClient(this);
        mLocClient.registerLocationListener(new MyLocationListenner ());//监听位置
        LocationClientOption option = new LocationClientOption();//设置定位条件
        option.setOpenGps(true);// 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);
        mLocClient.setLocOption(option);
        mLocClient.start();


------------离线地图------------

对于官方开发指南对于离线地图的教程,提供了两种方案:

第一,手动导入,先将从官网下载的离线包解压,把vmp文件夹拷入SD卡根目录下的BaiduMapSDK文件夹内。

第二,接口下载方法如下:mOffline.start(cityid);还比较靠谱,就是没详细介绍。
      MKOfflineMap mOffline = new MKOfflineMap();//提供供地图的下载,离线地图列表的获取,已下载地图的查询等
      mOffline.init(new MKOfflineMapListener() {//
    @Override
    public void onGetOfflineMapState(int type, int state) {
        switch (type) {
        case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: {
            MKOLUpdateElement update = mOffline.getUpdateInfo(state);
            // 处理下载进度更新提示
            if (update != null) {
                stateView.setText(String.format("%s : %d%%", update.cityName,
                        update.ratio));
                updateView();
            }
        }
            break;
        case MKOfflineMap.TYPE_NEW_OFFLINE:
            // 有新离线地图安装
            Log.d("OfflineDemo", String.format("add offlinemap num:%d", state));
            break;
        case MKOfflineMap.TYPE_VER_UPDATE:
            // 版本更新提示
            // MKOLUpdateElement e = mOffline.getUpdateInfo(state);

            break;
        }                
    }
    });
    mOffline.start(cityid);//开始下载
    mOffline.pause(cityid);//暂停下载
    
    MKOfflineMap中其他常用方法(详情参见官方api及demo):
    java.util.ArrayList<MKOLUpdateElement> getAllUpdateInfo() 返回各城市离线地图更新信息
    java.util.ArrayList<MKOLSearchRecord> getHotCityList() 返回热门城市列表
    java.util.ArrayList<MKOLSearchRecord> getOfflineCityList() 返回支持离线地图城市列表
    MKOLUpdateElement getUpdateInfo(int cityID) 返回指定城市ID离线地图更新信息
    java.util.ArrayList<MKOLSearchRecord> searchCity(java.lang.String cityName) 根据城市名搜索该城市离线地图记录
    boolean init(MKOfflineMapListener listener) 初使化
    boolean pause(int cityID) 暂停下载指定城市ID的离线地图
    boolean remove(int cityID) 删除指定城市ID的离线地图
    boolean start(int cityID) 启动下载指定城市ID的离线地图
    void destroy()  销毁离线地图管理模块,不用时调用  
   
------------公交线路查询------------
PoiSearch mSearch = PoiSearch.newInstance();//检索接口    
mSearch.searchInCity((new PoiCitySearchOption()).city("深圳").keyword("223"));//检索城市,公交路线
mSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            
        @Override
        public void onGetPoiResult(PoiResult result) {
            if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            Toast.makeText(BusLineSearchDemo.this, "抱歉,未找到结果",
                    Toast.LENGTH_LONG).show();
            return;
            }
             // 遍历所有poi,找到类型为公交线路的poi
             for (PoiInfo poi : result.getAllPoi()) {
            if (poi.type == PoiInfo.POITYPE.BUS_LINE
                    || poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
                
            }
           }
                  
        }
            
        @Override
        public void onGetPoiDetailResult(PoiDetailResult result){//查询结果回调


    
             }
});

BusLineSearch mBusLineSearch = BusLineSearch.newInstance();//该接口用于查询整条公交线路信息,公交换乘路线查询请参看 RoutePlanSearch
mBusLineSearch.searchBusLine((new BusLineSearchOption()
                    .city("深圳")//城市
                                        .uid("101")));//公交线路id
mBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
            
    @Override
    public void onGetBusLineResult(BusLineResult result) {//公共交通信息查询结果(包括站点信息,发车时间等信息)


        if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
            Toast.makeText(BusLineSearchDemo.this, "抱歉,未找到结果",
                    Toast.LENGTH_LONG).show();
            return;
        }
                .......            
    }
});

---------------------地图导航----------------------
 1, 通过手机客户端导航:
   
                LatLng pt1 = new LatLng(x1, y1);
        LatLng pt2 = new LatLng(x2,y2);
        // 构建 导航参数
        NaviPara para = new NaviPara();
        para.startPoint = pt1;
        para.startName = "从这里开始";
        para.endPoint = pt2;
        para.endName = "到这里结束";

        try {

            BaiduMapNavigation.openBaiduMapNavi(para, this);

        } catch (BaiduMapAppNotSupportNaviException e) {
            e.printStackTrace();
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("您尚未安装百度地图app或app版本过低,点击确认安装?");
            builder.setTitle("提示");
            builder.setPositiveButton("确认", new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    BaiduMapNavigation.getLatestBaiduMapApp(NaviDemo.this);
                }
            });

            builder.setNegativeButton("取消", new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            builder.create().show();
        }
2, 通过Web端导航:
        LatLng pt1 = new LatLng(x1, y1);
        LatLng pt2 = new LatLng(x2,y2);
        // 构建 导航参数
        NaviPara para = new NaviPara();
        para.startPoint = pt1;
        para.endPoint = pt2;
        BaiduMapNavigation.openWebBaiduMapNavi(para, this);


---------------------地理坐标与地理位置之间相互转换---------------------

   GeoCoder:地理编码查询接口(坐标与位置之间相互转换)
   GeoCoder mSearch = GeoCoder.newInstance();
   mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {//转换监听接口
    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {//地理编码回调,转换后的地址
                
    }
            
    @Override
    public void onGetGeoCodeResult(GeoCodeResult result) {//地理编码查询结果回调函数,GeoCodeResult转换后的经纬度信息
                
    }
  });
  mSearch.reverseGeoCode(new ReverseGeoCodeOption()//发起反地理编码请求(经纬度->地址信息)
                  .location(point));// 要转换的地理坐标
  mSearch.geocode(new GeoCodeOption()//发起地理编码(地址信息->经纬度)请求
                        .city("深圳")
                        .address("具体要查找的地址信息"));

你可能感兴趣的:(百度地图学习笔记(Android版))