本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物)。

Overlay简介

Overlay通常被译为“图层”或“覆盖物”。那么对于地图而言,什么称之为覆盖物?“所有叠加或覆盖到地图之上的内容,都被称之为地图覆盖物,如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。”

为了让大家能够对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

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;

/**

* 创建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方法的第一个参数需填入申请的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 =newCustomItemizedOverlay(marker,this);

/**

* 创建并添加第一个标记:柳峰的家乡(经度:87.493147 纬度:47.118440)

*/

// 构造一个经纬度点

GeoPoint point =newGeoPoint((int) (47.118440* 1E6), (int) (87.493147* 1E6));

// 创建标记(新疆福海县)

OverlayItem overlayItem =newOverlayItem(point,"柳峰的家乡","新疆福海县");

// 将标记添加到图层中(可添加多个OverlayItem)

overlay.addOverlay(overlayItem);

/**

* 创建并添加第二个标记:美丽的乌伦古湖(经度:87.249693 纬度:47.276757)

*/

point =newGeoPoint((int) (47.276757* 1E6), (int) (87.249693* 1E6));

// 创建标记(乌伦古湖)

overlayItem =newOverlayItem(point,"美丽的乌伦古湖","乌伦古湖是中国十大淡水湖之一");

// 将标记添加到图层中(可添加多个OverlayItem)

overlay.addOverlay(overlayItem);

/**

* 往地图上添加自定义的ItemizedOverlay

*/

List mapOverlays = mapView.getOverlays();

mapOverlays.add(overlay);

/**

* 取得地图控制器对象,用于控制MapView

*/

mapController = mapView.getController();

// 设置地图的中心

mapController.setCenter(point);

// 设置地图默认的缩放级别

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;/** * 创建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方法的第一个参数需填入申请的API KeymapManager.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));// 创建标记(新疆福海县)OverlayItem overlayItem = new OverlayItem(point, "柳峰的家乡", "新疆福海县");// 将标记添加到图层中(可添加多个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);}@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)创建自定义的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接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换

Projection projection = mapView.getProjection();

// 遍历所有的OverlayItem

for(intindex =this.size() -1; index >=0; index--) {

// 得到给定索引的item

OverlayItem overLayItem = getItem(index);

// 把经纬度变换到相对于MapView左上角的屏幕像素坐标

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

// 处理点击事件

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接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换Projection projection = mapView.getProjection();// 遍历所有的OverlayItemfor (int index = this.size() - 1; index >= 0; index--) {// 得到给定索引的itemOverlayItem 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) .相关推荐

  1. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)

    本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...

  2. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~...

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  3. android对skia的封装,Skia引擎API整理介绍(skia in Android 2.3 trunk)

    序 通过google, baidu,我们都很难搜索到关于skia引擎方面的文档,skia的官方wiki(http://code.google.com/p/skia) 也只有寥寥无几的文字简单介绍了Sk ...

  4. android使用post方法登录,使用REST API使用POST方法在Android中登录示例

    如果您熟悉库,则完成此任务的简单方法是使用库.我推荐 Ion,因为它小而且易于使用.添加库并将以下代码段添加到您选择的方法中. Ion.with(getApplicationContext()) .l ...

  5. android百度地图例子,使用百度地图API进行Android地图应用开发(Eclipse)(示例代码)...

    随着基于位置的服务的兴起,地图类App呈现爆发趋势.随着而来的是地图供应商开放大量的API.供开发人员开发基于PC或者移动端的应用程序. 如今我们研究使用百度地图SDK进行Android项目的开发. ...

  6. 百度地图API之MyLocationOverlay的使用(Android)

    http://www.linuxidc.com/Linux/2011-07/38867p2.htm 本篇文章主要讲解Baidu Map API中MyLocationOverlay的使用.故名思义,My ...

  7. Android 起调第三方导航,百度地图,高德地图,腾讯地图。起调高德地图导航

    主要工具类 /*** Created by meixi on 2018/6/29.* 使用第三方导航:高德.百度..........*/ public class AmapUtil {public s ...

  8. 百度地图WEB服务-地点检索API

    百度地图WEB服务-地点检索API 行政区划区域检索 圆形区域检索 矩形区域检索 地点检索服务(又名Place API)是百度地图开放平台提供的Web API接口服务: 该服务提供多种场景的地点(PO ...

  9. Android调用跳转百度地图、高德地图、腾讯地图进行目的地导航

    Android App跳转百度地图.高德地图.腾讯地图进行目的地导航. 先放上百度.高德.腾讯地图调起API文档地址,有些参数不懂可以参考. 百度地图:http://lbsyun.baidu.com/ ...

最新文章

  1. Linux wait() 和 waitpid()函数介绍
  2. hdu5025(bfs,状态压缩)
  3. JVM中对象如何在堆内存分配
  4. 分享我设计的iOS项目目录结构
  5. 共享两个做项目最常用功能操作的封装类
  6. LINUX考证优惠信息转发(图)
  7. java基础—网络编程——TCP客户端与服务端交互
  8. Python中fastapi构建的web项目使用pyinstaller打包为exe文件
  9. Manacher's algorithm: 最长回文子串算法
  10. 什么是SQL Server故障转移群集
  11. QThread的用法
  12. 微信公众号认证流程-微信公众号使用教程3
  13. 超强,废弃手机用来做服务器,不用root,外网可访问!
  14. JumpServer配置邮件服务
  15. 看完这篇,你就会知道 Lineage OS 系统的一切
  16. 一阶微分电路和积分电路有何功能
  17. 【JZOJ4597】现世斩
  18. 1411: 喜闻乐见的a+b(20进制)
  19. NLP之TF-IDF:VSM向量空间模型(仅关键词组成的浮点数字向量)的简介、TF-IDF(VSM的常用的统计法)简介之详细攻略
  20. 平衡串联超级电容器的策略

热门文章

  1. java 手机动态口令_动态密码TOTP的Java实现
  2. 基于java的扫雷游戏设计01
  3. 台式机dp接口_了解笔记本电脑的各种视频接口
  4. WPF图片背景色过滤
  5. 济宁市计算机技能大赛,【嘉职动态】2019年济宁市职业院校技能大赛嘉祥职业中专赛区圆满完成任务...
  6. 中望3D 2021 自动缩放基准面大小
  7. t-SNE数据降维(2维3维)及可视化
  8. 实现《你的名字》同款滤镜,python+opencv
  9. Python面向对象——面向对象介绍、实现面向对象编程、定义类、再调用类产生对象、总结__init__方法、查找顺序
  10. 示波器基本原理之六:示波器的基本控制