百度地圖Android,v4_5_0.so
阿新 • • 發佈:2018-10-31
最近使用百度地圖實現了定位及檢視周邊活動的功能整理一下可用的資料。
一、位置監聽及縮放級別設定
/**
* 定位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();
}