转载请标明:http://blog.csdn.net/u012637501
目前百度地图SDK所提供的地图等级为3-19级,所包含的信息有建筑物、道路、河流、学校、公园等内容。所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。如标注、矢量图形元素(包括:折线、多边形和圆等)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。我们可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息。
一、APIs
1.LatLng类
(1)作用:地理坐标基本数据结构,在包com.baidu.mapapi.model.LatLng中。
(2)构造方法与成员变量
LatLng(double latitude, double longitude) 构造函数
◇final double longitude :经度
◇final double latitude :纬度
2.Overlay类
(1)作用:地图覆盖物基类,已知直接子类Marker, Polygon, Polyline, Text
(2)成员方法
◇Bundle getExtraInfo() :获取覆盖物额外信息
◇int getZIndex() :获取覆盖物 zIndex
◇boolean isVisible() :设置覆盖物可见性
◇void remove() :删除该覆盖物
◇void setExtraInfo(Bundle extraInfo) :设置覆盖物额外信息
◇void setVisible(boolean visible) :获取覆盖物可见性
◇void setZIndex(int zIndex) :设置覆盖物 zIndex
3.OverlayOptions类
(1)作用:地图覆盖物选型基类,直接已知子类MarkerOptions,
PolygonOptions, PolylineOptions, TextOptions等
(2)构造方法:OverlayOptions()
4.PolygonOptions类
(1)作用:创建多边形覆盖物选项类
(2)构造方法:PolygonOptions()
(3)常用方法
◇PolygonOptions points(java.util.List<LatLng> points) :设置多边形坐标点列表
◇PolygonOptions stroke(Stroke stroke) :设置多边形边框信息
◇PolygonOptions visible(boolean visible) :设置多边形可见性
◇PolygonOptions zIndex(int zIndex) :设置多边形 zIndex,即所在的层级
◇PolygonOptions fillColor(int color) :设置多边形填充颜色
5.Marker类
(1)作用:定义地图
Marker 覆盖物基类,继承于Overlay类
(2)常用方法
◇LatLng getPosition() :获取 Marker 覆盖物的位置坐标
◇void setDraggable(boolean draggable) :设置 marker 是否允许拖拽,默认不可拖拽
◇void setIcon(BitmapDescriptor icon) :设置 Marker 覆盖物的图标,相同图案的 icon 的 Marker 最好使用同一个 BitmapDescriptor
对象以节省内存空间
◇void setIcons(java.util.ArrayList<BitmapDescriptor> icons) :设置 Marker 覆盖物的图标,相同图案的 icon 的 marker 最好使用同一个
BitmapDescriptor 对象以节省内存空间。
◇void setPeriod(int period) :设置多少帧刷新一次图片资源,Marker动画的间隔时间,值越小动画越快
◇void setPerspective(boolean perspective) :设置是否开启 Marker 覆盖物近大远小效果,默认开启
◇void setPosition(LatLng position) :设置 Marker 覆盖物的位置坐标
◇void setRotate(float rotate) :设置 Marker 覆盖物旋转角度,逆时针
◇void setTitle(java.lang.String title) :设置 Marker 覆盖物的标题
◇void setToTop() :设置当前marker在最上面
6.MarkerOptions类
(1)作用:地图 Marker 覆盖物实现类 ,继承于OverlayOptions类
(2)构造方法:MarkerOptions()
(3)常用方法
MarkerOptions draggable(boolean draggable) :设置 marker 是否允许拖拽,默认不可拖拽
MarkerOptions period(int period) :设置多少帧刷新一次图片资源,Marker动画的间隔时间,值越小动画越快
MarkerOptions perspective(boolean perspective) :设置是否开启 marker 覆盖物近大远小效果,默认开启
MarkerOptions position(LatLng position) :设置 marker 覆盖物的位置坐标
MarkerOptions rotate(float rotate) :设置 marker 覆盖物旋转角度,逆时针
MarkerOptions title(java.lang.String title) :设置 marker 覆盖物的标题
MarkerOptions visible(boolean visible) :设置 marker 覆盖物的可见性
MarkerOptions zIndex(int zIndex) :设置 marker 覆盖物的 zIndex
7.BitmapDescriptor&BitmapDescriptorFactory类
(1)作用:BitmapDescriptor对象是bitmap (位图)描述信息;BitmapDescriptorFactory对象是bitmap
描述信息工厂类,在使用该类方法之前请确保已经调用了 SDKInitializer.initialize(Context) 函数以提供全局 Context 信息。
(2)BitmapDescriptorFactory重要方法
static BitmapDescriptor fromResource(int resourceId) :根据资源 Id 创建 bitmap 描述信息
static BitmapDescriptor fromBitmap(Bitmap image) :根据 Bitmap 创建描述信息
static BitmapDescriptor fromAsset(java.lang.String assetName) :根据资源名称创建bitmap描述信息
8.InfoWindow类
(1)作用:在地图中显示一个信息窗口,可以设置一个View作为该窗口的内容,也可以设置一个
BitmapDescriptor 作为该窗口的内容。
(2)构造方法
InfoWindow(BitmapDescriptor bd, LatLng position, int yOffset, InfoWindow.OnInfoWindowClickListener listener)
通过传入的 bitmap descriptor 构造一个 InfoWindow。
InfoWindow(View view, LatLng position, int yOffset)
通过传入的 view 构造一个 InfoWindow, 此时只是利用该view生成一个Bitmap绘制在地图中。
二、地图覆盖物实现方法
1.标注覆盖物
我们可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位置上添加标注信息。
(1)只显示不可拖拽(Marker)标注覆盖物
- BaiduMap mBaiduMap = mapView.getMap();
- //定义Maker坐标点
- LatLng point = new LatLng(39.963175, 116.400244);
- //构建Marker图标
- BitmapDescriptor bitmap = BitmapDescriptorFactory
- .fromResource(R.drawable.icon_marka);
- //构建MarkerOption,用于在地图上添加Marker
- OverlayOptions option = new MarkerOptions()
- .position(point)
- .icon(bitmap);
- //在地图上添加Marker,并显示
- mBaiduMap.addOverlay(option);
(2)显示可拖拽(Marker)标注覆盖物
针对已经添加在地图上的标注,可采用如下方式进行手势拖拽:
第一步,设置可拖拽
- OverlayOptions options = new MarkerOptions()
- .position(llA) //设置marker的位置
- .icon(bdA) //设置marker图标
- .zIndex(9) //设置marker所在层级
- .draggable(true); //设置手势拖拽
- //将marker添加到地图上
- marker = (Marker) (mBaiduMap.addOverlay(options));
第二步,设置监听方法
- //调用BaiduMap对象的setOnMarkerDragListener方法设置marker拖拽的监听
- mBaiduMap.setOnMarkerDragListener(new OnMarkerDragListener() {
- public void onMarkerDrag(Marker marker) {
- //拖拽中
- }
- public void onMarkerDragEnd(Marker marker) {
- //拖拽结束
- }
- public void onMarkerDragStart(Marker marker) {
- //开始拖拽
- }
- });
(3)显示动态(Marker)标注覆盖物
- // 通过marker的icons设置一组图片,再通过period设置多少帧刷新一次图片资源
- ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();
- giflist.add(bdA);
- giflist.add(bdB);
- giflist.add(bdC);
- OverlayOptions ooD = new MarkerOptions().position(pt).icons(giflist)
- .zIndex(0).period(10);
- mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));
2.几何图形覆盖物
地图SDK提供多种结合图形覆盖物,利用这些图形,可帮助您构建更加丰富多彩的地图应用。目前提供的几何图形有:点(Dot)、折线(Polyline)、弧线(Arc)、圆(Circle)、多边形(Polygon)
- //定义多边形的五个顶点
- LatLng pt1 = new LatLng(39.93923, 116.357428);
- LatLng pt2 = new LatLng(39.91923, 116.327428);
- LatLng pt3 = new LatLng(39.89923, 116.347428);
- LatLng pt4 = new LatLng(39.89923, 116.367428);
- LatLng pt5 = new LatLng(39.91923, 116.387428);
- List<LatLng> pts = new ArrayList<LatLng>();
- pts.add(pt1);
- pts.add(pt2);
- pts.add(pt3);
- pts.add(pt4);
- pts.add(pt5);
- //构建用户绘制多边形的Option对象
- OverlayOptions polygonOption = new PolygonOptions()
- .points(pts)
- .stroke(new Stroke(5, 0xAA00FF00))
- .fillColor(0xAAFFFF00);
- //在地图上添加多边形Option,用于显示
- mBaiduMap.addOverlay(polygonOption);
3. 文字覆盖物
文字,在地图中也是一种覆盖物,开发者可利用相关的接口,快速实现在地图上书写文字的需求。
- //定义文字所显示的坐标点
- LatLng llText = new LatLng(39.86923, 116.397428);
- //构建文字Option对象,用于在地图上添加文字
- OverlayOptions textOption = new TextOptions()
- .bgColor(0xAAFFFF00)
- .fontSize(24)
- .fontColor(0xFFFF00FF)
- .text("百度地图SDK")
- .rotate(-30)
- .position(llText);
- //在地图上添加该文字对象并显示
- mBaiduMap.addOverlay(textOption);
4.弹出窗覆盖物
弹出窗覆盖物的实现方式如下,我们可利用此接口,构建具有更强交互性的地图页面。 当点击Marker后弹出InfoWindow的示例图,我们只需将InfoWindow的显示方法写在Maker的点击事件处理中即可实现该效果。
- //创建InfoWindow展示的view
- Button button = new Button(getApplicationContext());
- button.setBackgroundResource(R.drawable.popup);
- //定义用于显示该InfoWindow的坐标点
- LatLng pt = new LatLng(39.86923, 116.397428);
- //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
- InfoWindow mInfoWindow = new InfoWindow(button, pt, -47);
- //显示InfoWindow
- mBaiduMap.showInfoWindow(mInfoWindow);
5.删除覆盖物
Marker marker = (Marker)mBaiduMap.addOverlay(option);
marker.remove(); //调用Marker对象的remove方法实现指定marker的删除几何图形覆盖物
参考:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_4_0/
参考:http://developer.baidu.com/map/index.php?title=androidsdk/guide/basicmap
三、源码实战
1.src/../MainActivity.java
功能:(1)获取MapView组件对象,BaiduMap对象,即地图控制器 (2)管理地图生命周期
- package com.example.baidumap;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import com.baidu.mapapi.SDKInitializer;
- import com.baidu.mapapi.map.BaiduMap;
- import com.baidu.mapapi.map.MapView;
- import com.baidu.mapapi.map.Marker;
- public class MainActivity extends Activity{
- private MapView mapView = null;
- private BaiduMap baiduMap = null;
- private Button iconMarkBtn = null;
- private Button geMarkBtn = null;
- private Button textMarkBtn = null;
- private Button clearBtn = null;
- private Marker mark = null;
- private void init()
- {
- iconMarkBtn = (Button)findViewById(R.id.iconMarker);
- geMarkBtn = (Button)findViewById(R.id.geometricMark);
- textMarkBtn = (Button)findViewById(R.id.textMark);
- clearBtn = (Button)findViewById(R.id.clearOverlay);
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //1.在使用SDK组件之间初始化context信息,传入ApplicationContext
- SDKInitializer.initialize(getApplicationContext());
- setContentView(R.layout.main);
- this.init(); //初始化界面控件
- //2.获取地图控件引用
- mapView = (MapView)findViewById(R.id.bmapView);
- baiduMap = mapView.getMap(); //获取地图控制器
- //3.获取标注覆盖自定义类,调用相关方法标注类型的覆盖物
- final MarkOverlayTest markOverlayTest = new MarkOverlayTest(getApplicationContext(),baiduMap); //实例化自定义类对象
- iconMarkBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- mark=markOverlayTest.markIcon(); //调用markOverlay方法标注覆盖物
- }
- });
- //4.几何图形覆盖
- geMarkBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- markOverlayTest.markGeometricFigure(); //调用markOverlay方法标注覆盖物
- }
- });
- //5.文字覆盖
- textMarkBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- markOverlayTest.markText(); //调用markOverlay方法标注覆盖物
- }
- });
- //6.清除标志物,调用Marker对象的remover方法实现指定marker的删除
- clearBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- mark.remove();
- }
- });
- }
- //7.百度地图声明周期控制
- protected void onDestroy() {
- mapView.onDestroy(); //停止使用百度地图
- super.onDestroy();
- }
- protected void onResume() {
- mapView.onResume(); //恢复使用百度地图
- super.onResume();
- }
- protected void onPause() {
- mapView.onPause(); //暂停使用百度地图
- super.onPause();
- }
- }
2.src/.../MarkOverlayTest.java
功能:为了更能体现面向对象的思想,自己在工程中自定义了一个类,通过定义不同的成员方法来实现不同覆盖物对地图的标注。
- package com.example.baidumap;
- import java.util.ArrayList;
- import java.util.List;
- import android.R.color;
- import android.content.Context;
- import android.widget.Button;
- import com.baidu.mapapi.map.BaiduMap;
- import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
- import com.baidu.mapapi.map.BitmapDescriptor;
- import com.baidu.mapapi.map.BitmapDescriptorFactory;
- import com.baidu.mapapi.map.InfoWindow;
- import com.baidu.mapapi.map.Marker;
- import com.baidu.mapapi.map.MarkerOptions;
- import com.baidu.mapapi.map.OverlayOptions;
- import com.baidu.mapapi.map.PolygonOptions;
- import com.baidu.mapapi.map.Stroke;
- import com.baidu.mapapi.map.TextOptions;
- import com.baidu.mapapi.model.LatLng;
- public class MarkOverlayTest {
- private BaiduMap baiduMap = null;
- private Marker marker = null;
- private Context context = null;
- /*------1.构造方法 :传递主Acitivity中的BaiduMap实例----------*/
- //传递主UI上下文对象,BaiduMap实例
- public MarkOverlayTest(Context context,BaiduMap baiduMap) {
- this.baiduMap = baiduMap;
- this.context = context;
- }
- /*------2.标注图片覆盖物方法--------*/
- public Marker markIcon()
- {
- LatLng point = new LatLng(39.963175, 116.400244); //定义Marker坐标点
- /*(1)显示标志物(不可拖拽)
- BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_red);//构建Marker图标
- OverlayOptions option = new MarkerOptions().position(point).icon(bitmap);
- //构建MarkerOption,用于在地图上添加Marker
- marker = (Marker)baiduMap.addOverlay(options);//在地图上添加Marker,并显示
- return marker; */
- /*(2)给Marker增加动画的能力
- * 自v3.3版本起,SDK提供了给Marker增加动画的能力。通过marker的icons设置一组图片,
- * 在通过period设置多少帧刷新一次图片资源 */
- ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>();
- giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_red));
- giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_blue));
- OverlayOptions options = new MarkerOptions().position(point).draggable(true).icons(giflist).zIndex(0).period(10);
- marker = (Marker)baiduMap.addOverlay(options); //获取覆盖物Marker对象
- baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
- @Override
- public boolean onMarkerClick(Marker arg0) {
- /*--------弹出窗覆盖物---------*/
- //(1)创建InfoWindow展示的view
- Button button = new Button(context);
- button.setText("北京师范大学");
- //(2)定义用于显示该InfoWindow的坐标
- LatLng pt = new LatLng(39.993175, 116.900244);
- //(3)创建InfoWindow,传入VIew,地理坐标,y轴偏移量
- InfoWindow mInfoWindow = new InfoWindow(button,pt,-47);
- //(4)显示InfoWindow
- baiduMap.showInfoWindow(mInfoWindow);
- return true;
- }
- });
- return marker;
- /*(3)标志物可拖拽
- * //第一步:设置可拖拽
- BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka_red);//构建Marker图标
- OverlayOptions options = new MarkerOptions()
- .position(point) //设置marker位置
- .icon(bitmap) //设置marker图标
- .zIndex(9) //设置marker所在的层级
- .draggable(true); //设置手势拖拽
- marker = (Marker)baiduMap.addOverlay(options); //将marker添加到地图上
- //第二步:设置监听方法
- baiduMap.setOnMarkerDragListener(new OnMarkerDragListener() {
- public void onMarkerDragStart(Marker arg0) { //开始拖拽
- }
- public void onMarkerDragEnd(Marker arg0) { //拖拽结束
- }
- public void onMarkerDrag(Marker arg0) { //拖拽中
- }
- });
- return marker;*/
- }
- /*-------3.标注几何图形覆盖物------*/
- public void markGeometricFigure()
- {
- //(1)定义多边形的五个顶点
- LatLng pt1 = new LatLng(39.93923, 116.357428);
- LatLng pt2 = new LatLng(39.91923, 116.327428);
- LatLng pt3 = new LatLng(39.89923, 116.347428);
- LatLng pt4 = new LatLng(39.89923, 116.367428);
- LatLng pt5 = new LatLng(39.91923, 116.387428);
- List<LatLng> pts = new ArrayList<LatLng>();
- pts.add(pt1);
- pts.add(pt2);
- pts.add(pt3);
- pts.add(pt4);
- pts.add(pt5);
- //(2)构建用户绘制多边形(polygon)的Option对象
- OverlayOptions polygonOptions = new PolygonOptions()
- .points(pts)
- .stroke(new Stroke(5,0xAA00FF00))
- .fillColor(0xAAFFFF00);
- //(2)在地图上添加多边形option,用于显示
- baiduMap.addOverlay(polygonOptions);
- }
- /*-------4.标注文字覆盖物------*/
- public void markText()
- {
- //(1)定义文字所显示的坐标点
- LatLng text = new LatLng(39.86923, 116.397428);
- OverlayOptions textOptions = new TextOptions()
- .bgColor(0xAAFFFF00)
- .fontSize(24)
- .fontColor(0xFFFF00FF)
- .text("百度地图文字覆盖物")
- .rotate(-30)
- .position(text);
- //(2)在地图上添加该文字对象并显示
- baiduMap.addOverlay(textOptions);
- }
- }
运行结果:
说明分析:
(1)关于MarkOverlayTest类中的构造方法:
public MarkOverlayTest(Context context,BaiduMap baiduMap) {
this.baiduMap = baiduMap;
this.context = context;
}
由于在自定义类中,需要通过BaiduMap地图控制器实例的addOverLay(option)对地图添加不同的标注覆盖物,并且在实现-弹出窗覆盖物功能添加view时需要传递一个上下文Context对象,因此,我们通过类的构造函数将主UI的相关对象传递进来,从而实现目的。
(2)如果需要实现:当我们点击标注覆盖物或者整个地图界面的任何地方都弹出窗覆盖物,可以通过调用BaiduMap的setOnxxxxListener接口实现。图片标注覆盖物响应如下:
baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker arg0) {
/*--------弹出窗覆盖物---------*/
//(1)创建InfoWindow展示的view
Button button = new Button(context);
button.setText("北京师范大学");
//(2)定义用于显示该InfoWindow的坐标
LatLng pt = new LatLng(39.993175, 116.900244);
//(3)创建InfoWindow,传入VIew,地理坐标,y轴偏移量
InfoWindow mInfoWindow = new InfoWindow(button,pt,-47);
//(4)显示InfoWindow
baiduMap.showInfoWindow(mInfoWindow);
return true;
}
});