百度地图sdk使用(2) 定位

356 阅读3分钟

百度地图sdk使用(2)  定位

\

百度地图开放地位指南:点击打开链接

(1)LocationtClient   

DBLocationListener

设置位置定位回调 LocationClinet.registerLocationListener(DBLocationListener); 

(2)通过BaiduMap 设置比例;

//设置缩放比例
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
mBaiduMap.setMapStatus(msu);//设置地图的比例\

(3) LocationClientOption 用来设置sdk的定位方式:

定位模式,返回数据类型, 是否打开GPS,返回地址信息。。。

(4)在清单文件中要定位服务

  <!-- 设置定位服务 -->
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>

\

\

注意定位的生命周期与Activity绑定

	@Override
	protected void onStart() {
		super.onStart();
		mBaiduMap.setMyLocationEnabled(true);
		if(!mLocationClient.isStarted()){
			mLocationClient.start();
		}

	}
	@Override
	protected void onStop() {
		super.onStop();
		mBaiduMap.setMyLocationEnabled(false);
		if(mLocationClient.isStarted()){
			mLocationClient.stop();
		}
	}

\

\

\



第一步: LocationClient LocationClient类必须在主线程中声明。需要Context类型的参数。\

 设置DBLocationListener; 

BDLocationListener接口有1个方法需要实现: 

1.接收异步返回的定位结果,参数是BDLocation类型参数。

第二步,配置定位SDK参数

设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。

LocationClientOption类,该类用来设置定位SDK的定位方式

\

\

\

\

\

\

package com.chb.mybaiduditu;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;

public class MainActivity extends Activity {
	/**
	 * 百度地图控件
	 */
	private MapView mapView;
	private BaiduMap mBaiduMap;

	//定位相关的类
	public LocationClient mLocationClient = null;
	/**
	 * 定位回调事件监听
	 * @author Administrator
	 */
	class MyLocationListener implements BDLocationListener {

		@Override
		public void onReceiveLocation(BDLocation Location) {

			Log.i("tag", "--->"+Location.toString());
		}

	}


	public MyLocationListener myListener ;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		//在使用SDK各组件之前初始入Ap化context信息,传plicationContext  
		//注意该方法要再setContentView方法之前实现  
		SDKInitializer.initialize(getApplicationContext());  

		setContentView(R.layout.activity_main); 

		//获取地图控件
		mapView = (MapView) findViewById(R.id.main_bmapView);

		mBaiduMap = mapView.getMap();

		//初始化定位
		initLocation();
	}

	public void initLocation() {
		try{
			mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
			//设置缩放比例
			MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
			mBaiduMap.setMapStatus(msu);//设置地图的比例

			myListener = new MyLocationListener();
			mLocationClient.registerLocationListener(myListener);    //注册监听函数

			LocationClientOption option = new LocationClientOption();
			option.setLocationMode(LocationMode.Hight_Accuracy);
			/*//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
			 */		
			option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
			int span=1000;
			option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
			option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
			option.setOpenGps(true);//可选,默认false,设置是否使用gps
			option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
			option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
			option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
			option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死  
			option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
			option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
			mLocationClient.setLocOption(option);
		}catch(Exception e){
			e.printStackTrace();
		}
	}



	@Override
	protected void onStart() {
		super.onStart();
		mBaiduMap.setMyLocationEnabled(true);
		if(!mLocationClient.isStarted()){
			mLocationClient.start();
		}

	}
	@Override
	protected void onStop() {
		super.onStop();
		mBaiduMap.setMyLocationEnabled(false);
		if(mLocationClient.isStarted()){
			mLocationClient.stop();
		}
	}

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



	/**
	 * 初始化菜单
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		//加载菜单
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	/**
	 * 菜单选项
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.menu_ditu_none:
			//设置地图类型,为空白地图
			mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
			break;

		case R.id.menu_ditu_normal:
			//设置地图类型,为正常地图
			mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
			break;
		case R.id.menu_ditu_satellite:
			//设置地图类型,为卫星地图
			mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
			break;
		case R.id.menu_ditu_traffic:
			if (mBaiduMap.isTrafficEnabled()) {//交通地图关闭
				mBaiduMap.setTrafficEnabled(false);
				item.setTitle("交通地图(off)");
			}else{//交通地图开启
				mBaiduMap.setTrafficEnabled(true);
				item.setTitle("交通地图(on)");
			}
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}


}

\

\

\

\

\

第一步: 

LocationClient LocationClient类必须在主线程中声明。需要Context类型的参数。