最近的的项目让我负责地图这一块,在耗费了20天后(水平渣渣慢的很)一这一块总算是基本已经弄完了,为了方便在去做百度地图这一块的朋友和为自己回顾一下,记录下来了这篇博客。下面就不废话了。
百度地图的KEY注册,SDK下载和导入项目我这里就不再说了,看百度的API官网就完成这些操作了。
集成成功后更具第一篇集成文档就能将北京的地图显示出来了。这一块网上也有很多贴在在说的。
我要说的第一个,地图定位功能,和将地图定位功能封装以便在其他地方使用定位。
看过demo的都应该知道了,定位需要 locSDK_5.2.jar这个包和liblocSDK5.so这个jni库。
public class LocationBase {
public LocationMap locationMap;
;
public interface LocationMap{
public void getLocation(BDLocation location);
}
// 定位相关
private LocationClient mLocClient;
public MyLocationListenner myListener = new MyLocationListenner();
public LocationBase(Context context) {
mylocation(context);
}
public void mylocation(Context context){
locationMap=(LocationMap)context;
// 定位初始化
mLocClient = new LocationClient(context);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setCoorType("bd09ll"); //可选,默认gcj02,设置返回的定位结果坐标系
option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
mLocClient.setLocOption(option);
mLocClient.start();
}
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
/* ll = new LatLng(location.getLatitude(),
location.getLongitude());*/
locationMap.getLocation(location);
if (!location.equals(null)){
mLocClient.stop();
}
}
public void onReceivePoi(BDLocation poiLocation) {
}
}
}
这个就是定位的封装类 首先初始化定位,然后实现定位返回值的接 location这个就是定位成功后返回回来的数据。
使用的办法也很简单:
在需要定位地方实现LocationMap这个接口
public class MyTest extends Activity implements LocationBase.LocationMap{
这时候会从写他里边的方法
@Override
public void getLocation(BDLocation location) {
}
还差最后一步:
在你需要启动定位的时候
private View.OnClickListener itemsOnClick = new View.OnClickListener() {
@Override
public void onClick(View v) {
LocationBase base=new LocationBase(MyTest.this);
}
};
new一个LocationBase出来,传入context,这样就已经是OK了。获取定位位置信息只要在location中过去就可以了。
String address=location.getAddrStr();
这就可以获取自己的位置语义化信息了
如果在地图页面显示地位,在初始化地图完成后调用定位就可以
在下一篇博客中将讲述如何添加覆盖物
/**
* 定位初始化
* 启动定位
*/
public void initlocation() {
// 定位初始化
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setCoorType("bd09ll"); //可选,默认gcj02,设置返回的定位结果坐标系
option.setScanSpan(1000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
mLocClient.setLocOption(option);
mLocClient.start();
//设置导航定位图标.传入null则,恢复默认图标
// mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));
mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.position_default);
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker));
}
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(0).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
//获取LatLng自己位置的经纬
myLatLng = new LatLng(location.getLatitude(),
location.getLongitude());
//定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(myLatLng);
//将自己的位置设为地图中心点显示
mBaiduMap.animateMapStatus(msu);
//定位成功后 停止定位
if (!location.equals(null)) {
myCity = location.getCity();
mLocClient.stop();
}
}
}
在下一篇博客中将讲述如何添加覆盖物