1. 程式人生 > >安卓百度地圖基本配置及畫線路軌跡問題

安卓百度地圖基本配置及畫線路軌跡問題

配置百度地圖進行經緯度的定位和畫折線圖軌跡以及百度地圖控制元件和ScrollView滑動衝突的問題解決。

首先按照百度地圖的API把jar包還有主配置檔案還有百度key這些基本配置都給加上,確保key值是正確的。
解決百度地圖控制元件和ScrollView滑動衝突問題,上程式碼:
// 解決地圖拖動和ScrollView上下滑動衝突問題
		View v = mMapView.getChildAt(0);
		v.setOnTouchListener(new View.OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				if (event.getAction() == MotionEvent.ACTION_UP) {
					scrollView.requestDisallowInterceptTouchEvent(false);
				} else {
					scrollView.requestDisallowInterceptTouchEvent(true);
				}
				return false;
			}
		});


在地圖中心顯示指定的經緯度並新增marker
//獲取到的經緯度
		double latt = Double.parseDouble(sp.getString("Lat", ""));
		double lngg = Double.parseDouble(sp.getString("Lng", ""));
		//經緯度對應的地址
		final String address1 = sp.getString("address", "");
		// 定義Maker座標點
		LatLng point = new LatLng(lngg, latt);
		// 構建Marker圖示
		BitmapDescriptor bitmap = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_gcoding);
		// 構建MarkerOption,用於在地圖上新增Marker
		OverlayOptions option = new MarkerOptions().position(point)
				.icon(bitmap).zIndex(8).draggable(true);
		float f = mBaiduMap.getMaxZoomLevel();// 19.0 最小比例尺
		// 設定當前位置顯示在地圖中心
		MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(point, f - 5);// 設定縮放比例
		mBaiduMap.animateMapStatus(u);
		// 在地圖上新增Marker,並顯示
		mBaiduMap.addOverlay(option);
		//點選Marker彈出地址名稱
		mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {

			@Override
			public boolean onMarkerClick(Marker arg0) {
				// TODO Auto-generated method stub
				Toast.makeText(CarStateActivity.this, address1,
						Toast.LENGTH_SHORT).show();
				return true;
			}
		});
效果如圖:


多個Marker同時顯示的程式碼,以折線圖軌跡的起點和終點為例:
// 起點位置
		LatLng geoPoint = new LatLng(latstart, lngstart);
		// 構建Marker圖示
		BitmapDescriptor bitmap = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_st);
		// 構建MarkerOption,用於在地圖上新增Marker
		OverlayOptions option = new MarkerOptions().position(geoPoint)
				.icon(bitmap).zIndex(8).draggable(true);

		// 終點位置
		LatLng geoPoint1 = new LatLng(latend, lngend);
		// 構建Marker圖示
		BitmapDescriptor bitmap1 = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_en);
		// 構建MarkerOption,用於在地圖上新增Marker
		OverlayOptions option1 = new MarkerOptions().position(geoPoint1)
				.icon(bitmap1).zIndex(8).draggable(true);
		// 在地圖上新增Marker,並顯示

		List<OverlayOptions> overlay = new ArrayList<OverlayOptions>();
		overlay.add(option);
		overlay.add(option1);
		mBaiduMap.addOverlays(overlay);


畫折線圖:
List<LatLng> latLngPolygon = new ArrayList<LatLng>();
	public void drawStart() throws JSONException {
		
		//向latLngPolygon中新增獲取到的所有座標點

		for (int i = 0; i < json_data.length(); i++) {
			JSONObject jsonStart = json_data.getJSONObject(i);
			String lngStart = jsonStart.getString("lng");
			String latStart = jsonStart.getString("lat");
			double latstart = Double.valueOf(latStart);
			double lngstart = Double.valueOf(lngStart);
			LatLng pt1 = new LatLng(latstart, lngstart);
			latLngPolygon.add(pt1);
		}
		//獲取起點和終點以及計算中心點
		JSONObject jsonStart = json_data.getJSONObject(0);
		String lngStart = jsonStart.getString("lng");
		String latStart = jsonStart.getString("lat");
		double latstart = Double.valueOf(latStart);
		double lngstart = Double.valueOf(lngStart);
		JSONObject jsonEnd = json_data.getJSONObject(json_data.length() - 1);
		String lngEnd = jsonEnd.getString("lng");
		String latEnd = jsonEnd.getString("lat");
		double latend = Double.valueOf(latEnd);
		double lngend = Double.valueOf(lngEnd);

		final double midlat = (latstart + latend) / 2;
		final double midlon = (lngstart + lngend) / 2;
		LatLng point = new LatLng(midlat, midlon);// 中點
		LatLng point1 = new LatLng(latstart, lngstart);// 起點
		LatLng point2 = new LatLng(latend, lngend);// 終點

		//地圖縮放等級
		int zoomLevel[] = { 2000000, 1000000, 500000, 200000, 100000, 50000,
				25000, 20000, 10000, 5000, 2000, 1000, 500, 100, 50, 20, 0 };
		// 計算兩點之間的距離,重新設定縮放值,讓全部marker顯示在螢幕中。
		int jl = (int) DistanceUtil.getDistance(point1, point2);

		int i;
		for (i = 0; i < 17; i++) {
			if (zoomLevel[i] < jl) {
				break;
			}
		}
		//根據起點和終點的座標點計算出距離來對比縮放等級獲取最佳的縮放值,用來得到最佳的顯示折線圖的縮放等級
		float zoom = i + 2;
		// 設定當前位置顯示在地圖中心
		MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(point, zoom);// 設定縮放比例
		mBaiduMap.animateMapStatus(u);

		/**
		 * 建立自定義overlay
		 */
		// 起點位置
		LatLng geoPoint = new LatLng(latstart, lngstart);
		// 構建Marker圖示
		BitmapDescriptor bitmap = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_st);
		// 構建MarkerOption,用於在地圖上新增Marker
		OverlayOptions option = new MarkerOptions().position(geoPoint)
				.icon(bitmap).zIndex(8).draggable(true);

		// 終點位置
		LatLng geoPoint1 = new LatLng(latend, lngend);
		// 構建Marker圖示
		BitmapDescriptor bitmap1 = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_en);
		// 構建MarkerOption,用於在地圖上新增Marker
		OverlayOptions option1 = new MarkerOptions().position(geoPoint1)
				.icon(bitmap1).zIndex(8).draggable(true);
		// 在地圖上新增Marker,並顯示

		List<OverlayOptions> overlay = new ArrayList<OverlayOptions>();
		overlay.add(option);
		overlay.add(option1);
		mBaiduMap.addOverlays(overlay);

		//開始繪製
		drawMyRoute(latLngPolygon);


		
	}
/**
	 * 根據資料繪製軌跡
	 * 
	 * @param points2
	 */
	protected void drawMyRoute(List<LatLng> points2) {
		OverlayOptions options = new PolylineOptions().color(0xAAFF0000)
				.width(10).points(points2);
		mBaiduMap.addOverlay(options);
	}
效果如圖:


設定預設的地圖顯示的座標點,不加marker:
// 定義預設座標點(該座標預設西安)
		LatLng point = new LatLng(34.267, 108.9);
		// 設定當前位置顯示在地圖中心
		float f = mBaiduMap.getMaxZoomLevel();// 19.0 最小比例尺
		MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(point, f-10);// 設定縮放比例
		mBaiduMap.animateMapStatus(u);


百度地圖手勢操作設定:
//設定地圖相關手勢禁用
		mUiSettings = mBaiduMap.getUiSettings();
		//禁用旋轉
		mUiSettings.setRotateGesturesEnabled(false);
		//禁用俯視
		mUiSettings.setOverlookingGesturesEnabled(false);