百度地图开发小结(2)

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

我们可以通过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定位,经纬度获取地址
	 */
	@Override
	public 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 信息 
	    */  
		@Override
		public boolean onMapPoiClick(MapPoi poi) {
			// TODO Auto-generated method stub
			return 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() {
		
		@Override
		public void onVerifySucc() {
			// TODO Auto-generated method stub
//			Toast.makeText(MainActivity.this, "key校验成功", Toast.LENGTH_LONG).show();
		}
		
		@Override
		public void onVerifyFailed(int arg0, String arg1) {
			// TODO Auto-generated method stub
			Toast.makeText(MainActivity.this, "key校验失败", Toast.LENGTH_LONG).show();
		}
	};
<span style="white-space:pre">	</span>Handler handler = new Handler(){

		@Override
		public 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进去。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值