最近要做一個導航項目,看了百度地圖app後,自己的項目中要用到地圖選點功能,於是在網上找地圖選點功能,找是找到了,可是對於現在的百度地圖sdk不再適用,於是自己根據api文檔自己研究了一下。
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMapStatusChangeListener;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatus.Builder;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.WindowManager;
public class ItenizdActivity extends Activity {
private MapView mapView = null;
private BaiduMap map;
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
private double latitude;
private double longitude;
private GeoCoder mSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.baidumap);
mapView = (MapView) findViewById(R.id.map);
getLocation();
getGeo();
}
@SuppressLint("NewApi")
private void getMap(){
//獲取屏幕高度寬度
WindowManager wm = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels;
int height = dm.heightPixels;
//去掉logo
mapView.removeViewAt(1);
map = mapView.getMap();
// 設置地圖模式爲交通地圖
map.setTrafficEnabled(true);
// 設置啓用內置的縮放控件
mapView.showZoomControls(true);
//獲得百度地圖狀態
Builder builder = new MapStatus.Builder();
// builder.targetScreen(new Point(width/2,height/2));
//定位的座標點
LatLng latLng = new LatLng(latitude, longitude);
// BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher);
// OverlayOptions overlay = new MarkerOptions().position(latLng).icon(bitmap);
// map.addOverlay(overlay);
//設置地圖中心爲定位點
builder.target(latLng);
//設置縮放級別 18對應比例尺50米
builder.zoom(18);
MapStatus mapStatus = builder.build();
MapStatusUpdate m = MapStatusUpdateFactory.newMapStatus(mapStatus);
map.setMapStatus(m);
map.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {
@Override
public void onMapStatusChangeStart(MapStatus arg0) {
// TODO Auto-generated method stub
}
@Override
public void onMapStatusChangeFinish(MapStatus arg0) {
// TODO Auto-generated method stub
LatLng target = map.getMapStatus().target;
System.out.println(target.toString());
mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(target));
}
@Override
public void onMapStatusChange(MapStatus arg0) {
// TODO Auto-generated method stub
}
});
}
private void getLocation(){
mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationMode.Hight_Accuracy);//設置定位模式
option.setCoorType("bd09ll");//返回的定位結果是百度經緯度,默認值gcj02
option.setScanSpan(5000);//設置發起定位請求的間隔時間爲5000ms
option.setIsNeedAddress(true);//返回的定位結果包含地址信息
option.setNeedDeviceDirect(true);//返回的定位結果包含手機機頭的方向
mLocationClient.setLocOption(option);
mLocationClient.registerLocationListener( myListener ); //註冊監聽函數
mLocationClient.start();
mLocationClient.requestLocation();
}
private void getGeo(){
mSearch = GeoCoder.newInstance();
OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
public void onGetGeoCodeResult(GeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//沒有檢索到結果
}
//獲取地理編碼結果
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
//沒有找到檢索結果
}
//獲取反向地理編碼結果
System.out.println(result.getAddress());
}
};
mSearch.setOnGetGeoCodeResultListener(listener);
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mapView.onPause();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mapView.onResume();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
mapView.onDestroy();
mLocationClient.stop();
mSearch.destroy();
}
class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return ;
latitude = location.getLatitude();
longitude = location.getLongitude();
getMap();
StringBuffer sb = new StringBuffer(256);
sb.append("time : ");
sb.append(location.getTime());
sb.append("\nerror code : ");
sb.append(location.getLocType());
sb.append("\nlatitude : ");
sb.append(location.getLatitude());
sb.append("\nlontitude : ");
sb.append(location.getLongitude());
sb.append("\nradius : ");
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation){
sb.append("\nspeed : ");
sb.append(location.getSpeed());
sb.append("\nsatellite : ");
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append("\naddr : ");
sb.append(location.getAddrStr());
}
System.out.println(sb.toString());
mLocationClient.stop();
}
}
}
運行效果是這樣的,進入地圖,先定位自己的位置,在xml佈局中間放一個定位圖片,當拖動地圖時,獲取定位圖片定位的座標值,然後根據座標得到自己的位置。這個位置只能顯示街道門牌號,顯示不了具體名稱。但對於導航,只要座標就夠了,基本能實現地圖選點功能。
xml代碼:
?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.baidu.mapapi.map.MapView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
android:layout_centerInParent="true"
/>
</RelativeLayout>