百度地圖 地圖選點

最近要做一個導航項目,看了百度地圖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>


發佈了36 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章