1、实现目的: MyLocationOverlay
一个负责显示用户当前位置的Overlay。 自2.0.0版本开始,MyLocationOverlay只负责显示我的位置,位置数据请使用百度定位SDK获取,将获取的位置数据放在一个LocationData结构中并用该结构设置MyLcationOverlay的数据源,即可创建MyLocationOverlay。 LocationData数据获取 创建监听器:当获取到位置信息时,将信息添加到LocationData中,监听器需要实现BDLocationListener接口, 两个方法需要实现: 1.接收异步返回的定位结果,参数是BDLocation类型参数。 2.接收异步返回的POI查询结果,参数是BDLocation类型参数。 监听的设置: 创建LocationClient对象,注册监听registerLocationListener 设置定位参数(LocationClientOption):定位模式(单次定位,定时定位),返回坐标类型,是否打开GPS等等。 通过LocationClient的start、stop控制定位信息获取,在做中间可以手动发起定位的请求requestLocation
前期准备: 离线文件下载,指定机型和城市下载对应的离线地图 2.0以上版本处理步骤 1、将下载好的离线地图包解压缩。 2、找到解压出的”BaiduMap”文件夹,把它放入手机存储卡根目录。在上述过程中如遇提示“是否需要覆盖文件”,点击确定即可。 断开与电脑连接,打开百度手机地图(如已打开请重启),系统会提示导入成功。 提示:下载多个城市包时,经解压后,这些城市数据都会被同时解压到BaiduMap文件夹中,不同城市不会出现被覆盖的情况。 1.X版本处理步骤 1、将离线地图加压,把Mapdata文件夹拷入SD卡根目录下的BaiduMapSdk下 2、利用MKOfflineMap在初始化(init)后调用scan()扫描本地地图资源。 实现过程: 百度开发者中心的相关文档http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/getloc 实现效果: MyLocationOverlayDemo .java
package huaxa.it.map; import android.os.Bundle; import android.os.Handler; import android.util.Log; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.LocationData; import com.baidu.mapapi.map.MyLocationOverlay; import com.baidu.platform.comapi.basestruct.GeoPoint; /** * @项目名: BaiduMap * @包名: huaxa.it.map * @类名: MyLocationOverlayDemo * @创建者: 黄夏莲 * @创建时间: 2016年12月3日 ,下午2:32:14 * * @描述: TODO */ public class MyLocationOverlayDemo extends BaseActivity { public LocationClient mLocationClient; public BDLocationListener myListener; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); location(); } private void location() { // ①发起定位请求 mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类 // ②参数设置 LocationClientOption option = new LocationClientOption(); option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系 int span = 1000; option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setOpenGps(true);// 可选,默认false,设置是否使用gps option.setLocationNotify(true);// 可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果 mLocationClient.setLocOption(option); // MyLocationClient myLocationClient = new MyLocationClient(); // myLocationClient.start(); myListener = new MyListener(); mLocationClient.registerLocationListener(myListener); // 注册监听函数 // ③设置响应,结果处理 } // class MyLocationClient extends Handler implements Runnable // { // // @Override // public void run() // { // // ②参数设置 // LocationClientOption option = new LocationClientOption(); // option.setCoorType("bd09ll");// 可选,默认gcj02,设置返回的定位结果坐标系 // int span = 1000; // option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 // option.setOpenGps(true);// 可选,默认false,设置是否使用gps // option.setLocationNotify(true);// 可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果 // mLocationClient.setLocOption(option); // // post(this); // // } // // public void start() // { // post(this); // // } // // } class MyListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null) return; MyLocationOverlay overlay = new MyLocationOverlay(mapView); LocationData locData = new LocationData(); locData.latitude = location.getLatitude(); locData.longitude = location.getLongitude(); overlay.setData(locData); mapView.getOverlays().clear(); mapView.getOverlays().add(overlay); mapView.refresh(); // 地图移动 controller.animateTo(new GeoPoint( (int) (locData.latitude*1E6),(int)(locData.longitude*1E6))); } @Override public void onReceivePoi(BDLocation location) { } } /** * GPS很耗费资源,为了减少资源 */ @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mLocationClient.start(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); mLocationClient.stop(); } }