android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)
本篇文章主要介紹如何在百度地圖上添加Overlay(即圖層或覆蓋物)。
Overlay簡介
Overlay通常被譯為“圖層”或“覆蓋物”。那么對于地圖而言,什么稱之為覆蓋物?“所有疊加或覆蓋到地圖之上的內容,都被稱之為地圖覆蓋物,如標注、矢量圖形元素(包括:折線和多邊形和圓)、定位圖標等。覆蓋物擁有自己的地理坐標,當您拖動或縮放地圖時,它們會相應的移動?!?/p>
為了讓大家能夠對Overlay有更進一步的認識,我們再通過下面的圖形來直觀的認識它。?圖中標記的那些紅色的圖標A,B,...,J正是Overlay的其中一種形式。如果你了解PhotoShop中圖層的概念,這里應該不難理解。我們可以這樣來理解地圖、圖層與圖層上標記物三者的關系: 下圖中的那些紅色標記并不屬于地圖的一部分,這些所有的標記是附著在圖層上的,然后將圖層蒙在地圖之上。
百度地圖API提供的幾種Overlay
百度地圖API提供了以下幾種Overlay(覆蓋物):
1)Overlay:它是所有覆蓋物的抽象基類,所有的覆蓋物均繼承此類的方法,實現用戶自定義圖層顯示;
2)MyLocationOverlay:一個負責顯示用戶當前位置的Overlay;
3)ItemizedOverlay:它包含了一個OverlayItem列表,相當于一組分條的Overlay,通過繼承此類,將一組興趣點顯示在地圖上;
4)PoiOverlay:本地搜索圖層,提供某一特定地區的位置搜索服務,比如在北京市搜索“公園”,通過此圖層將公園顯示在地圖上;
5)RouteOverlay:步行、駕車導航線路圖層,將步行、駕車出行方案的路線及關鍵點顯示在地圖上;
6)TransitOverlay:公交換乘線路圖層,將某一特定地區的公交出行方案的路線及換乘位置顯示在地圖上。
ItemizedOverlay的使用示例
ItemizedOverlay提供了一種快捷的方法,可以把標記圖片和相關的文本分配給特定的地理位置。ItemizedOverlay實例可以處理每一個OverlayItem標記的繪制、放置、單擊處理、焦點控制和布局優化。例如,上面的那個地圖示例就是ItemizedOverlay。
下面將通過一個示例來演示ItemizedOverlay的使用。我們先來看看最終做出的效果,如下圖所示:
我們的目標:“顯示出百度地圖,并且給地圖添加一個圖層(ItemizedOverlay),該圖層上有兩個標記項(OverlayItem),每個標記項上都標注有相應的圖標、文本信息,并且能夠響應點擊事件(onTap)”。
1)布局文件res/layout/main.xml
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
/>
2)創建Activity繼承com.baidu.mapapi.MapActivity
package com.liufeng.baidumap;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.Overlay;
import com.baidu.mapapi.OverlayItem;
/**
* 創建Activity(繼承com.baidu.mapapi.MapActivity)
*
* @author liufeng
* @date 2011-05-02
*/
public class MainActivity extends MapActivity {
private BMapManager mapManager;
private MapView mapView;
private MapController mapController;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**
* 初始化MapActivity
*/
mapManager = new BMapManager(getApplication());
// init方法的第一個參數需填入申請的API Key
mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);
super.initMapActivity(mapManager);
mapView = (MapView) findViewById(R.id.map_View);
// 設置地圖模式為交通地圖
mapView.setTraffic(true);
// 設置啟用內置的縮放控件
mapView.setBuiltInZoomControls(true);
/**
* 創建圖標資源(用于顯示在overlayItem所標記的位置)
*/
Drawable marker = this.getResources().getDrawable(R.drawable.ic_balloon);
// 為maker定義位置和邊界
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
/**
* 創建自定義的ItemizedOverlay
*/
CustomItemizedOverlay overlay = new CustomItemizedOverlay(marker, this);
/**
* 創建并添加第一個標記:柳峰的家鄉(經度:87.493147 緯度:47.118440)
*/
// 構造一個經緯度點
GeoPoint point = new GeoPoint((int) (47.118440 * 1E6), (int) (87.493147 * 1E6));
// 創建標記(新疆福??h)
OverlayItem overlayItem = new OverlayItem(point, "柳峰的家鄉", "新疆福??h");
// 將標記添加到圖層中(可添加多個OverlayItem)
overlay.addOverlay(overlayItem);
/**
* 創建并添加第二個標記:美麗的烏倫古湖(經度:87.249693 緯度:47.276757)
*/
point = new GeoPoint((int) (47.276757 * 1E6), (int) (87.249693 * 1E6));
// 創建標記(烏倫古湖)
overlayItem = new OverlayItem(point, "美麗的烏倫古湖", "烏倫古湖是中國十大淡水湖之一");
// 將標記添加到圖層中(可添加多個OverlayItem)
overlay.addOverlay(overlayItem);
/**
* 往地圖上添加自定義的ItemizedOverlay
*/
List mapOverlays = mapView.getOverlays();
mapOverlays.add(overlay);
/**
* 取得地圖控制器對象,用于控制MapView
*/
mapController = mapView.getController();
// 設置地圖的中心
mapController.setCenter(point);
// 設置地圖默認的縮放級別
mapController.setZoom(9);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
protected void onDestroy() {
if (mapManager != null) {
mapManager.destroy();
mapManager = null;
}
super.onDestroy();
}
@Override
protected void onPause() {
if (mapManager != null) {
mapManager.stop();
}
super.onPause();
}
@Override
protected void onResume() {
if (mapManager != null) {
mapManager.start();
}
super.onResume();
}
}
3)創建自定義的Overlay繼承ItemizedOverlay
package com.liufeng.baidumap;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.widget.Toast;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.Projection;
/**
* 自定義ItemizedOverlay
*
* @author liufeng
* @date 2011-05-02
*/
public class CustomItemizedOverlay extends ItemizedOverlay {
private ArrayList overlayItemList = new ArrayList();
private Context context;
public CustomItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public CustomItemizedOverlay(Drawable marker, Context context) {
super(boundCenterBottom(marker));
this.context = context;
}
@Override
protected OverlayItem createItem(int i) {
return overlayItemList.get(i);
}
@Override
public int size() {
return overlayItemList.size();
}
public void addOverlay(OverlayItem overlayItem) {
overlayItemList.add(overlayItem);
this.populate();
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, shadow);
// Projection接口用于屏幕像素點坐標系統和地球表面經緯度點坐標系統之間的變換
Projection projection = mapView.getProjection();
// 遍歷所有的OverlayItem
for (int index = this.size() - 1; index >= 0; index--) {
// 得到給定索引的item
OverlayItem overLayItem = getItem(index);
// 把經緯度變換到相對于MapView左上角的屏幕像素坐標
Point point = projection.toPixels(overLayItem.getPoint(), null);
Paint paintText = new Paint();
paintText.setColor(Color.RED);
paintText.setTextSize(13);
// 繪制文本
canvas.drawText(overLayItem.getTitle(), point.x + 10, point.y - 15, paintText);
}
}
@Override
// 處理點擊事件
protected boolean onTap(int i) {
setFocus(overlayItemList.get(i));
Toast.makeText(this.context, overlayItemList.get(i).getSnippet(), Toast.LENGTH_SHORT).show();
return true;
}
}
4)配置AndroidManifest.xml
package="com.liufeng.baidumap"
android:versionCode="1"
android:versionName="1.0">
總結
以上是生活随笔為你收集整理的android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网站被百度提示安全风险拦截后如何快速申请
- 下一篇: python vimdiff_vimdi