天天看點

222.map4-百度地圖添加覆寫物

所有疊加或覆寫到地圖的内容,我們統稱為地圖覆寫物。如标注、矢量圖形元素(包括:折線和多邊形和圓)、定位圖示等。覆寫物擁有自己的地理坐标,當您拖動或縮放地圖時,它們會相應的處理。

覆寫物包括:本地覆寫物和搜尋覆寫物

本地覆寫物的抽象基類:OverlayOptions(核心類)

圓形覆寫物: CircleOptions

文字覆寫物: TextOptions

marker覆寫物: MarkerOptions

圓點覆寫物:DotOptions

ground 覆寫物:GroundOverlayOptions

圓點覆寫物:DotOptions

多邊形覆寫物:PolygonOptions

折線覆寫物:PolylineOptions

弧線覆寫物:ArcOptions

搜尋覆寫物抽象類: OverlayManager (核心類)

本地搜尋覆寫物:PoiOverlay

駕車路線覆寫物:DrivingRouteOverlay

步行路線覆寫物:WalkingRouteOverlay

換乘路線覆寫物:TransitOverlay

公交路線覆寫物:BusLineOverlay

地圖添加圓圈

package com.ldw.zbqq;

import android.os.Bundle;

import com.baidu.mapapi.map.CircleOptions;

/*
 * 覆寫物,地圖上畫圓形圖像
 */
public class CircleOptionsDemo extends BaseActivity {
	
	//重寫onCreate添加新方法,畫覆寫物
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		draw();
	}

	private void draw() {
		// 定義一個圓
		// 圓心 + 半徑
		
		// 顔色 + 是否填充 + 圓的線寬
		
		// 覆寫物的操作 
		// ① 建立自己
		CircleOptions circleOptions = new CircleOptions();
		// ② 給自己設定資料
		circleOptions.center(hmPos)// 圓心
		.radius(1000)// 半徑 機關是米
		.fillColor(0x60FF0000);// 透明度 紅 綠 藍
//		.stroke(new Stroke(10, 0x600FF000));// 邊框 參數1 線寬 參數2 顔色
		// ③ 把覆寫物添加到地圖中
		baiduMap.addOverlay(circleOptions);
	}
}
           

添加文字

package com.ldw.zbqq;

import android.graphics.Typeface;
import android.os.Bundle;

import com.baidu.mapapi.map.TextOptions;

/*
 * 文字覆寫
 */
public class TextOptionsDemo extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		draw();
	}

	private void draw() {
		TextOptions textOptions = new TextOptions();
		textOptions.fontColor(0x60FF0000)
		.text("文字") // 文字内容
		.position(hmPos) // 位置
		.fontSize(24)// 字型大小
		.typeface(Typeface.SERIF);// 字型,對稱的
//		.rotate(30);// 旋轉
		baiduMap.addOverlay(textOptions);
	}
}
           

MarkerOptions

某個類型的覆寫物,包含多個類型相同、顯示方式相同、處理方式相同的項時,使用此類。或者用來标記位置。

開發步驟

設定 marker 覆寫物的位置坐标:position(LatLng position)

設定 marker 覆寫物的标題:title(java.lang.String title)

設定 Marker 覆寫物的圖示:icon(BitmapDescriptor icon)

設定 marker 是否允許拖拽,預設不可拖拽:draggable(boolean draggable)

準備好泡泡的layout

在MapView中添加該泡泡

addView(View child, LayoutParams params)

LayoutParams:MapViewLayoutParams

layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)設定為地圖模式, yOffset(-5)設定y軸離position的距離

在處理onMarkerClick時更新Layout,利用LayoutParams傳遞點位資訊,同時可以擷取标題資訊,設定給TextView

圖檔的切換

//給向東的點添加一個切換動畫,圖檔切換
		ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
		bitmaps.add(bitmapDes);
		bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));
		markerOptions = new MarkerOptions().title("向東")
				.position(new LatLng(latitude, longitude + 0.001))
				.icons(bitmaps)// 顯示多個圖檔來回切換 幀動畫
				.period(10);// 設定多少幀重新整理一次圖檔資源,Marker動畫的間隔時間,值越小動畫越快
		baiduMap.addOverlay(markerOptions);
           

Mark覆寫,建立了2個點來添加餐廳的圖示位置,并添加了點選事件,點選的時候會彈出pop,通過arrayList讓某一個點實作圖檔切換達到閃動的目的

package com.ldw.zbqq;

import java.util.ArrayList;

import android.os.Bundle;
import android.view.View;

import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapViewLayoutParams;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.model.LatLng;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;

/*
 * mark覆寫物
 */
public class MarkerOptionsDemo extends BaseActivity{

	private View pop;
	private TextView title;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		draw();
		
		// 點選某一個Marker 在腦袋上彈出pop
		initPop();
		
		
		
	}

	private void initPop() {
		// 加載pop 添加到mapview 設定為隐藏
		//布局填充
		pop = View.inflate(getApplicationContext(), R.layout.pop, null);
		//建立一個布局
		LayoutParams params = new MapViewLayoutParams.Builder()
		.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)// 按照經緯度設定位置
		.position(hmPos)// 不能傳null 設定為mapMode時 必須設定position
		.width(MapViewLayoutParams.WRAP_CONTENT)
		.height(MapViewLayoutParams.WRAP_CONTENT)
		.build();
		//pop添加到mapView中
		//params必須是百度地圖的params
		mapview.addView(pop, params);
		//一開始隐藏pop
		pop.setVisibility(View.INVISIBLE);
		title = (TextView) pop.findViewById(R.id.title);
		
		
	}

	private void draw() {
		//描述一張圖檔,聽過工廠類建立這個對象
		BitmapDescriptor bitmapDes = BitmapDescriptorFactory
				.fromResource(R.drawable.eat_icon);
		
		MarkerOptions markerOptions = new MarkerOptions();
		markerOptions.position(hmPos)// 設定位置
				.icon(bitmapDes)// 設定圖示
				.draggable(true)// 設定是否可以拖拽 預設是否
				.title("餐廳");// 設定标題
		//添加到圖層
		baiduMap.addOverlay(markerOptions);
		
		//添加一個新的坐标點
		markerOptions = new MarkerOptions().title("向北")
				.position(new LatLng(latitude + 0.001, longitude))
				.icon(bitmapDes);
		baiduMap.addOverlay(markerOptions);
		
		//給向東的點添加一個切換動畫,圖檔切換
		ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
		bitmaps.add(bitmapDes);
		bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));
		markerOptions = new MarkerOptions().title("向東")
				.position(new LatLng(latitude, longitude + 0.001))
				.icons(bitmaps)// 顯示多個圖檔來回切換 幀動畫
				.period(10);// 設定多少幀重新整理一次圖檔資源,Marker動畫的間隔時間,值越小動畫越快
		baiduMap.addOverlay(markerOptions);
		
		//添加地圖上面的點選事件
		baiduMap.setOnMarkerClickListener(new MyListener());
	}
	
	class MyListener implements OnMarkerClickListener{

		@Override
		public boolean onMarkerClick(Marker arg0) {
			// 當點選時 更新pop的位置 設定為顯示
			LayoutParams params = new MapViewLayoutParams.Builder()
			.layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)// 按照經緯度設定位置
			.position(arg0.getPosition())// 不能傳null
			.width(MapViewLayoutParams.WRAP_CONTENT)
			.height(MapViewLayoutParams.WRAP_CONTENT)
			.yOffset(-5)// 距離position的像素 向下是正值 向上是負值
			.build();
			mapview.updateViewLayout(pop, params);
			pop.setVisibility(View.VISIBLE);//pop可見
			title.setText(arg0.getTitle());//設定标題
			
			return true;
		}
		
	}
}
           

基類

package com.ldw.zbqq;

import com.baidu.mapapi.map.BaiduMap;
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 android.app.Activity;
import android.os.Bundle;

/*
 * 基類,後面直接來繼承
 */
public class BaseActivity extends Activity {

	protected BaiduMap baiduMap;
	protected MapView mapview;
	protected double latitude = 22.6934487;// 緯度
	protected double longitude = 114.5112523;// 經度
	protected LatLng hmPos = new LatLng(latitude, longitude);
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		initManager();
		setContentView(R.layout.common);
		init();
	}
	
	private void initManager() {
//		SDKInitializer.initialize(getApplicationContext()); // 不能傳遞Activity,必須是全局Context
	}

	private void init() {
		// 設定地圖級别(V2.X 3-19 V1.X 3-18)
		// ① 修改了檔案的格式 優化了空間的使用(北京 110M 15M)
		// ② 增加了級别 3D效果(18 19)

		mapview = (MapView) findViewById(R.id.mapview);

		baiduMap = mapview.getMap();
		// BaiduMap: 管理具體的某一個MapView : 旋轉,移動,縮放,事件。。

		// 描述地圖狀态将要發生的變化 使用工廠類MapStatusUpdateFactory建立
		MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 預設的級别12
		// 設定縮放級别
		baiduMap.setMapStatus(mapstatusUpdate);

		// LatLng latlng = new LatLng(arg0, arg1);// 坐标 經緯度 參數1 緯度 參數2 經度
		MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory
				.newLatLng(hmPos);
		// 設定中心點 預設是天安門
		baiduMap.setMapStatus(mapstatusUpdatePoint);

		// mapview.showZoomControls(false);// 預設是true 顯示縮放按鈕
		//
		// mapview.showScaleControl(false);// 預設是true 顯示标尺
	}
	@Override
	protected void onDestroy() {
		mapview.onDestroy();
		super.onDestroy();
	}
	@Override
	protected void onResume() {
		mapview.onResume();
		super.onResume();
	}

	@Override
	protected void onPause() {
		mapview.onPause();
		super.onPause();
	}
}
           

MainActivity.java清單顯示

package com.ldw.zbqq;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.baidu.mapapi.SDKInitializer;

public class MainActivity extends Activity {

	private static String[] objects = new String[] { "hello world", "圖層",
		"圓形覆寫物", "展示文字", "marker覆寫物", "矩形範圍内搜尋", "圓形區域", "全城搜尋", "駕車路線",
		"步行路線", "公交換乘", "我的位置" };
private static Class[] clazzs = new Class[] { HelloWorld.class,
		LayerDemo.class,CircleOptionsDemo.class,TextOptionsDemo.class,MarkerOptionsDemo.class,PoiSearchInBoundsDemo.class};
private ListView list;
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	list = (ListView) findViewById(R.id.list);

	adapter = new ArrayAdapter<String>(getApplicationContext(),
			R.layout.item, objects);

	list.setAdapter(adapter);
	list.setOnItemClickListener(new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> parent, View view,
				int position, long id) {
			Intent intent = new Intent(getApplicationContext(),
					clazzs[position]);
			startActivity(intent);
		}
	});

	//注冊代碼,這個是異步的方法,清單一打開的時候就注冊了,防止後面加載資料的時候還沒有注冊完
	SDKInitializer.initialize(getApplicationContext()); // 不能傳遞Activity,必須是全局Context
}
    
}