android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .
本篇文章主要介紹如何在百度地圖上添加Overlay(即圖層或覆蓋物)。
Overlay簡介
Overlay通常被譯為“圖層”或“覆蓋物”。那么對(duì)于地圖而言,什么稱之為覆蓋物?“所有疊加或覆蓋到地圖之上的內(nèi)容,都被稱之為地圖覆蓋物,如標(biāo)注、矢量圖形元素(包括:折線和多邊形和圓)、定位圖標(biāo)等。覆蓋物擁有自己的地理坐標(biāo),當(dāng)您拖動(dòng)或縮放地圖時(shí),它們會(huì)相應(yīng)的移動(dòng)。”
為了讓大家能夠?qū)verlay有更進(jìn)一步的認(rèn)識(shí),我們?cè)偻ㄟ^下面的圖形來直觀的認(rèn)識(shí)它。?圖中標(biāo)記的那些紅色的圖標(biāo)A,B,...,J正是Overlay的其中一種形式。如果你了解PhotoShop中圖層的概念,這里應(yīng)該不難理解。我們可以這樣來理解地圖、圖層與圖層上標(biāo)記物三者的關(guān)系: 下圖中的那些紅色標(biāo)記并不屬于地圖的一部分,這些所有的標(biāo)記是附著在圖層上的,然后將圖層蒙在地圖之上。
百度地圖API提供的幾種Overlay
百度地圖API提供了以下幾種Overlay(覆蓋物):
1)Overlay:它是所有覆蓋物的抽象基類,所有的覆蓋物均繼承此類的方法,實(shí)現(xiàn)用戶自定義圖層顯示;
2)MyLocationOverlay:一個(gè)負(fù)責(zé)顯示用戶當(dāng)前位置的Overlay;
3)ItemizedOverlay:它包含了一個(gè)OverlayItem列表,相當(dāng)于一組分條的Overlay,通過繼承此類,將一組興趣點(diǎn)顯示在地圖上;
4)PoiOverlay:本地搜索圖層,提供某一特定地區(qū)的位置搜索服務(wù),比如在北京市搜索“公園”,通過此圖層將公園顯示在地圖上;
5)RouteOverlay:步行、駕車導(dǎo)航線路圖層,將步行、駕車出行方案的路線及關(guān)鍵點(diǎn)顯示在地圖上;
6)TransitOverlay:公交換乘線路圖層,將某一特定地區(qū)的公交出行方案的路線及換乘位置顯示在地圖上。
ItemizedOverlay的使用示例
ItemizedOverlay提供了一種快捷的方法,可以把標(biāo)記圖片和相關(guān)的文本分配給特定的地理位置。ItemizedOverlay實(shí)例可以處理每一個(gè)OverlayItem標(biāo)記的繪制、放置、單擊處理、焦點(diǎn)控制和布局優(yōu)化。例如,上面的那個(gè)地圖示例就是ItemizedOverlay。
下面將通過一個(gè)示例來演示ItemizedOverlay的使用。我們先來看看最終做出的效果,如下圖所示:
我們的目標(biāo):“顯示出百度地圖,并且給地圖添加一個(gè)圖層(ItemizedOverlay),該圖層上有兩個(gè)標(biāo)記項(xiàng)(OverlayItem),每個(gè)標(biāo)記項(xiàng)上都標(biāo)注有相應(yīng)的圖標(biāo)、文本信息,并且能夠響應(yīng)點(diǎn)擊事件(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)創(chuàng)建Activity繼承com.baidu.mapapi.MapActivity
packagecom.liufeng.baidumap;
importjava.util.List;
importandroid.graphics.drawable.Drawable;
importandroid.os.Bundle;
importcom.baidu.mapapi.BMapManager;
importcom.baidu.mapapi.GeoPoint;
importcom.baidu.mapapi.MapActivity;
importcom.baidu.mapapi.MapController;
importcom.baidu.mapapi.MapView;
importcom.baidu.mapapi.Overlay;
importcom.baidu.mapapi.OverlayItem;
/**
*?創(chuàng)建Activity(繼承com.baidu.mapapi.MapActivity)
*
*?@author?liufeng
*?@date?2011-05-02
*/
publicclassMainActivityextendsMapActivity?{
privateBMapManager?mapManager;
privateMapView?mapView;
privateMapController?mapController;
@Override
publicvoidonCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/**
*?初始化MapActivity
*/
mapManager?=newBMapManager(getApplication());
//?init方法的第一個(gè)參數(shù)需填入申請(qǐng)的API?Key
mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4",null);
super.initMapActivity(mapManager);
mapView?=?(MapView)?findViewById(R.id.map_View);
//?設(shè)置地圖模式為交通地圖
mapView.setTraffic(true);
//?設(shè)置啟用內(nèi)置的縮放控件
mapView.setBuiltInZoomControls(true);
/**
*?創(chuàng)建圖標(biāo)資源(用于顯示在overlayItem所標(biāo)記的位置)
*/
Drawable?marker?=this.getResources().getDrawable(R.drawable.ic_balloon);
//?為maker定義位置和邊界
marker.setBounds(0,0,?marker.getIntrinsicWidth(),?marker.getIntrinsicHeight());
/**
*?創(chuàng)建自定義的ItemizedOverlay
*/
CustomItemizedOverlay?overlay?=newCustomItemizedOverlay(marker,this);
/**
*?創(chuàng)建并添加第一個(gè)標(biāo)記:柳峰的家鄉(xiāng)(經(jīng)度:87.493147?緯度:47.118440)
*/
//?構(gòu)造一個(gè)經(jīng)緯度點(diǎn)
GeoPoint?point?=newGeoPoint((int)?(47.118440*?1E6),?(int)?(87.493147*?1E6));
//?創(chuàng)建標(biāo)記(新疆福??h)
OverlayItem?overlayItem?=newOverlayItem(point,"柳峰的家鄉(xiāng)","新疆福??h");
//?將標(biāo)記添加到圖層中(可添加多個(gè)OverlayItem)
overlay.addOverlay(overlayItem);
/**
*?創(chuàng)建并添加第二個(gè)標(biāo)記:美麗的烏倫古湖(經(jīng)度:87.249693?緯度:47.276757)
*/
point?=newGeoPoint((int)?(47.276757*?1E6),?(int)?(87.249693*?1E6));
//?創(chuàng)建標(biāo)記(烏倫古湖)
overlayItem?=newOverlayItem(point,"美麗的烏倫古湖","烏倫古湖是中國十大淡水湖之一");
//?將標(biāo)記添加到圖層中(可添加多個(gè)OverlayItem)
overlay.addOverlay(overlayItem);
/**
*?往地圖上添加自定義的ItemizedOverlay
*/
List?mapOverlays?=?mapView.getOverlays();
mapOverlays.add(overlay);
/**
*?取得地圖控制器對(duì)象,用于控制MapView
*/
mapController?=?mapView.getController();
//?設(shè)置地圖的中心
mapController.setCenter(point);
//?設(shè)置地圖默認(rèn)的縮放級(jí)別
mapController.setZoom(9);
}
@Override
protectedbooleanisRouteDisplayed()?{
returnfalse;
}
@Override
protectedvoidonDestroy()?{
if(mapManager?!=null)?{
mapManager.destroy();
mapManager?=null;
}
super.onDestroy();
}
@Override
protectedvoidonPause()?{
if(mapManager?!=null)?{
mapManager.stop();
}
super.onPause();
}
@Override
protectedvoidonResume()?{
if(mapManager?!=null)?{
mapManager.start();
}
super.onResume();
}
}
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;/** * 創(chuàng)建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;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);/** * 初始化MapActivity */mapManager = new BMapManager(getApplication());// init方法的第一個(gè)參數(shù)需填入申請(qǐng)的API KeymapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);super.initMapActivity(mapManager);mapView = (MapView) findViewById(R.id.map_View);// 設(shè)置地圖模式為交通地圖mapView.setTraffic(true);// 設(shè)置啟用內(nèi)置的縮放控件mapView.setBuiltInZoomControls(true);/** * 創(chuàng)建圖標(biāo)資源(用于顯示在overlayItem所標(biāo)記的位置) */Drawable marker = this.getResources().getDrawable(R.drawable.ic_balloon);// 為maker定義位置和邊界marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());/** * 創(chuàng)建自定義的ItemizedOverlay */CustomItemizedOverlay overlay = new CustomItemizedOverlay(marker, this);/** * 創(chuàng)建并添加第一個(gè)標(biāo)記:柳峰的家鄉(xiāng)(經(jīng)度:87.493147 緯度:47.118440) */// 構(gòu)造一個(gè)經(jīng)緯度點(diǎn)GeoPoint point = new GeoPoint((int) (47.118440 * 1E6), (int) (87.493147 * 1E6));// 創(chuàng)建標(biāo)記(新疆福海縣)OverlayItem overlayItem = new OverlayItem(point, "柳峰的家鄉(xiāng)", "新疆福??h");// 將標(biāo)記添加到圖層中(可添加多個(gè)OverlayItem)overlay.addOverlay(overlayItem);/** * 創(chuàng)建并添加第二個(gè)標(biāo)記:美麗的烏倫古湖(經(jīng)度:87.249693 緯度:47.276757) */point = new GeoPoint((int) (47.276757 * 1E6), (int) (87.249693 * 1E6));// 創(chuàng)建標(biāo)記(烏倫古湖)overlayItem = new OverlayItem(point, "美麗的烏倫古湖", "烏倫古湖是中國十大淡水湖之一");// 將標(biāo)記添加到圖層中(可添加多個(gè)OverlayItem)overlay.addOverlay(overlayItem);/** * 往地圖上添加自定義的ItemizedOverlay */List mapOverlays = mapView.getOverlays();mapOverlays.add(overlay);/** * 取得地圖控制器對(duì)象,用于控制MapView */mapController = mapView.getController();// 設(shè)置地圖的中心mapController.setCenter(point);// 設(shè)置地圖默認(rèn)的縮放級(jí)別mapController.setZoom(9);}@Overrideprotected boolean isRouteDisplayed() {return false;}@Overrideprotected void onDestroy() {if (mapManager != null) {mapManager.destroy();mapManager = null;}super.onDestroy();}@Overrideprotected void onPause() {if (mapManager != null) {mapManager.stop();}super.onPause();}@Overrideprotected void onResume() {if (mapManager != null) {mapManager.start();}super.onResume();}}
3)創(chuàng)建自定義的Overlay繼承ItemizedOverlay
packagecom.liufeng.baidumap;
importjava.util.ArrayList;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Point;
importandroid.graphics.drawable.Drawable;
importandroid.widget.Toast;
importcom.baidu.mapapi.ItemizedOverlay;
importcom.baidu.mapapi.MapView;
importcom.baidu.mapapi.OverlayItem;
importcom.baidu.mapapi.Projection;
/**
*?自定義ItemizedOverlay
*
*?@author?liufeng
*?@date?2011-05-02
*/
publicclassCustomItemizedOverlayextendsItemizedOverlay?{
privateArrayList?overlayItemList?=newArrayList();
privateContext?context;
publicCustomItemizedOverlay(Drawable?defaultMarker)?{
super(boundCenterBottom(defaultMarker));
}
publicCustomItemizedOverlay(Drawable?marker,?Context?context)?{
super(boundCenterBottom(marker));
this.context?=?context;
}
@Override
protectedOverlayItem?createItem(inti)?{
returnoverlayItemList.get(i);
}
@Override
publicintsize()?{
returnoverlayItemList.size();
}
publicvoidaddOverlay(OverlayItem?overlayItem)?{
overlayItemList.add(overlayItem);
this.populate();
}
@Override
publicvoiddraw(Canvas?canvas,?MapView?mapView,booleanshadow)?{
super.draw(canvas,?mapView,?shadow);
//?Projection接口用于屏幕像素點(diǎn)坐標(biāo)系統(tǒng)和地球表面經(jīng)緯度點(diǎn)坐標(biāo)系統(tǒng)之間的變換
Projection?projection?=?mapView.getProjection();
//?遍歷所有的OverlayItem
for(intindex?=this.size()?-1;?index?>=0;?index--)?{
//?得到給定索引的item
OverlayItem?overLayItem?=?getItem(index);
//?把經(jīng)緯度變換到相對(duì)于MapView左上角的屏幕像素坐標(biāo)
Point?point?=?projection.toPixels(overLayItem.getPoint(),null);
Paint?paintText?=newPaint();
paintText.setColor(Color.RED);
paintText.setTextSize(13);
//?繪制文本
canvas.drawText(overLayItem.getTitle(),?point.x?+10,?point.y?-15,?paintText);
}
}
@Override
//?處理點(diǎn)擊事件
protectedbooleanonTap(inti)?{
setFocus(overlayItemList.get(i));
Toast.makeText(this.context,?overlayItemList.get(i).getSnippet(),?Toast.LENGTH_SHORT).show();
returntrue;
}
}
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;}@Overrideprotected OverlayItem createItem(int i) {return overlayItemList.get(i);}@Overridepublic int size() {return overlayItemList.size();}public void addOverlay(OverlayItem overlayItem) {overlayItemList.add(overlayItem);this.populate();}@Overridepublic void draw(Canvas canvas, MapView mapView, boolean shadow) {super.draw(canvas, mapView, shadow);// Projection接口用于屏幕像素點(diǎn)坐標(biāo)系統(tǒng)和地球表面經(jīng)緯度點(diǎn)坐標(biāo)系統(tǒng)之間的變換Projection projection = mapView.getProjection();// 遍歷所有的OverlayItemfor (int index = this.size() - 1; index >= 0; index--) {// 得到給定索引的itemOverlayItem overLayItem = getItem(index);// 把經(jīng)緯度變換到相對(duì)于MapView左上角的屏幕像素坐標(biāo)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// 處理點(diǎn)擊事件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">
總結(jié)
以上是生活随笔為你收集整理的android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ 报错记录 ]使用springboot
- 下一篇: 严重:init datasource e