百度地图开发小结(2)

来源:互联网 发布:google chrome翻墙mac 编辑:程序博客网 时间:2024/04/27 18:50

前面完成了定位功能,我们想得到定位地点的名称,发现目前能获取到的数据只有地点的经纬度。

我们可以通过GeoCorder来得到地点的名称。

首先实现OnGetGeoCoderResultListener接口。

添加一个GeoCorder对象:

GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用
在onCreate方法中添加代码:
<span style="white-space:pre"></span>// 初始化搜索模块,注册事件监听mSearch = GeoCoder.newInstance();mSearch.setOnGetGeoCodeResultListener(this);
前面我们在MyLocationListenner中实现了定位,我们可以得到当前位置的经纬度,下面就可以用GeoCorder的reverseGeoCode方法取得地点名称:
mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ptCenter));
onGetReverseGeoCodeResult便接收到了相应的结果。

<span style="white-space:pre"></span>/** * Geo定位,经纬度获取地址 */@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show();return;}mBaiduMap.clear();int size = result.getPoiList().size();if(size > 0){List<String> data = new ArrayList<String>();data.add(result.getAddress());for (PoiInfo info : result.getPoiList()) {String name = info.name;data.add(name);}ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, R.layout.list, R.id.namelist, data);listView.setAdapter(adapter);}}
这里顺便把地点的名称以及附近的POI信息添加到一个listview里。

--------------------------分割线------------------------------

定位以及获取名称完成了。接下来该实现导航功能了。

先给地图添加一个单击的监听:

OnMapClickListener listener = new OnMapClickListener() {      /**     * 地图单击事件回调函数     * @param point 点击的地理坐标     */      public void onMapClick(LatLng point){    mBaiduMap.clear();    double lat = point.latitude;    double longit = point.longitude;    BitmapDescriptor bitmap = BitmapDescriptorFactory          .fromResource(R.drawable.icon_marka);      //构建MarkerOption,用于在地图上添加Marker      OverlayOptions option = new MarkerOptions()          .position(point)          .icon(bitmap);      //在地图上添加Marker,并显示      mBaiduMap.addOverlay(option);    ptEnd = point;    if(ptEnd != null){    btnNav.setVisibility(Button.VISIBLE);    }    }          /**     * 地图内 Poi 单击事件回调函数     * @param poi 点击的 poi 信息     */  @Overridepublic boolean onMapPoiClick(MapPoi poi) {// TODO Auto-generated method stubreturn false;}  };
我们可以通过单击地图得到需要导航的目的地。

添加一个按钮启动导航,单击事件

<span style="white-space:pre"></span>public void startNavEngine(View view) {// 初始化导航引擎if(mIsEngineInitSuccess){launchNavigator2();return;}BaiduNaviManager.getInstance().initEngine(this, getSdcardDir(),mNaviEngineInitListener, ACCESS_KEY, mKeyVerifyListener);dialog = new ProgressDialog(this);dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);dialog.setMessage("初始化引擎中");dialog.show();}
<span style="white-space:pre"></span>private String getSdcardDir() {if (Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) {return Environment.getExternalStorageDirectory().toString();}return null;}private NaviEngineInitListener mNaviEngineInitListener = new NaviEngineInitListener() {public void engineInitSuccess() {mIsEngineInitSuccess = true;Message message = new Message();message.what = 1;handler.sendMessage(message);}public void engineInitStart() {}public void engineInitFail() {Looper.prepare();Toast.makeText(MainActivity.this, "导航引擎初始化失败", 0).show();Looper.loop();}};private BNKeyVerifyListener mKeyVerifyListener = new BNKeyVerifyListener() {@Overridepublic void onVerifySucc() {// TODO Auto-generated method stub//Toast.makeText(MainActivity.this, "key校验成功", Toast.LENGTH_LONG).show();}@Overridepublic void onVerifyFailed(int arg0, String arg1) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, "key校验失败", Toast.LENGTH_LONG).show();}};
<span style="white-space:pre"></span>Handler handler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:if(dialog.isShowing()){dialog.dismiss();}Toast.makeText(MainActivity.this, "导航引擎初始化成功", 0).show();launchNavigator2();break;default:break;}super.handleMessage(msg);}};
以上检验了我们申请的key是否争取,引擎是否成功初始化。

/**     * 指定导航起终点启动GPS导航.起终点可为多种类型坐标系的地理坐标。     * 前置条件:导航引擎初始化成功     */    private void launchNavigator2(){        //这里给出一个起终点示例,实际应用中可以通过POI检索、外部POI来源等方式获取起终点坐标        BNaviPoint startPoint = new BNaviPoint(ptCenter.longitude,ptCenter.latitude,                "软件园", BNaviPoint.CoordinateType.BD09_MC);        BNaviPoint endPoint = new BNaviPoint(ptEnd.longitude,ptEnd.latitude,                "指定点", BNaviPoint.CoordinateType.BD09_MC);        BaiduNaviManager.getInstance().launchNavigator(this,                startPoint,                                      //起点(可指定坐标系)                endPoint,                                        //终点(可指定坐标系)                NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME,       //算路方式                true,                                            //真实导航                BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY, //在离线策略                new OnStartNavigationListener() {                //跳转监听                                        @Override                    public void onJumpToNavigator(Bundle configParams) {                        Intent intent = new Intent(MainActivity.this, BNavigatorActivity.class);                        intent.putExtras(configParams);                        startActivity(intent);                    }                                        @Override                    public void onJumpToDownloader() {                    }                });    }
好了,可以进入导航界面了,这里只是用了其中一种导航的方式,其他的可以自行测试~

PS:assets文件夹的东西记得copy进去。



0 0
原创粉丝点击