一、配置相关参数
配置定位SDK参数
private int span = 5000;
private void initLocationSDK() {
LocationClientOption option = new LocationClientOption();//通过LocationClientOption设置LocationClient相关参数
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");// 坐标类型,可选,默认gcj02,设置返回的定位结果坐标系
option.setScanSpan(span);// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);// 可选,默认false,设置是否使用gps
option.setLocationNotify(true);// 可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
option.setIsNeedLocationDescribe(true);// 可选,默认false,设置是否需要位置语义化结果,可以在BDLocation
// .getLocationDescribe里得到,结果类似于“在北京天安门附近”
option.setIsNeedLocationPoiList(true);// 可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setOpenGps(true); // 打开gps
option.setIgnoreKillProcess(false);// 可选,默认为true不杀死,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程
option.SetIgnoreCacheException(false);// 可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);// 可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
mLocationClient.setLocOption(option);//参数设置
//设置打开自动回调位置模式,该开关打开后,期间只要定位SDK检测到位置变化就会主动回调给开发者
//option.setOpenAutoNotifyMode(3000,5, LocationClientOption.LOC_SENSITIVITY_HIGHT);
}
二、获取GPS定位数据
可从LocationListener中直接获取到当前的经纬度。
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
三、多个标记点的显示
创建List,把Marker信息放进去,然后调用BaiduMap的addOverlays方法,将多个标记一并添加到地图上显示。
private ListoverlayOptionses=new ArrayList();
private MarkerOptions options;
private void updateView(LatLng latLng){
mBaiduMap.clear();//先清除图层
LatLng point=latLng;
if( point!= null){
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_mark);//构建Marker图标
options = new MarkerOptions().position(point).icon(bitmap);// 构建MarkerOption,用于在地图上添加Marker
overlayOptionses.add(options);
mBaiduMap.addOverlays(overlayOptionses);// 在地图上添加Marker数组,并显示
}else{
}
}
四、定时刷新
可以自己做一个定时器,也可以借助BDLocationListener。
可能自己写的定时器更加灵活把,有些繁琐,我也没用,就不介绍了,以后用了再上代码段。
我是借助了BDLocationListener监听接口,很是简单,在sdk参数配置中的”option.setScanSpan(span)“可以用来控制定位的间隔,直接把updateView方法放到重写的onReceiveLocation方法中即可,如下所示:
private class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());
MyLocationData locData = new MyLocationData.Builder().accuracy(location.getRadius())// 构造定位数据
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);// 设置定位数据
if (isFirstLoc) {
isFirstLoc = false;
MapStatus.Builder builder = new MapStatus.Builder();
builder.zoom(28.0f).target(latLng);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
Toast.makeText(NetworkRecordActivity.this,location.getAddrStr(), Toast.LENGTH_SHORT).show();
Log.d("TypeGpsLocation location", location.toString());
}else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
Toast.makeText(NetworkRecordActivity.this,location.getAddrStr(), Toast.LENGTH_SHORT).show();
}else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
Toast.makeText(NetworkRecordActivity.this,location.getAddrStr(), Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeServerError) {
Toast.makeText(NetworkRecordActivity.this, "服务器错误,请检查",Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeNetWorkException) {
Toast.makeText(NetworkRecordActivity.this, "网络错误,请检查",Toast.LENGTH_SHORT).show();
} else if (location.getLocType() == BDLocation.TypeCriteriaException) {
Toast.makeText(NetworkRecordActivity.this,"仪器模式错误,请检查是否飞行", Toast.LENGTH_SHORT).show();
}
}
updateView(latLng);//更新自定义标记显示
}
}
结束语:不知道该怎么详细说了,我已经尽力了,有不尽之处以后再完善把。愿成长之路坎坷不绕远,布满荆棘却受益匪浅。