Android百度地图的使用
1、环境配置
申请**,下载sdk(jar和so库),Android Studio的话如果在时在lib下面放的jar包和so库build文件加上
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
main {
jniLibs.srcDirs = ['libs']
}
}
在AndroidManifest文件中加上
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="申请的**"
/>
2、显示百度地图
添加MapView控件,并初始化,加载布局前先初始化sdk
SDKInitializer.initialize(getApplicationContext());
3、地图的基本应用
baiduMap = mapView.getMap();
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
baiduMap.setMapStatus(msu); //设置比例尺
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //设置地图类型可选择基础地图,卫星地图和空白地图
// baiduMap.setTrafficEnabled(true); //获取交通实况
mapView.setLogoPosition(LogoPosition.logoPostionleftTop);
//定义Marker坐标点
LatLng point = new LatLng(39.963175, 116.400244);
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
MarkerOptions options = new MarkerOptions().position(point).icon(bitmap);
//在地图上添加Marker,并显示
options.animateType(MarkerOptions.MarkerAnimateType.drop);
baiduMap.addOverlay(options);
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
baiduMap.setMapStatus(msu); //设置比例尺
baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //设置地图类型可选择基础地图,卫星地图和空白地图
// baiduMap.setTrafficEnabled(true); //获取交通实况
mapView.setLogoPosition(LogoPosition.logoPostionleftTop);
//定义Marker坐标点
LatLng point = new LatLng(39.963175, 116.400244);
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
MarkerOptions options = new MarkerOptions().position(point).icon(bitmap);
//在地图上添加Marker,并显示
options.animateType(MarkerOptions.MarkerAnimateType.drop);
baiduMap.addOverlay(options);
4、地图定位
//定位相关
private LocationClient mLocationClient;
private LocationClient mLocationClient;
private MyLocationListener myLocationListener;
核心类 LocationClient ,监听MyLocationListener 继承BDLocationListener
初始化
private void initLocation() {
mLocationClient = new LocationClient(this);
myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //设置定位模式:高精度、低功耗、仅设备
option.setCoorType("bd09ll"); //设置坐标系为百度经纬度
option.setIsNeedAddress(true); //设置获取地址
option.setOpenGps(true); //开启GPS
option.setScanSpan(1000); //设置请求间隔时间
mLocationClient.setLocOption(option);
}
mLocationClient = new LocationClient(this);
myLocationListener = new MyLocationListener();
mLocationClient.registerLocationListener(myLocationListener);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //设置定位模式:高精度、低功耗、仅设备
option.setCoorType("bd09ll"); //设置坐标系为百度经纬度
option.setIsNeedAddress(true); //设置获取地址
option.setOpenGps(true); //开启GPS
option.setScanSpan(1000); //设置请求间隔时间
mLocationClient.setLocOption(option);
}
定位监听
private class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
MyLocationData data = new MyLocationData.Builder() //构造定位数据
.accuracy(bdLocation.getRadius()) //获取精准度
.longitude(bdLocation.getLongitude())
.latitude(bdLocation.getLatitude())
.build();
mBaiduMap.setMyLocationData(data); //设置定位数据
if (isFirst == true) {
LatLng latLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu); //第一次定位时将MapStatusUpdate更新经纬度并定位
isFirst = false;
Toast.makeText(context, bdLocation.getAddrStr(), Toast.LENGTH_LONG).show();
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
@Override
public void onReceiveLocation(BDLocation bdLocation) {
MyLocationData data = new MyLocationData.Builder() //构造定位数据
.accuracy(bdLocation.getRadius()) //获取精准度
.longitude(bdLocation.getLongitude())
.latitude(bdLocation.getLatitude())
.build();
mBaiduMap.setMyLocationData(data); //设置定位数据
if (isFirst == true) {
LatLng latLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu); //第一次定位时将MapStatusUpdate更新经纬度并定位
isFirst = false;
Toast.makeText(context, bdLocation.getAddrStr(), Toast.LENGTH_LONG).show();
}
}
@Override
public void onConnectHotSpotMessage(String s, int i) {
}
}
最后开启定位图层并开始定位
mBaiduMap.setMyLocationEnabled(true); //开启定位图层
if (!mLocationClient.isStarted())
mLocationClient.start();
if (!mLocationClient.isStarted())
mLocationClient.start();
并在不需要定位时关闭定位图层和关闭定位
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
mLocationClient.stop();
5、方向传感器
设置定图标
bitmap = BitmapDescriptorFactory.fromResource(R.mipmap.navi_map_gps_locked);
MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, bitmap);
MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, bitmap);
并可以设置定位模式:罗盘、跟随、普通及
LocationMode.COMPASS
LocationMode.FOLLOWING
LocationMode.NORMAL
写一个类MyOrientationListener继承SensorEventListener
,获取方向传感器并进行注册监听
public void start() {
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager != null) {
//获得方向传感器
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}
if (mSensor != null) {
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI);
}
}
mSensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
if (mSensorManager != null) {
//获得方向传感器
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}
if (mSensor != null) {
mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_UI);
}
}
在stop的时候取消注册
写一个接口用于监听
public interface OnOrientationListener {
void onOrientationChange(float lastX);
}
void onOrientationChange(float lastX);
}
在方向改变去把X数据传到之前写的接口中
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
float x = event.values[SensorManager.DATA_X];
if (Math.abs(x - lastX) > 1.0) {
if (mOnOrientationListener != null) {
mOnOrientationListener.onOrientationChange(x);
}
}
lastX = x;
}
}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
float x = event.values[SensorManager.DATA_X];
if (Math.abs(x - lastX) > 1.0) {
if (mOnOrientationListener != null) {
mOnOrientationListener.onOrientationChange(x);
}
}
lastX = x;
}
}
最后在Activity中开启方向传感器并在onStop时停止方向传感器,并初始化之前写的MyOrientationListener并设置回调
mMyOrientationListener = new MyOrientationListener(context);
mMyOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
@Override
public void onOrientationChange(float lastX) {
currentX = lastX;
}
});
mMyOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
@Override
public void onOrientationChange(float lastX) {
currentX = lastX;
}
});
mMyOrientationListener.start();
mMyOrientationListener.stop();
在MyLocationData中获取方向
MyLocationData data = new MyLocationData.Builder() //构造定位数据
.direction(currentX) //获取方向
.accuracy(bdLocation.getRadius()) //获取精准度
.longitude(bdLocation.getLongitude())
.latitude(bdLocation.getLatitude())
.build();
.direction(currentX) //获取方向
.accuracy(bdLocation.getRadius()) //获取精准度
.longitude(bdLocation.getLongitude())
.latitude(bdLocation.getLatitude())
.build();
6、地图覆盖物
创建一个Marker,OverlayOptions制定经纬度和图标,并可以用同一个Bundle来帮绑定数据
private void addOverlays(List<Info> infoList) {
mBaiduMap.clear();
LatLng latLng = null;
Marker marker = null;
OverlayOptions option;
for (Info info : infoList) {
latLng = new LatLng(info.getLatitude(), info.getLongitude());
option = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);
marker = (Marker) mBaiduMap.addOverlay(option);
Bundle bundle = new Bundle();
bundle.putSerializable("info", info);
marker.setExtraInfo(bundle);
}
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.setMapStatus(msu);
}
mBaiduMap.clear();
LatLng latLng = null;
Marker marker = null;
OverlayOptions option;
for (Info info : infoList) {
latLng = new LatLng(info.getLatitude(), info.getLongitude());
option = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);
marker = (Marker) mBaiduMap.addOverlay(option);
Bundle bundle = new Bundle();
bundle.putSerializable("info", info);
marker.setExtraInfo(bundle);
}
MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.setMapStatus(msu);
}
可以通过setOnMapClickListener来监听点击地图事件
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
mMarkerlayout.setVisibility(View.GONE);
mBaiduMap.hideInfoWindow();
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
@Override
public void onMapClick(LatLng latLng) {
mMarkerlayout.setVisibility(View.GONE);
mBaiduMap.hideInfoWindow();
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
点击Marker事件,通过setOnMarkerClickListener来监听,并获取之前绑定的Bundle数据,把数据进行设置,
可以通过InfoWindow来添加点击时图标上的文字,先new一个view,再获取Marker的经纬度,根据经纬度转换成Point,再Y坐标设置偏移量,对其转换为经纬度,
最后new一个InfoWindow设置监听
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
mMarkerlayout.setVisibility(View.VISIBLE);
Bundle bundle = marker.getExtraInfo();
Info info = (Info) bundle.getSerializable("info");
imgInfo.setImageResource(info.getImgId());
name.setText(info.getName());
distance.setText(info.getDistance());
zan.setText(info.getZan()+"");
TextView tv = new TextView(context);
tv.setBackgroundResource(R.mipmap.location_tips);
tv.setText(info.getName());
tv.setTextColor(Color.WHITE);
LatLng latLng = marker.getPosition();
Point p = mBaiduMap.getProjection().toScreenLocation(latLng);
p.y -= 47;
LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);
BitmapDescriptor des = BitmapDescriptorFactory.fromView(tv);
infoWindow = new InfoWindow(des,ll,0,new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
mBaiduMap.hideInfoWindow();
}
});
mBaiduMap.showInfoWindow(infoWindow);
return false;
}
});
@Override
public boolean onMarkerClick(Marker marker) {
mMarkerlayout.setVisibility(View.VISIBLE);
Bundle bundle = marker.getExtraInfo();
Info info = (Info) bundle.getSerializable("info");
imgInfo.setImageResource(info.getImgId());
name.setText(info.getName());
distance.setText(info.getDistance());
zan.setText(info.getZan()+"");
TextView tv = new TextView(context);
tv.setBackgroundResource(R.mipmap.location_tips);
tv.setText(info.getName());
tv.setTextColor(Color.WHITE);
LatLng latLng = marker.getPosition();
Point p = mBaiduMap.getProjection().toScreenLocation(latLng);
p.y -= 47;
LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);
BitmapDescriptor des = BitmapDescriptorFactory.fromView(tv);
infoWindow = new InfoWindow(des,ll,0,new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
mBaiduMap.hideInfoWindow();
}
});
mBaiduMap.showInfoWindow(infoWindow);
return false;
}
});
最后的效果图