最近使用百度地图实现了定位及查看周边活动的功能整理一下可用的资料。
一、位置监听及缩放级别设置
/**
* 定位SDK监听函数
*/
public class MyLocationListenner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || tmapView == null) {
return;
}
//获取位置信息
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;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
builder.target(ll).zoom(13);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
}
}
二、地图的配置及点击事件的监听
private void init() {
// 地图初始化
mBaiduMap = tmapView.getMap();
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
//普通模式
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
// 定位初始化
MyLocationListenner myListener = new MyLocationListenner();
LocationClient mLocClient = new LocationClient(this);
mLocClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
//option.setScanSpan(10000);//重定位时间间隔,单位毫秒
mLocClient.setLocOption(option);
mLocClient.start();
//设置模式,这里是跟随模式
MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.FOLLOWING;
mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.ic_adress_nor);
//创建OverlayOptions的集合
//设置坐标点
LatLng point1 = new LatLng(31.05235, 121.380338);
LatLng point2 = new LatLng(31.077246, 121.414977);
//创建OverlayOptions属性
OverlayOptions option1 = new MarkerOptions()
.position(point1)
.icon(bitmap);
OverlayOptions option2 = new MarkerOptions()
.position(point2)
.icon(bitmap);
//将OverlayOptions添加到list
options1.add(option1);
options1.add(option2);
mBaiduMap.clear();
//在地图上批量添加
mBaiduMap.addOverlays(options1);
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//创建InfoWindow展示的view
button = new Button(getApplicationContext());
button.setBackgroundResource(R.drawable.bg_map);
button.setText("点击了");
//定义用于显示该InfoWindow的坐标点
LatLng pt = new LatLng(marker.getPosition().latitude, marker.getPosition().longitude);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_adress);
marker.setIcon(bitmap);
//弹窗点击事件
InfoWindow.OnInfoWindowClickListener listener = new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
mBaiduMap.hideInfoWindow();
button.setVisibility(View.INVISIBLE);
BasesDetailActivity_.intent(MapViewActivity.this).start();
}
};
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromView(button);
//创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
InfoWindow mInfoWindow = new InfoWindow(bitmapDescriptor, pt, -47, listener);
button.setVisibility(View.VISIBLE);
//显示InfoWindow
mBaiduMap.showInfoWindow(mInfoWindow);
//返回值默认false,改为true
return true;
}
});
}
三、设置中心点
//设置中心点
LatLng cenpt = new LatLng(31.063137, 121.401378); //设定中心点坐标
MapStatus mMapStatus = new MapStatus.Builder()//定义地图状态
.target(cenpt)
.build(); //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);
mBaiduMap.setMapStatus(mMapStatusUpdate);//改变地图状态
四、调用百度地图app实现路线规划(传经纬度)
/**
* 注意下面的起终点坐标都是百度坐标
*/
void setUpBaiduAPPByLoca() {
try {
Intent intent = Intent.getIntent("intent://map/direction?origin=latlng:" + LATITUDE_QIDIAN + "," + LONGTITUDE_QIDIAN + "|name:万家丽国际Mall&destination=latlng:" + LATITUDE_ZHONGDIAN + "," + LONGTITUDE_ZHONGDIAN + "|name:东郡华城广场|A座&mode=driving&src=yourCompanyName|yourAppName#Intent;scheme=bdapp;package=com.baidu.BaiduMap;end");
if (isInstallByread("com.baidu.BaiduMap")) {
startActivity(intent);
Log.e(TAG, "百度地图客户端已经安装");
} else {
Log.e(TAG, "没有安装百度地图客户端");
}
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
/**
* 判断是否安装目标应用
*
* @param packageName 目标应用安装后的包名
* @return 是否已安装目标应用
*/
private boolean isInstallByread(String packageName) {
return new File("/data/data/" + packageName).exists();
}
五、根据两点经纬度计算距离(单位km)
// 计算两点距离
private final double EARTH_RADIUS = 6378137.0;
private double gps2km(double lat_a, double lng_a, double lat_b, double lng_b) {
double radLat1 = (lat_a * Math.PI / 180.0);
double radLat2 = (lat_b * Math.PI / 180.0);
double a = radLat1 - radLat2;
double b = (lng_a - lng_b) * Math.PI / 180.0;
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
+ Math.cos(radLat1) * Math.cos(radLat2)
* Math.pow(Math.sin(b / 2), 2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10000 / 1000;
return s;
}
六、注意,生命周期的监听(缺少这部分会导致mark点击事件实效)
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
tmapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
tmapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
tmapView.onPause();
}