当前位置: 首页 > >

高德地图 Android SDK 开发指南 V2.2.0

发布时间:

高德地图 Android SDK 开发指南
V2.2.0

高德软件有限公司 2014 年 3 月·北京

法律声明
版权所有?2013,高德集团。 保留一切权利。 本文档包含的所有内容除特别声明之外,版权均属于高德集团所有,受《中华人民共和国著作权法》 及相关法律法规和中国加入的所有知识产权方面的国际条约的保护。未经本公司书面许可,任何单位和个 人不得以任何方式(电子或机械,包括影印)翻印或转载本文档的任何部分,否则将视为侵权,高德集团 保留依法追究其法律责任的权利。 高德地图 API 的一切有关权利属于高德集团所有。 本文档并不代表供应商或其代理的承诺, 高德集团可在不作任何申明的情况下对本文档内容进行修改。 本文档中所涉及的软件产品及其后续升级产品均由高德集团制作并负责全权销售。 本文档中提到的其它公司及其产品的商标所有权属于该商标的所有者。

高德地图 联系邮箱:api@autonavi.com 技术交流论坛:bbs.amap.com 官方微博:http://weibo.com/gaodedituapi 商务合作联系人:张先生 电话:010-84107170 电子邮箱: shiyue.zhang@autonavi.com

高德地图 API 欢迎用户的任何建议或意见。

目录
1 简介 ....................................................................................................................................... 1 1.1 1.2 1.3 1.4 2.1 2.2 Android SDK .................................................................................................................................. 1 面向的读者 ....................................................................................................................................... 1 兼容性 ............................................................................................................................................... 1 申请 API Key ................................................................................................................................... 1 地图功能变更 ................................................................................................................................... 2 搜索功能变更 ................................................................................................................................... 3

2 变更列表 ................................................................................................................................ 2

3 错误码对照表 ......................................................................................................................... 6 4 配置工程 ................................................................................................................................ 7 5 地图显示 ................................................................................................................................ 9 5.1 5.2 5.3 6.1 6.2 6.3 6.4 地图显示 ........................................................................................................................................... 9 以屏幕某个像素点旋转地图 ....................................................................................................... 12 线面设置在地图底图文字上方或下方 ...................................................................................... 12 基本地图 ........................................................................................................................................ 12 自定义图层 .................................................................................................................................... 13 实时路况 ........................................................................................................................................ 15 定位层 ............................................................................................................................................ 15 更改定位图标....................................................................................................................... 16

6 地图图层 .............................................................................................................................. 12

6.4.1 7.1

7 覆盖物显示 .......................................................................................................................... 18 折线(Polyline)......................................................................................................................... 18 添加折线 ............................................................................................................................... 18 设置外观 ............................................................................................................................... 18 示例代码 ............................................................................................................................... 20 添加多边形 ........................................................................................................................... 21 设置外观 ............................................................................................................................... 21 示例代码 ............................................................................................................................... 22 添加圆 ................................................................................................................................... 24 设置外观 ............................................................................................................................... 24 示例代码 ............................................................................................................................... 25 添加图片层 ........................................................................................................................... 26 示例代码 ............................................................................................................................... 26 添加默认标记....................................................................................................................... 27 自定义标记图标 .................................................................................................................. 28 动画标记 ............................................................................................................................... 28 示例代码 ............................................................................................................................... 28 I 7.1.1 7.1.2 7.1.3 7.2 7.2.1 7.2.2 7.2.3 7.3 7.3.1 7.3.2 7.3.3 7.4 7.4.1 7.4.2 7.5 7.5.1 7.5.2 7.5.3 7.5.4

多边形(Polygon).................................................................................................................... 21

圆(Circles) ............................................................................................................................... 23

图片层(GroundOverlay)...................................................................................................... 25

标记(Marker) .......................................................................................................................... 27

7.6 7.7 7.8 8.1 8.2 8.3 8.4 8.5 9.1 9.2 9.3 9.4 10.1 10.2 10.3 10.4 11.1

点击标记事件 ................................................................................................................................ 29 点击信息窗口事件 ....................................................................................................................... 29 拖拽标记事件 ................................................................................................................................ 31 缩放控件 ........................................................................................................................................ 33 定位按钮 ........................................................................................................................................ 34 地图 Logo ..................................................................................................................................... 35 指南针 ............................................................................................................................................ 36 比例尺 ............................................................................................................................................ 37 缩放手势 ........................................................................................................................................ 39 *移(滑动)手势 ....................................................................................................................... 39 旋转手势 ........................................................................................................................................ 39 倾斜手势 ........................................................................................................................................ 40 点击地图事件 ................................................................................................................................ 41 长按地图事件 ................................................................................................................................ 41 移动地图事件 ................................................................................................................................ 41 示例代码 ........................................................................................................................................ 41 可视区域的位置(CameraPosition) .................................................................................... 43 目的地(target) ............................................................................................................... 43 缩放级别(zoom) ........................................................................................................... 43 方向(bearing)................................................................................................................ 44 倾斜角度(tilt) ................................................................................................................. 44 仅更改缩放级别 .................................................................................................................. 45 仅更改视图中心点 .............................................................................................................. 46 仅更改旋转角度 .................................................................................................................. 46 仅更改倾斜角度 .................................................................................................................. 46 更改可视区域....................................................................................................................... 46 示例代码 ............................................................................................................................... 46

8 地图控件 .............................................................................................................................. 33

9 手势控制 .............................................................................................................................. 39

10 地图事件 .............................................................................................................................. 41

11 可视区域操作(Camera) .................................................................................................. 43 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.2.3 11.2.4 11.2.5 11.2.6 11.3 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9

移动可视区域 ................................................................................................................................ 45

设置可视区域边界 ....................................................................................................................... 48 开始下载 ........................................................................................................................................ 50 暂停下载 ........................................................................................................................................ 50 停止下载 ........................................................................................................................................ 51 更改手机下载目录 ....................................................................................................................... 51 获取离线地图城市列表 ............................................................................................................... 52 获取全国离线地图数据 ............................................................................................................... 52 获取已下载城市列表 ................................................................................................................... 52 获取正在或等待下载城市列表................................................................................................... 52 判断数据是否存在更新 ............................................................................................................... 52

12 离线地图 .............................................................................................................................. 50

12.10 删除城市离线地图包 ................................................................................................................... 53 13 地图* .............................................................................................................................. 54 II

14 兴趣点搜索 .......................................................................................................................... 55 14.1 14.2 14.3 14.4 14.5 关键字搜索 .................................................................................................................................... 55 周边搜索 ........................................................................................................................................ 57 指定区域搜索 ................................................................................................................................ 58 团购/优惠搜索 .............................................................................................................................. 58 POI 深度信息 ............................................................................................................................... 61

15 输入提示搜索 ....................................................................................................................... 61 16 路径规划 .............................................................................................................................. 64 16.1 16.2 16.3 17.1 17.2 17.3 18.1 18.2 步行路径规划 ................................................................................................................................ 64 公交路径规划 ................................................................................................................................ 65 驾车路径规划 ................................................................................................................................ 67 线路名称查询 ................................................................................................................................ 70 线路 ID 查询.................................................................................................................................. 71 途径站点查询 ................................................................................................................................ 72 地理编码 ........................................................................................................................................ 73 逆地理编码 .................................................................................................................................... 74

17 公交路线查询 ....................................................................................................................... 70

18 坐标/地址查询 ..................................................................................................................... 73

III

1 简介
1.1 Android SDK

高德地图 Android SDK 可以为 Android 应用开发者提供互动的、功能丰富的 Android 手机地图。 ? 将地图显示功能与搜索服务、定位服务分别封装为三个类库。每个类库不相互依赖,用户 完美支持 Android 手机、*板电脑,可在不同屏幕尺寸下呈现完美的显示效果。 地图采用矢量方法绘制,使得地图处理速度更快、流量占用更少。 地图支持 3D 模式。通过移动用户的视角,可以从各个角度显示地图。 全新动画效果。移动地图、切换用户视角时,可体验炫酷的动画效果。 支持 3D 离线地图。用户下载离线地图数据包后,可离线查看城市地图。

可以分开使用。 ? ? ? ? ? 注意: 1、 高德地图 Android_Map_V2.0.0 之后的版本与 Android_Map_V1.4.2 版本不兼容。若您 Android_Map_API 版本是 V1.4.2,建议您升级到 V2.X.X 版本。 2、 从高德地图 Android 3D(矢量) SDK V2.2.0 版本切换到高德地图 Android 2D(栅格) SDK V2.2.0 版本,需要把布局文件中地图控件 com.amap.api.maps.MapView 修改为 com.amap.api.maps2d.MapView,同时替换相应的 jar 包即可。反之亦然。 3、 为进一步提升搜索服务能力,Android_Services_V2.1.X 版本搜索做了重大升级,但是和以 往的 V2.0.X 版本不兼容。 此外,为进一步提升搜索服务能力,Android_Services_V2.1.0 版本搜索做了重大升级,但是和以往 的 V2.0.X 版本不兼容。

1.2

面向的读者

高德地图 Android SDK 是提供给具有一定 Android 编程经验和了解面向对象概念的读者使用的。此 外,读者还应该对地图产品有一定的了解。 用户在使用中遇到任何问题,都可以通过官网提供的 QQ 群或问答社区反馈给我们。

1.3

兼容性

高德地图 Android SDK 2.X.X 版本支持 Android 2.2 及以上系统。 高德地图 Android SDK 1.X.X 版本支持 Android 1.6 及以上系统。

1.4

申请 API Key

为保证服务可以正常使用,您需要登录 AMap API 网站申请 API Key。每个帐户,最多可以申请 10 个 Key。Key 申请的具体流程请参照获取密钥。 高德软件有限公司 | 1

2 变更列表
2.1 地图功能变更

V2.0.4 和 V2.1.0 版本相对于 V1.4.2 做出如下改变。下表以 V1.4.2 版本为基础,列出此版本与新 版本间的对应关系,帮助您了解 V2.0.4 和 V2.1.0 版本的构成。 软件包名称 版本号 V1.4.2 MapActivity MapController MapView MapViewListener MyLocationOverlay Overlay Projection temizedOverlay.OnFocus ChangeListener 地图显示包 ItemizedOverlay MapView.LayoutParams PoiOverlay RouteMessageHandler RouteOverlay V2.0.4 / V2.1.0 FragmentActivity CameraUpdateFactory Amap AMap.OnMapClickListe ner LocationSource 和 AMapLocationListener Marker Projection AMap.InfoWindowAda pter 已取消 已取消 V2.0.4 已取消 已取消 V2.0.4 已取消 说明 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.2.x 在 V2.1.x 基础上 变更 V2.1.0 参见地图图层显 示包 相关用法,见 Demo 中 “RouteActivity.java”。 V2.1.0 参见地图图层显 示包 参照接口 AMap.OnCameraChang ZoomButtonsController 已取消 eListener。详细方法,见 Demo 中 “EventsActivity.java”。 ZoomButtonsController. OnZoomListener 已取消 参照接口 AMap.OnCameraChang 高德软件有限公司 | 2

eListener。详细方法,见 Demo 中 “EventsActivity.java”。 City DownCity 离线地图包 MOfflineMapStatus OfflineMapManager City 已取消 已取消 OfflineMapManager OfflineMapCity OfflineMapStatus 名称、用法相同 参见类 OfflineMapCity 参见类 OfflineMapStatus 名称相同,方法有变动 新增 新增

2.2

搜索功能变更

V2.1.0 版本相对于*姹 V1.4.2 和 V2.0.4 做出如下改变。V2.2.x 在 V2.1.x 基础上做修改。下表以 V1.4.2 和 V2.0.4 版本为基础,列出此版本与新版本间的对应关系,帮助您了解 V2.1.0 版本的构成。 软件包名称 版本号 V1.4.2 / V2.0.4 LatLonPoint 核心基础包 Inputtips Geocoder 地理编码包 BusLineItem 公交线路和公交站 点查询包 BusPagedResult BusQuery BusSearch BusStationItem 已取消 SuggestionCity 已取消 GeocodeSearch GeocodeAddress RegeocodeAddress RegeocodeRoad StreetNumber GeocodeQuery GeocodeResult RegeocodeQuery RegeocodeResult GeocodeSearch.OnGeo codeSearchListener BusLineItem 已取消 已取消 已取消 BusStationItem 名称相同,方法有变动 高德软件有限公司 | 3 V2.1.0 LatLonPoint PoiItem 说明 名称、用法相同 新增,用法与 V2.0.4 版 POI 查询包类 PoiItem 用 法相同 参见服务帮助包 com.amap.api.services. help 新增 新增 新增 新增 新增 新增 新增 新增 新增 新增 新增 名称相同,方法有变动

BusQuery.SearchType BusSegment DriveSegment DriveWalkSegment Route Route.FromAndTo 路径查询包 Segment WalkSegment

已取消 BusLineResult BusStationResult BusLineQuery BusStationQuery BusLineSearch BusStationSearch BusLineQuery.SearchTy pe BusLineSearch.OnBusLi neSearchListener BusStationSearch.OnBu sStationSearchListener 已取消 已取消 已取消 已取消 已取消 已取消 已取消 新增 新增 新增 新增 新增 新增 新增 新增 新增 参见 BusStep 参见 DriveStep 参见 RouteSearch 参见 RouteSearch.FromAndT o 参见 WalkStep V2.1.0 新增类参见参考手 册 参见核心基础包

-

PoiItem PoiPagedResult PoiSearch PoiSearch.Query PoiSearch.SearchBound POI 查询包 PoiTypeDef 服务帮助包 -

已取消 PoiResult PoiSearch PoiSearch.Query PoiSearch.SearchBound 已取消 Discount Groupbuy Photo PoiItemDetail PoiSearch.OnPoiSearch Listener

com.amap.api.services. core 名称改变,方法有变动 名称、方法有变动 名称、方法有变动 名称、用法相同 类型参照表从“相关下载” 获取 新增 新增 新增 新增 新增 V2.1.0 新增类参见参考

高德软件有限公司 | 4

手册 道路查询包 图层显示包 V2.1.0 新增类参见参考 手册 V2.1.0 新增类参见参考 手册

高德软件有限公司 | 5

3 错误码对照表
当使用异步方法搜索信息时,回调接口将返回响应码。响应码列表如下: 响应码 0 21 22 23 24 25 26 27 28 29 30 31 32 说明 正常 IO 操作异常 连接异常 连接超时 无效的参数 空指针异常 url 异常 未知主机 服务器连接失败 协议解析错误 http 连接失败 未知的错误 key 鉴权失败

高德软件有限公司 | 6

4 配置工程
工程配置操作如下: 1. 从 网 站 下 载 并 解 压 得 到 地 图 显 示 包 “ Android_Map_V2.x.x.jar “ 、 搜 索 包 “ Android_Services_V2.x.x.jar”和文件夹“armeabi” (含 libamapv3.so 和 libmapv3ex.so 文件) 。 注意:若您在 Eclipse 上使用 adt22 版本插件,则需要在 Eclipse 上进行如下配置: 选中 Eclipse 的工程, 右击选择 “Properties > Java Build Path > Order and Export” , 勾选 “Android Private Libraries” 。 2. 开发工程中新建“libs”文件夹,将地图显示包、搜索包和“armeabi”拷贝到 libs 的根目录下。

拷贝完成后的工程目录(以 V2.1.0 为例)如图所示:

3.

添加用户 Key。

在工程的“AndroidManifest.xml”文件如下代码中添加您的用户 Key。 <application android:icon="@drawable/icon" android:label="@string/app_name" > <meta-data android:name="com.amap.api.v2.apikey" android:value="请输入您的用户 Key"/> <activity android:name="com.amap.demo.LocationManager" > <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 4. 添加权限。

在工程的“AndroidManifest.xml”文件中进行添加,请直接拷贝。 <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

高德软件有限公司 | 7

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 5. clean 工程,结束配置。

高德软件有限公司 | 8

5 地图显示
5.1 地图显示

地图显示的关键类是 AMap 类。在您的应用程序中,AMap 是地图的对象。AMap 地图将会通过 MapFragment 或 MapView 容器类来表现。 AMap 类自动处理以下操作: ? ? ? ? ? 连接到高德地图服务 下载地图数据 在设备屏幕上显示地图 显示各种控件,如缩放控件 支持各种手势,如*移和缩放手势

下面以 MapView 显示地图为例进行说明。 MapView 是 Android View 类的一个子类,它可以帮忙您在 Android View 中放置地图,它是应用 程序和窗口部件的基本构建类。MapView 作为地图的容器,通过 AMap 对象显示地图。 使用 MapView 类, 必须重载 Activity 生命周期的所有方法, 有 onCreate(), onDestroy(), onResume(), onPause() ,onSaveInstanceState()。 地图显示效果如下:

高德软件有限公司 | 9

示例代码如下(详细信息,请参考示例工程“基础地图”案例) : 布局文件(res/layout/basicmap_activity.xml) : <?xml version="1.0" encoding="utf-8"?> <!—引入布局文件--> <com.amap.api.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" /> 程序代码(com.amapv2.apis.basic. BasicMapActivity.java) : /** * AMapV2 地图中介绍如何使用 mapview 显示地图 */ public class BasicMapActivity extends Activity { private MapView mapView; private AMap aMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // R 需要引用包 import com.amapv2.apis.R; setContentView(R.layout.basicmap_activity); mapView = (MapView) findViewById(R.id.map);

高德软件有限公司 | 10

mapView.onCreate(savedInstanceState);// 必须要写 init(); } /** * 初始化 AMap 对象 */ private void init() { if (aMap == null) { aMap = mapView.getMap(); } } /** * 方法必须重写 */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } /** * 此方法需要有 */ @Override protected void onResume() { super.onResume(); mapView.onResume(); } /** * 此方法需要有 */ @Override protected void onPause() { super.onPause(); mapView.onPause(); } /** * 此方法需要有 */ @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } }

高德软件有限公司 | 11

5.2

以屏幕某个像素点旋转地图

高德地图 Android SDK 允许用户在屏幕的某个像素点旋转地图。具体实现是使用 AMap 类的 setPointToCenter() 方法将某个屏幕像素点设置为地图中心点,然后使用 CameraUpdate 类的

changeBearing(float bearing)方法改变地图的旋转角度。
如 aMap.setPointToCenter(100,0) 设置屏幕像素点(100,0)为地图中心点,cameraupdate.

changeBearing(90) 改变地图的旋转角度,即表示地图以屏幕像素点旋转地图。

5.3

线面设置在地图底图文字上方或下方

高德地图 Android SDK 允许用户将添加的线、面等覆盖物设置在地图底图文字的上方或下方。 具体实现是使用 AMap 类的 setMapTextZIndex()方法来设置地图底图文字的 z 轴指数。地图底图文 字和覆盖物的 z 轴指数默认为 0,此时地图底图文字在覆盖物的下方,如果使用 aMap.setMapTextZIndex(2) 可以将地图底图文字设置在添加的覆盖物之上。

6 地图图层
地图是由多个图层组成,每个图层会显示一部分的地理或交通信息。开发者可以通过设置 AMap 类灵 活控制图层的显示状态。 例如,用户所看到包括街道、兴趣点、学校、公园等内容的地图展现就是一个图层。实时路况等的展 现也是通过图层来实现的。

6.1

基本地图

地图 API 包含两种类型的基本地图。 ? Normal:标准地图。地图包含道路、建筑,以及重要的自然风光(如河流)等。道路和功能标 Satellite:卫星地图。道路和功能标签为可见的。

签为可见的。 ?

下图对相同位置,类型为“normal(实时交通) ” , “satellite”地图做出对比:

高德软件有限公司 | 12

?

示例代码如下(详细信息,请参考示例工程“Layers 功能”案例 / com.amapv2.apis.basic.LayersActivity.java) : /** * 选择标准地图和卫星地图事件的响应 */ private void setLayer(String layerName) { if (layerName.equals(getString(R.string.normal))) { // 显示标准地图 aMap.setMapType(AMap.MAP_TYPE_NORMAL); } else if (layerName.equals(getString(R.string.satellite))) { // 显示卫星地图 aMap.setMapType(AMap.MAP_TYPE_SATELLITE); } }

6.2
简介

自定义图层

TileOverlay 定义了添加到基础底层地图的图片集合。你也可以使用自定义图层添加透明图片对基础 底层地图添加额外特性。你需要提供你支持的缩放级别的每层级别的瓦片。如果在每个层级你都有足够的 瓦片,你可以提供整个高德地图的自定义图层。 当你想增加许多图片到地图,特别是覆盖大面积的地理区域时,使用 TileOverlay 类。与此相反,当 你希望在地图上固定区域添加一张图片时, 使用 GroundOverlay 类。 高德软件有限公司 | 13

经纬度坐标和缩放级别 高德地图 API 将每个层级的图片打散成有序的若干个瓦片集。 当地图移动到新的区域或新的缩放级别, 地图 API 决定哪些瓦片是需要的,并且传送这些信息到瓦片集来提取瓦片。 坐标(0,0)的瓦片在地图的西北角,x 的值从西到东依次增加,yi 的值从北到南依次增加。瓦片通过 x,y 来检索。 在 0 级,全世界被渲染成一个瓦片。每个缩放级别以 2 为底的当前缩放级别为指数的*方的增加。所 以,在 1 级地图渲染成 2*2 的瓦片。在 2 级地图渲染成 4*4 的瓦片,在 3 级,8*8 的瓦片,依次类推。 比如,在 2 级,地球被分成了 16 个瓦片。地图瓦片能通过唯一的 x,y 和缩放级别 z 来引用:

当创建自定义图层时,你需要在每个支持的缩放级别创建图片。 1 AMap. getMaxZoomLevel() 返回当前地图最大的缩放级别。 2 AMap. getMinZoomLevel() 返回当前地图最小的缩放级别。 添加自定义图层 最简单常用的添加自定义图层的方法是提供一个指向相关图层图片的 URL。UrlTileProvider 是部分 的实现了提供图片瓦片的 TileProvider。这个类要求所有图片有相同的尺寸。 你需要实现 UrlTileProvider .getTileUrl()来接收(x,y,zoom),并返回指向该瓦片的 URL。如果没有指 定的 x,y,zoom,这个方法应该返回 null。一个 URL 可以指向网站资源,android 资源,或在本地硬盘上 的文件。 在服务器上存储瓦片图片,定义所有的 x,y 坐标和缩放级别。然后添加自定义图层。 1. 定义一个 UrlTileProvider 来支持瓦片图片。 2. 重载 getTileUrl() 来为每个瓦片建立一个 URL。 3. 提供一个 TileOverlayOptions 对象: diskCacheDir:设置栅格图层的磁盘缓存目录。 diskCacheSize:设置栅格图层的默认磁盘缓存大小 tileProvider:栅格图层的提供者。 diskCacheEnabled:设置是否开启磁盘缓存。 4. 调用 AMap. addTileOverlay(),在地图上添加自定义图层。 private TileOverlay tileOverlay; private String url = "http://10.19.2.135:8080/tileserver/Tile?x=%d&y=%d&z=%d&f=%d"; ... TileProvider tileProvider = new UrlTileProvider(256, 256) { 高德软件有限公司 | 14

public URL getTileUrl(int x, int y, int zoom) { try { return new URL(String.format(url, x, y, zoom, floor)); } catch (MalformedURLException e) { e.printStackTrace(); } return null; } }; if (tileProvider != null) { tileOverlay = aMap.addTileOverlay(new TileOverlayOptions() .tileProvider(tileProvider) .diskCacheDir("/storage/amap/cache").diskCacheEnabled(true) .diskCacheSize(100));

删除一个自定义图层 你可以使用 TileOverlay.remove()方法删除一个自定义图层。 清除过时图层 如果瓦片不再使用, 你可以调用 TileOverlay. clearTileCache()来清空之前使用的栅格图层的缓存以确 保之前使用的栅格图层不在被使用。

6.3

实时路况

高德地图 API 提供北京,上海,广州,深圳,武汉,沈阳,南京,宁波,重庆,杭州,青岛,成都, 天津,大连,无锡,西安,石家庄,太原,常州,厦门,长春,福州,珠海,东莞,长沙,苏州,金华, 佛山,济南,泉州,西宁,乌鲁木齐,嘉兴,香港,鄂尔多斯,南通,中山,惠州,镇江,郑州,合肥, 昆明,德州,朝阳,抚顺,大同,荆州 47 个城市及城际间的实时交通路况。 示例代码如下(详细信息,请参考示例工程“Layers 功能”案例 / com.amapv2.apis.basic.LayersActivity.java): /** * 对选择是否显示交通状况事件的响应 */ @Override public void onClick(View v) { if (v.getId() == R.id.traffic) { aMap.setTrafficEnabled(true); } }

6.4

定位层

高德地图 API 提供了与高德定位 SDK 的无缝整合。开发者只需要将高德定位 SDK 集成到项目里就可 以使 App 具备定位能力。同时高德地图 API 也可以和其他第三方定位 SDK 整合,为开发者提供了更多的 选择。Demo 里已提供详细的案例程序。 开发者需要调用以下代码设置定位资源并显示定位层。 高德软件有限公司 | 15

AMap.setLocationSource(this); AMap.setMylocationEnabled(true); 目前可以使用 AMap.setMyLocationRotateAngle()方法对系统默认定位图标设置旋转角度,轻松控 制定位图标指向。

6.4.1

更改定位图标

调用定位 SDK,点击定位按钮,默认地图上您所在的位置显示蓝色的小圆点,以及圆形精度范围。您 可以根据自己的喜好,自定义设置“我的位置”的样式。绘制定位样式需要在地图初始化成功之后进行操 作。 定位层显示效果如下:

示例代码如下(详细信息,请参考示例工程“Location 功能”案例 / com.amapv2.apis.location.LocationSourceActivity.java): private void setUpMap() { // 自定义系统定位蓝点 MyLocationStyle myLocationStyle = new MyLocationStyle(); // 自定义定位蓝点图标 myLocationStyle.myLocationIcon(BitmapDescriptorFactory .fromResource(R.drawable.location_marker)); // 自定义精度范围的圆形边框颜色 myLocationStyle.strokeColor(Color.BLACK); //自定义精度范围的圆形边框宽度 myLocationStyle.strokeWidth(5); // 将自定义的 myLocationStyle 对象添加到地图上

高德软件有限公司 | 16

aMap.setMyLocationStyle(myLocationStyle); // 构造 LocationManagerProxy 对象 mAMapLocationManager = LocationManagerProxy .getInstance(LocationSourceActivity.this); //设置定位资源。如果不设置此定位资源则定位按钮不可点击。 aMap.setLocationSource(this); //设置默认定位按钮是否显示 aMap.getUiSettings().setMyLocationButtonEnabled(true); // 设置为 true 表示显示定位层并可触发定位,false 表示隐藏定位层并不可触发定位,默认是 false aMap.setMyLocationEnabled(true);

高德软件有限公司 | 17

7 覆盖物显示
所有叠加或覆盖到地图的内容,统称为地图覆盖物。如标记、矢量图形元素(包括:折线、多边形和 圆)等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们也会随地图移动。

7.1

折线( Polyline )

折线的关键类为 Polyline,在地图上定义了一组相连的线段。Polyline 对象由一组经纬度坐标组成, 并以有序序列形式建立一系列的线段。

7.1.1

添加折线

类 PolylineOptions,折线的选项类,增加线段、可见性,设置实线、虚线、添加线段的纹理贴图等。 在 PolylineOptions 对象中调用 PolylineOptions.add()方法添加经纬度的点对象。 绘制线段, 将它们以点 点之间的顺序添加到 PolylineOptions 对象中。起点与终点坐标相同,则为闭合的多边形。 PolylineOptions.add()方法存在可变数目的参数,所以您可以在同一时间添加多个点(如果点已经在 列表中,您可以调用 PolylineOptions.addAll()方法。 最后,调用 AMap.addPolyline(PolylineOptions)将折线添加到地图上。这个方法返回一个 Polyline 对象。

7.1.2
边框宽度

设置外观

使用 PolylineOptions.width()设置折线的宽度。默认边框宽度为 10 像素。折线添加到地图之后,可 以使用 Polyline. getWidth()和 Polyline. setWidth(float width)方法查看或改变边框宽度。 边框颜色 使用 PolylineOptions.color()设置边框颜色。边框颜色是 ARGB 格式。默认画笔颜色为黑色。折线添 加到地图之后,可以使用 Polyline. getColor()和 Polyline. setColor(int color)查看或改变边框颜色。 Z 轴指数 Z 轴指数是控制地图覆盖物 (overlay) 之间的绘制层次的参数。 这个参数能够控制 Circles、 Polygons、 Polyline 的绘制层次,但不会影响标记 marker。Z 轴数值越大的覆盖物(overlay)将会绘制在更上层。 如果两个及两个以上覆盖物(overlay)的 Z 轴数值相同,则最后的绘*峁撬婊摹8哺俏铮╫verlay) Z 轴指数默认为 0。 使用 PolylineOptions.zIndex()设置折线的 Z 轴指数。折线添加到地图之后,可以通过 Polyline. getZIndex()或 Polyline. setZIndex (float zIndex)查看或改变绘制层次。 高德软件有限公司 | 18

可见性 可见性决定形状是否绘制在地图上,其中“true”表示体现在地图上, “false”表示不出现。它允许 您在地图上暂时不显示形状。要永久删除地图的形状,可调用 Polyline.remove()方法。 使用 PolylineOptions. visible()设置折线的可见性。折线添加到地图之后,可以通过 Polyline. isVisible()或 Polyline. setVisible()查看或改变可见性。 边框虚线 折线的边框默认是以实线样式来绘制,如果要设置虚线样式,可以使用 PolylineOptions. setDottedLine(true) 或者 Polyline.setDottedLine(true) 设置折线边框样式为虚线。在折线添加到地图 之后,可以通过 PolylineOptions.isDottedLine() 或是 Polyline.isDottedLine() 查看折线是否是虚线样 式。

大地曲线 大地曲线是指地球椭球面上连接两个坐标点的最短距离曲线。使用 PolylineOptions.geodesic(boolean)设置线段是否为大地曲线线段。默认线段为标准折线。 运行效果如下:

高德软件有限公司 | 19

纹理 使用 PolylineOptions.setCustomTexture()方法可以给线段添加自定义纹理, 如 aMap.addPolyline((new PolylineOptions()).setCustomTexture(BitmapDescriptorFactory.defaultMarker())); 给新增加的折线 添加图片为 BitmapDescriptorFactory.defaultMarker() 的纹理。

7.1.3

示例代码

详细信息,请参考示例工程“Polylines 功能”案例 / com.amapv2.apis.overlay.PolylineActivity.java) 。 private void setUpMap() { mColorBar.setOnSeekBarChangeListener(this); mAlphaBar.setOnSeekBarChangeListener(this); mWidthBar.setOnSeekBarChangeListener(this); aMap.moveCamera(CameraUpdateFactory .newLatLngZoom(Constants.BEIJING, 11));// 设置指定的可视区域地图 // 绘制一条折线

高德软件有限公司 | 20

aMap.addPolyline((new PolylineOptions()) .add(new LatLng(39.9588, 116.3181), Constants.BEIJING, new LatLng(39.9588, 116.5181)).color(Color.RED) .width(5)); // 绘制一个三角形 polyline = aMap.addPolyline((new PolylineOptions()) .add(new LatLng(39.8588, 116.3181), Constants.BEIJING, new LatLng(39.8588, 116.5181), new LatLng(39.8588, 116.3181)).width(5) .color(Color.BLUE)); } /** * Polyline 中对画笔颜色、画笔宽度设置响应事件 */ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (polyline == null) { return; } if (seekBar == mColorBar) { polyline.setColor(Color.HSVToColor( Color.alpha(polyline.getColor()), new float[] { progress, 1, 1 })); } else if (seekBar == mAlphaBar) { float[] prevHSV = new float[3]; Color.colorToHSV(polyline.getColor(), prevHSV); polyline.setColor(Color.HSVToColor(progress, prevHSV)); } else if (seekBar == mWidthBar) { // 设置折线宽度 polyline.setWidth(progress); } }

7.2

多边形( Polygon )

类 Polygon 与 Polyline 比较相似, 它们都包括有序序列的一系列坐标。 然而, 多边形包含有内部区域。

7.2.1

添加多边形

首先创建 PolygonOptions 类,添加一些点指向它。这些点形成多边形的轮廓。然后调用 AMap.addPolygon(PolygonOptions)将多边形添加到地图中,返回一个 Polygon 对象。

7.2.2
填充颜色

设置外观

填充颜色仅适用于多边形和圆,折线没有填充颜色。

高德软件有限公司 | 21

填充颜色是 ARGB 格式。使用 PolygonOptions. fillColor()设置多边形的填充颜色。默认没有填充颜 色。多边形添加到地图之后,可以使用 Polygon. getFillColor()和 Polygon. setFillColor()方法查看或改变 填充颜色。 其他 多边形的边框颜色、边框宽度、可见性、Z 轴指数可参见“添加折线”的介绍。方法名称略有不同。 添加效果如下:

7.2.3

示例代码

详细信息,请参考示例工程“Polygons 功能”案例 / com.amapv2.apis.overlay.PolygonActivity.java。 private void setUpMap() { mColorBar.setOnSeekBarChangeListener(this); mAlphaBar.setOnSeekBarChangeListener(this); mWidthBar.setOnSeekBarChangeListener(this); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(Constants.BEIJING, 设置指定的可视区域地图 // 绘制一个长方形

5));//

高德软件有限公司 | 22

aMap.addPolygon(new PolygonOptions() .addAll(createRectangle(Constants.SHANGHAI, 1, 1)) .fillColor(Color.LTGRAY).strokeColor(Color.RED).strokeWidth(1)); PolygonOptions options = new PolygonOptions(); int numPoints = 400; float semiHorizontalAxis = 5f; float semiVerticalAxis = 2.5f; double phase = 2 * Math.PI / numPoints; for (int i = 0; i <= numPoints; i++) { options.add(new LatLng(Constants.BEIJING.latitude + semiVerticalAxis * Math.sin(i * phase), Constants.BEIJING.longitude + semiHorizontalAxis * Math.cos(i * phase))); } // 绘制一个椭圆 polygon = aMap.addPolygon(options.strokeWidth(4f) .strokeColor(Color.BLACK).fillColor(Color.LTGRAY)); } /** * Polygon 中对填充颜色,画笔颜色,画笔宽度设置响应事件 */ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (polygon == null) { return; } if (seekBar == mColorBar) { polygon.setFillColor(Color.HSVToColor( Color.alpha(polygon.getFillColor()), new float[] { progress, 1, 1 })); } else if (seekBar == mAlphaBar) { int prevColor = polygon.getFillColor(); polygon.setFillColor(Color.argb(progress, Color.red(prevColor), Color.green(prevColor), Color.blue(prevColor))); } else if (seekBar == mWidthBar) { polygon.setStrokeWidth(progress); } }

7.3

圆( Circles )

除了通用的 Polygon 类,高德地图 API 还定义了 Circles 类,简化创建圆的过程。 要构建一个圆,您必须指定以下两个属性: ? ? 中心点(经纬度) 半径(米)

高德软件有限公司 | 23

7.3.1

添加圆

创建一个 CircleOptions 对象,使用 CircleOptions.center(LatLng point)和 CircleOptions. radius(double radius)设置中心点和半径, 最后调用 AMap.addCircle(CircleOptions)将圆添加到地图上。 注意事项: 创建圆时,不能指定两个经纬度坐标来绘制圆形。

7.3.2

设置外观

圆的边框颜色、边框宽度、可见性、Z 轴指数可参见“添加折线”的介绍。方法名称略有不同。 圆的填充颜色,可参见“添加多边形”的介绍。 添加效果如下:

高德软件有限公司 | 24

7.3.3

示例代码

private void setUpMap() { mColorBar.setOnSeekBarChangeListener(this); mAlphaBar.setOnSeekBarChangeListener(this); mWidthBar.setOnSeekBarChangeListener(this); aMap.moveCamera(CameraUpdateFactory .newLatLngZoom(Constants.BEIJING, 12));// 设置指定的可视区域地图 // 绘制一个圆形 circle = aMap.addCircle(new CircleOptions().center(Constants.BEIJING) .radius(4000).strokeColor(Color.BLUE).fillColor(Color.WHITE) .strokeWidth(3)); } /** * Circle 中对填充颜色,画笔颜色,画笔宽度设置响应事件 */ @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if (circle == null) { return; } if (seekBar == mColorBar) { circle.setFillColor(Color.HSVToColor( Color.alpha(circle.getFillColor()), new float[] { progress, 1, 1 })); } else if (seekBar == mAlphaBar) { int prevColor = circle.getFillColor(); circle.setFillColor(Color.argb(progress, Color.red(prevColor), Color.green(prevColor), Color.blue(prevColor))); } else if (seekBar == mWidthBar) { circle.setStrokeWidth(progress); } }

7.4

图片层( GroundOverlay )

图片层是将一张图片以合适的大小贴在地图指定的位置上。 图片层的属性如下: ? anchor- 图片和指定点的对齐方式,[0,0]是左上角,[1,1]是右下角 。如果不设置,默认 bearing- 图片层相对锚点从正北顺时针的旋转角度。 image- 此图片层的图片。 position- 根据描点和宽高设置图片层。在显示时,图片会被缩放来适应指定的尺寸。 transparency- 图片层的透明度。默认透明度为 0,不透明。 visible-图片层是否可见。默认为可见。 zIndex- 图片层的 z 轴指数。

为[0.5,0.5]图片的中心点。 ? ? ? ? ? ?

高德软件有限公司 | 25

7.4.1

添加图片层

需要通过设置中心点或者图片区域来确定图片层的位置, 初始化一个 GroundOverlayOptions 对象来 设 置 图 片 层 图 片 区 域 、 透 明 度 、 锚 点 、 要 显 示 的 图 片 , 使 用 amap.addGroundOverlay(GroundOverlayOptions) 将此图片层添加到地图。

7.4.2

示例代码

private void addOverlayToMap() { // 设置当前地图显示为北京市恭王府 amap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(39.936713, 116.386475), 19)); //设置图片的显示区域。 LatLngBounds bounds = new LatLngBounds.Builder() .include(new LatLng(39.935029, 116.384377)) .include(new LatLng(39.939577, 116.388331)).build(); groundoverlay = amap.addGroundOverlay(new GroundOverlayOptions() .anchor(0.5f, 0.5f) .transparency(0.1f) .image(BitmapDescriptorFactory.fromResource(R.drawable.groundoverlay)) .positionFromBounds(bounds)); } 运行效果如下所示:

高德软件有限公司 | 26

7.5

标记( Marker )
添加默认标记

7.5.1

标记显示地图上的单一位置。它可以使用一个标准的图标,也可以由开发者自定义图标。您可以通过 AMap.addMarker(markerOptions)方法将一个标记添加到地图上。 标记的属性如下: ? ? ? ? ? ? ? ? position (Required)-在地图上标记位置的经纬度值。参数不能为空。 title-当用户点击标记,在信息窗口上显示的字符串。 snippet-附加文本,显示在标题下方。 draggable-如果您允许用户可以自由移动标记, 设置为 “true” 。 默认情况下为 “false”。 visible-设置“false” ,标记不可见。默认情况下为“true” 。 anchor-图标摆放在地图上的基准点。默认情况下,锚点是从图片下沿的中间处。 perspective- 设置 true,标记有*大远小效果。默认情况下为 false。 您可以通过 marker.setRotateAngle() 方法设置标记的旋转角度,从正北开始,逆时针计

算。如设置旋转 90 度,marker.setRotateAngle(90),效果如下图所示:

高德软件有限公司 | 27

7.5.2

自定义标记图标

您如果需要改变标记图像,可以设置自定义的图像,通常被称为图标。自定义图标通常由 BitmapDescriptor 设置。您可以在类 BitmapDescriptorFactory 使用以下其中一种方法定义。 ? ? ? ? fromAsset(String assetName) - 在 assets 目录中使用图像创建自定义标记。 fromBitmap (Bitmap image) - 使用位图图像创建自定义标记。 fromFile (String path) - 指定路径的文件创建自定义图标。 fromResource (int resourceId) - 使用已经存在的资源创建自定义图标。

7.5.3

动画标记

动画标记允许用户在地图上添加一个动态的标记。用户通过设置动画标记的每帧显示的图片和刷新一 次动画资源的时间来设置动画效果。在原有默认标记的基础上增加动画标记的属性,如下: ? ? icons- 设置标记图标的动画帧列表。 period-设置标记动画刷新一次图片资源的周期。

7.5.4

示例代码

详细信息, 请参考示例工程 “Markers 功能” 案例 / com.amapv2.apis.overlay.MarkerActivity.java。 private void addMarkersToMap() { //声明一个动画帧集合。 ArrayList<BitmapDescriptor> giflist = new ArrayList<BitmapDescriptor>(); //添加每一帧图片。 giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.navi_map_flash)); giflist.add(BitmapDescriptorFactory.fromResource(R.drawable.navi_map_flash1)); //设置远小*大效果,2.1.0 版本新增;设置刷新一次图片资源的周期。 CHENGDU = aMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f) .position(Constants.CHENGDU).title("成都市") .snippet("成都市:30.679879, 104.064855").icons(giflist) .perspective(true).draggable(true).period(50)); CHENGDU.showInfoWindow();// 设置默认显示一个 infowinfow markerOption = new MarkerOptions(); markerOption.position(Constants.XIAN); markerOption.title("西安市").snippet("西安市:34.341568, 108.940174"); markerOption.perspective(true); markerOption.draggable(true); markerOption.icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)); XIAN = aMap.addMarker(markerOption); // 添加带有系统默认 icon 的 marker drawMarkers(); }

动画标记的效果运行如下所示:

高德软件有限公司 | 28

7.6

点击标记事件

您可以使用 AMap.OnMarkerClickListener 监听点击标记的事件。在地图上设置监听器,需调用 AMap.setOnMarkerClickListener(OnMarkerClickListener)。当用户点击标记,方法 onMarkerClick(Marker) 将被调用, 标记将会作为参数传递。 方法返回布尔型, 表示是否执行事件 (例如: 您想要阻止默认操作) 。如果返回“false” ,除您定义的操作之外,默认操作将会被执行。点击标记的默认 操作是显示它的信息窗口(如果可用) 。 示例代码如下(详细信息,请参考示例工程“Markers 功能”案例 / com.amapv2.apis.overlay.MarkerActivity.java) : public class MarkerActivity extends Activity implements OnMarkerClickListener, OnInfoWindowClickListener, OnMarkerDragListener, OnMapLoadedListener, InfoWindowAdapter { private void setUpMap() { aMap.setOnMarkerClickListener(this);// 设置点击 marker 事件监听器 aMap.setOnInfoWindowClickListener(this);// 设置点击 infoWindow 事件监听器 aMap.setInfoWindowAdapter(this);// 设置自定义 InfoWindow 样式 aMap.setOnMarkerDragListener(this);// 设置 marker 可拖拽事件监听器 aMap.setOnMapLoadedListener(this);// 设置 amap 加载成功事件监听器 addMarkersToMap();// 往地图上添加 marker } /** * 对 marker 标注点点击响应事件 */ @Override public boolean onMarkerClick(final Marker marker) { if (marker.equals(XIAN)) { if (aMap != null) { jumpPoint(marker); } } markerText.setText("你点击的是" + marker.getTitle()); return false; }

7.7

点击信息窗口事件

您可以使用 AMap.OnInfoWindowClickListener 去监听点击信息窗口的事件, AMap.InfoWindowAdapter 显示信息窗口。在地图上设置监听器,需调用

高德软件有限公司 | 29

AMap.setOnInfoWindowClickListener(OnInfoWindowClickListener)。当用户点击信息窗口, onInfoWindowClick(Marker)方法将被调用。 说明:当使用接口 AMap.InfoWindowAdapter(显示信息窗口)的 getInfoWindow(Marker)方法 时,请确认标记(Marker)的 title 或 snippet 已赋值。 示例代码如下(详细信息,请参考示例工程“Markers 功能”案例 / com.amapv2.apis.overlay.MarkerActivity.java) : public class MarkerActivity extends Activity implements OnMarkerClickListener, OnInfoWindowClickListener, OnMarkerDragListener, OnMapLoadedListener, InfoWindowAdapter { private void setUpMap() { aMap.setOnMarkerClickListener(this);// 设置点击 marker 事件监听器 aMap.setOnInfoWindowClickListener(this);// 设置点击 infoWindow 事件监听器 aMap.setInfoWindowAdapter(this);// 设置自定义 InfoWindow 样式 aMap.setOnMarkerDragListener(this);// 设置 marker 可拖拽事件监听器 aMap.setOnMapLoadedListener(this);// 设置 amap 加载成功事件监听器 addMarkersToMap();// 往地图上添加 marker } /** * 自定义 infowinfow 窗口 */ public void render(Marker marker, View view) { if (radioOption.getCheckedRadioButtonId() == R.id.custom_info_contents) { ((ImageView) view.findViewById(R.id.badge)) .setImageResource(R.drawable.badge_sa); } else if (radioOption.getCheckedRadioButtonId() == R.id.custom_info_window) { ImageView imageView = (ImageView) view.findViewById(R.id.badge); imageView.setImageResource(R.drawable.badge_wa); } String title = marker.getTitle(); TextView titleUi = ((TextView) view.findViewById(R.id.title)); if (title != null) { SpannableString titleText = new SpannableString(title); titleText.setSpan(new ForegroundColorSpan(Color.RED), 0, titleText.length(), 0); titleUi.setTextSize(15); titleUi.setText(titleText); } else { titleUi.setText(""); } String snippet = marker.getSnippet(); TextView snippetUi = ((TextView) view.findViewById(R.id.snippet)); if (snippet != null) { SpannableString snippetText = new SpannableString(snippet); snippetText.setSpan(new ForegroundColorSpan(Color.GREEN), 0, snippetText.length(), 0); snippetUi.setTextSize(20); snippetUi.setText(snippetText); } else { snippetUi.setText(""); }

高德软件有限公司 | 30

} /** * 监听点击 infowindow 窗口事件回调 */ @Override public void onInfoWindowClick(Marker marker) { ToastUtil.show(this, "你点击了 infoWindow 窗口"); }

7.8

拖拽标记事件

您可以使用 AMap. OnMarkerDragListener 去监听拖动标记的事件。在地图上设置监听器,需调用 AMap. setOnMarkerDragListener(OnMarkerDragListener)。拖拽标记,用户的手指长按住标记在屏幕 上滑动到什么地方,标记就会停留在那个地方。当标记被拖动,首先调用 onMarkerDragStart(Marker); 拖拽过程中,不断调用 onMarkerDrag(Marker);拖拽结束,调用 onMarkerDragEnd(Marker)。您可以 通过调用 Marker.getPosition()随时获取标记的位置。 说明: 默认情况下,标记是不可以拖拽的。用户在拖拽前,必须明确设置它的拖拽属性。在添加标记前,您 可以通过使用 MarkerOptions.draggable(boolean)设置;或者标记添加后,使用 Marker.setDraggable(boolean)进行设置。 示例代码如下(详细信息,请参考示例工程“Markers 功能”案例 / com.amapv2.apis.overlay.MarkerActivity.java) : public class MarkerActivity extends Activity implements OnMarkerClickListener, OnInfoWindowClickListener, OnMarkerDragListener, OnMapLoadedListener, InfoWindowAdapter { private void setUpMap() { aMap.setOnMarkerClickListener(this);// 设置点击 marker 事件监听器 aMap.setOnInfoWindowClickListener(this);// 设置点击 infoWindow 事件监听器 aMap.setInfoWindowAdapter(this);// 设置自定义 InfoWindow 样式 aMap.setOnMarkerDragListener(this);// 设置 marker 可拖拽事件监听器 aMap.setOnMapLoadedListener(this);// 设置 amap 加载成功事件监听器 addMarkersToMap();// 往地图上添加 marker } /** * 监听拖动 marker 时事件回调 */ @Override public void onMarkerDrag(Marker marker) { String curDes = marker.getTitle() + "拖动时当前位置:(lat,lng)\n(" + marker.getPosition().latitude + "," + marker.getPosition().longitude + ")"; markerText.setText(curDes); } /**

高德软件有限公司 | 31

* 监听拖动 marker 结束事件回调 */ @Override public void onMarkerDragEnd(Marker marker) { markerText.setText(marker.getTitle() + "停止拖动"); } /** * 监听开始拖动 marker 事件回调 */ @Override public void onMarkerDragStart(Marker marker) { markerText.setText(marker.getTitle() + "开始拖动"); }

高德软件有限公司 | 32

8 地图控件
高德地图 API 提供一些内置的 UI 控件。您可以通过 AMap 里的 AMap.getUiSettings 方法获得 UiSettings 对象,去控制这些控件的可见性。在类中改变模式可以立即反应在地图上。当地图创建时,可 以使用 AMapOptions 类来设置这些选项。

8.1

缩放控件

高德地图 API 提供内置的缩放控制键,显示在地图的右下角。默认情况下是开启的,但是可以通过调 用 UiSettings.setZoomControlsEnabled(boolean)禁用。 显示效果如图所示:

示例代码如下(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 设置显示地图默认的缩放按钮 */ case R.id.zoom_toggle: mUiSettings.setZoomControlsEnabled(true);

高德软件有限公司 | 33

break;

8.2

定位按钮

默认情况下,定位按钮不显示。您可以调用 UiSettings.setMyLocationButtonEnabled(boolean)启 用该按钮。调用定位 SDK,定位位置。启用定位按钮后,定位按钮将会出现在屏幕的右上角。当用户点击 这个按钮,如果用户的位置当前是可知的,可视区域将显示用户的当前位置。设置定位按钮显示后,如果 定位层不显示 AMap.setMylocationEnabled(false)时,定位按钮可见但不可点击。 显示效果如图所示:

示例代码如下(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 设置显示地图默认的定位按钮 */ case R.id.mylocation_toggle: aMap.setLocationSource(this);//设置定位监听 mUiSettings.setMyLocationButtonEnabled(true); //是否显示定位按钮 aMap.setMyLocationEnabled(true); //是否可触发定位并显示定位层 break;

高德软件有限公司 | 34

8.3

地图 Logo

地图上,默认 Logo“高德地图”显示在地图的左下方。您可以通过 setLogoPosition(int position) 方法设置 Logo 的位置。Logo 的位置有左下角、底部居中、右下角三种选择。 显示效果如图所示:

示例代码如下(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 设置 logo 位置,左下,底部居中,右下 */ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { if (aMap != null) { if (checkedId == R.id.bottom_left) { mUiSettings .setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT); } else if (checkedId == R.id.bottom_center) { mUiSettings .setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_CENTER); } else if (checkedId == R.id.bottom_right) { mUiSettings .setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_RIGHT); } } 高德软件有限公司 | 35

}

8.4

指南针

高德地图 Android SDK 提供指南针功能。当可视区域旋转(方向非 0 度)或倾斜(倾角非 0 度)时, 指南针会始终指向地图的正北方向。当用户点击指南针图标时,可视区域将返回默认位置(方向和角度为 0 度) 。 默认状态下, 指南针功能不可用, 您可以调用 UiSettings.setCompassEnabled(boolean enabled) 启用指南针功能。 显示效果如图所示:

示例代码如下(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 设置显示地图默认的指南针 */ case R.id.compass_toggle: mUiSettings.setCompassEnabled(true); break;

高德软件有限公司 | 36

8.5

比例尺

高德地图 Android SDK 提供比例尺功能。缩放级别不同,比例尺代表的长度也不同。比例尺代表的 长度范围为 5m-500km,由缩放级别决定。默认状态下,比例尺功能不可用。您可以调用 UiSettings.setScaleControlsEnabled(boolean enabled)启用此功能。 调用 AMap.getScalePerPixel()方法,根据用户当前地图的 zoom 值和地图中心点的坐标,可以获得 当前比例尺的数据。 显示效果如图所示:

示例代码如下(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 一像素代表多少米 */ case R.id.buttonScale: float scale = aMap.getScalePerPixel(); ToastUtil.show(UiSettingsActivity.this, "每像素代表" + scale + "米"); break; /** * 设置显示地图的默认比例尺 */ case R.id.scale_toggle: mUiSettings.setScaleControlsEnabled(true);

高德软件有限公司 | 37

break;

高德软件有限公司 | 38

9 手势控制
Android SDK 支持丰富的地图交互手势功能。默认情况下,手势功能是可用的。 详细使用介绍,请参见示例工程“UI Settings”案例。

9.1

缩放手势

改变可视区域的缩放级别,地图可以响应的手势如下: ? ? 双击地图可以使缩放级别增加 1 (放大) 两个手指捏/拉伸

调用类 UiSettings 的 setZoomGesturesEnabled(boolean)方法您可以禁用缩放手势。 这不会影响用 户使用地图上的缩放控制按钮。 示例代码(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 禁用通过手势缩放地图 */ case R.id.zoom_gestures_toggle: mUiSettings.setZoomGesturesEnabled(false); break;

9.2

*移(滑动)手势

用户可以用手指拖动地图四处滚动(*移)或用手指滑动地图(动画效果) 。您通过调用类 UiSettings 的 setScrollGesturesEnabled(boolean)方法可以禁用*移(滑动)手势。 示例代码(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 禁用手势*移(滑动)地图 */ case R.id.scroll_toggle: mUiSettings.setScrollGesturesEnabled(false); break;

9.3

旋转手势

用户可以用两个手指在地图上旋转,可以旋转地图。您可以通过调用类 UiSettings 的 setRotateGesturesEnabled(boolean)方法禁用旋转手势。 示例代码如下(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : 高德软件有限公司 | 39

/** * 禁用手势旋转地图 */ case R.id.rotate_toggle: mUiSettings.setRotateGesturesEnabled(false); break;

9.4

倾斜手势

用户可以在地图上放置两个手指,移动它们一起向下或向上去增加或减小倾斜角。您可以通过调用类 UiSettings 的 setTiltGesturesEnabled(boolean)方法禁用倾斜手势。 示例代码如下(详细信息,请参考示例工程“UI Settings 功能”案例 / com.amapv2.apis.basic.UiSettingsActivity.java) : /** * 禁用手势倾斜地图 */ case R.id.tilt_toggle: mUiSettings.setTiltGesturesEnabled(false); break;

高德软件有限公司 | 40

10
高德地图 API 允许您监听地图上的事件。

地图事件

10.1 点击地图事件
如果您需要响应用户轻点地图上某个点的事件,您需要在地图上调用 AMap.setOnMapClickListener(OnMapClickListener)实现。当用户在地图上点击(轻拍)某个地方,您 将收到 onMapClick(LatLng)事件,显示用户点击地图上的位置。使用时必须在主线程中进行调用。

10.2 长按地图事件
调用 AMap.setOnMapLongClickListener(OnMapLongClickListener), 您可以监听用户长时间点击 地图的事件。这个监听与点击的监听类似,您通过设置 onMapLongClick(LatLng)可以接到长按事件的通 知。使用时必须在主线程中进行调用。

10.3 移动地图事件
调用 AMap. setOnCameraChangeListener (OnCameraChangeListener),您可以监听用户改变可 视区域的事件。可视区域改变时回调 onCameraChange(CameraPosition postion)方法;当改变地图可 视区域的操作(如拖动、动画滑动、缩放)完成之后回调 onCameraChangeFinish(CameraPosition postion)方法。使用时必须在主线程中进行调用。

10.4 示例代码
详细信息,请参考示例工程“Events 功能”案例 / com.amapv2.apis.basic. EventsActivity.java 。 public class EventsActivity extends FragmentActivity implements OnMapClickListener, OnMapLongClickListener, OnCameraChangeListener { private void setUpMap() { aMap.setOnMapClickListener(this);// 对 amap 添加单击地图事件监听器 aMap.setOnMapLongClickListener(this);// 对 amap 添加长按地图事件监听器 aMap.setOnCameraChangeListener(this);// 对 amap 添加移动地图事件监听器 } /** * 对单击地图事件回调 */ @Override public void onMapClick(LatLng point) { mTapTextView.setText("tapped, point=" + point); } /** * 对长按地图事件回调 */

高德软件有限公司 | 41

@Override public void onMapLongClick(LatLng point) { mTapTextView.setText("long pressed, point=" + point); } /** * 对正在移动地图事件回调 */ @Override public void onCameraChange(final CameraPosition position) { mCameraTextView.setText("onCameraChange:" + position.toString()); } /** * 对移动地图结束事件回调 */ @Override public void onCameraChangeFinish(CameraPosition cameraPosition) { mCameraTextView.setText("onCameraChangeFinish:" + cameraPosition.toString()); // 获取可视区域 VisibleRegion visibleRegion = aMap.getProjection().getVisibleRegion(); LatLngBounds latLngBounds = visibleRegion.latLngBounds;// 获取可视区域的 Bounds // 判断上海经纬度是否包括在当前地图可见区域 boolean isContain = latLngBounds.contains(Constants.SHANGHAI); if (isContain) { ToastUtil.show(EventsActivity.this, "上海市在地图当前可见区域内"); } else { ToastUtil.show(EventsActivity.this, "上海市超出地图当前可见区域"); } }

高德软件有限公司 | 42

11

可视区域操作( Camera )

高德地图的 Android SDK 允许您通过修改地图可视区域,改变用户的观看视角。

11.1 可视区域的位置( CameraPosition )
可视区域的位置由以下属性组成: ? ? ? ? 目的地 缩放级别 方向 倾斜角度

屏幕当前可视区域的位置可以通过 AMap. getCameraPosition()方法获取。

11.1.1

目的地(target)

地图的中心位置。位置使用经度和纬度说明。

11.1.2

缩放级别(zoom)

可视区域的缩放级别决定了地图的比例。地图缩放级别为 4-20 级,缩放级别不必是一个整数。 缩放级别较低时,您可以看到更多地区的地图;缩放级别高时,您可以查看地区更加详细的地图。 下面的图像显示出不同的缩放级别:

高德软件有限公司 | 43

11.1.3

方向(bearing)

默认情况下,地图的方向为 0 度,屏幕正上方指向北方。当您逆时针旋转地图时,地图正北方向与屏 幕正上方的夹角度数为地图方向,范围是从 0 度到 360 度。 例如,一个 90 度的查询结果,在地图上的向上的方向指向正东。

11.1.4

倾斜角度(tilt)

可视区域的位置在地图的中心位置和地球的表面之间的圆弧上,从最低点以度测量(方向直接指向下 方的可视区域) 。当您改变视角,地图显示的角度来看,远方的建筑变小,附*的建筑则变大,产生立体效 果。 地图倾角范围为 0-45 度。

高德软件有限公司 | 44

11.2 移动可视区域
地图 API 允许您在屏幕上切换显示的地图区域。这是通过改变可视区域的位置实现的。 改变可视区域的位置,需要您明确想要把可视区域移动到哪里。高德地图 API 允许您使用 CameraUpdateFactory 创建不同类型的 CameraUpdate。以下的选项可供使用。

11.2.1

仅更改缩放级别

CameraUpdateFactory.zoomIn() 和 CameraUpdateFactory.zoomOut()可以改变缩放级别放大或 缩小 1,同时保持其他相同的属性。 CameraUpdateFactory.zoomTo(float)改变缩放级别为一个定值,同时保持其他相同的属性。 CameraUpdateFactory.zoomBy(float x)和 CameraUpdateFactory.zoomBy(float, Point)通过定 值,增加或降低 x(如果值为负数)缩放级别。后者根据地图上指定坐标点,放大或缩小地图,为了实现 这一点,所以它可能会改变可视区域的中心位置。 这些方法返回一个 CameraUpdate 对象,使用 AMap. moveCamera(CameraUpdate update)方法 更新可视区域显示在地图上。

高德软件有限公司 | 45

11.2.2

仅更改视图中心点

有两个简便的方法可以改变位置:CameraUpdateFactory.newLatLng(LatLng),可以改变可视区域 的经纬度并且保留其他属性。 CameraUpdateFactory.newLatLngZoom(LatLng, float),可以改变可视区域的经纬度、缩放级别, 并且保留其他属性。 返回一个 CameraUpdate 对象,使用 AMap. moveCamera(CameraUpdate update)方法更新可视 区域显示在地图上。

11.2.3

仅更改旋转角度

使用 CameraUpdateFactory. changeBearing(float bearing)方法可以改变可视区域的方向并且保 留其他属性。返回一个 CameraUpdate 对象,使用 AMap. moveCamera(CameraUpdate update)方法 更新可视区域显示在地图上。

11.2.4

仅更改倾斜角度

使用 CameraUpdateFactory. changeTilt(float tilt)方法可以改变可视区域的倾斜角度并且保留其他 属性。返回一个 CameraUpdate 对象,使用 AMap. moveCamera(CameraUpdate update)方法更新可 视区域显示在地图上。

11.2.5

更改可视区域

为了改变可视区域的位置更加灵活,可以使用 CameraUpdateFactory.newCameraPosition(CameraPosition)移动可视区域到指定位置。 CameraPosition 可以用以下方法直接获取:使用 new CameraPosition()或使用 new CameraPosition.Builder()。 返回一个 CameraUpdate 对象,使用 AMap. moveCamera(CameraUpdate update)方法更新可视 区域显示在地图上。

11.2.6

示例代码

详细信息, 请参考示例工程 “Camera 功能” 案例 / com.amapv2.apis.basic.CameraActivity.java 。 public class CameraActivity extends Activity implements OnClickListener, CancelableCallback { /** * 根据动画按钮状态,调用函数 animateCamera 或 moveCamera 来改变可视区域 */ private void changeCamera(CameraUpdate update, CancelableCallback callback) { boolean animated = ((CompoundButton) findViewById(R.id.animate)) 高德软件有限公司 | 46

.isChecked(); if (animated) { aMap.animateCamera(update, 1000, callback); } else { aMap.moveCamera(update); } } @Override public void onClick(View v) { switch (v.getId()) { /** * 点击停止动画按钮响应事件 */ case R.id.stop_animation: aMap.stopAnimation(); break; /** * 点击“去中关村”按钮响应事件 */ case R.id.Zhongguancun: changeCamera( CameraUpdateFactory.newCameraPosition(new CameraPosition( Constants.ZHONGGUANCUN, 18, 0, 30)), null); break; /** * 点击“去陆家嘴”按钮响应事件 */ case R.id.Lujiazui: changeCamera( CameraUpdateFactory.newCameraPosition(new CameraPosition( Constants.SHANGHAI, 18, 30, 0)), this); break; /** * 点击向左移动按钮响应事件,camera 将向左边移动 */ case R.id.scroll_left: changeCamera(CameraUpdateFactory.scrollBy(-SCROLL_BY_PX, 0), null); break; /** * 点击向右移动按钮响应事件,camera 将向右边移动 */ case R.id.scroll_right: changeCamera(CameraUpdateFactory.scrollBy(SCROLL_BY_PX, 0), null); break; /** * 点击向上移动按钮响应事件,camera 将向上边移动 */ case R.id.scroll_up: changeCamera(CameraUpdateFactory.scrollBy(0, -SCROLL_BY_PX), null); break; /** * 点击向下移动按钮响应事件,camera 将向下边移动 */ case R.id.scroll_down:

高德软件有限公司 | 47

changeCamera(CameraUpdateFactory.scrollBy(0, SCROLL_BY_PX), null); break; /** * 点击地图缩小按钮响应事件 */ case R.id.zoom_in: changeCamera(CameraUpdateFactory.zoomIn(), null); break; /** * 点击地图放大按钮响应事件 */ case R.id.zoom_out: changeCamera(CameraUpdateFactory.zoomOut(), null); break; default: break; } } @Override public void onCancel() { ToastUtil.show(CameraActivity.this, "Animation to 陆家嘴 canceled"); } @Override public void onFinish() { ToastUtil.show(CameraActivity.this, "Animation to 陆家嘴 complete"); } }

11.3 设置可视区域边界
在最大可能缩放级别下,移动可视区域保证所有兴趣点都是可见的,这种情况下,就需要设置可视区 域边界。例如:显示用户当前位置 5 公里范围内的所有加油站,您想要移动可视区域保证所有的加油站都 可以在屏幕上显示。 使用 CameraUpdateFactory.newLatLngBounds (LatLngBounds bounds, int padding)获取一个 CameraUpdate 对象,改变可视区域(使用 Projection.getVisibleRegion ()方法可以计算屏幕区域 LatLngBounds 的大小) 。注意:地图的方向和倾斜角都应该为 0 度。 重载方法 CameraUpdateFactory.newLatLngBounds (LatLngBounds bounds, int width, int height, int padding)允许您指定矩形区域的长和宽(像素为单位) 。 说明: 1. newLatLngBounds (LatLngBounds bounds, int padding)方法需要在地图初始化完成之后使 用。方法 newLatLngBounds (LatLngBounds bounds, int width, int height, int padding)没 有使用限制。 2. 在 onCreate 时设置可视区域边界,需要使用接口 AMap.OnMapLoadedListener。当地图载入 成功后回调 onMapLoaded() 方法。 示例代码如下(详细信息,请参见示例工程 MarkerActivity.java) :

高德软件有限公司 | 48

public class MarkerActivity extends FragmentActivity implements OnMapLoadedListener { /** * 监听 amap 地图加载成功事件回调 */ @Override public void onMapLoaded() { // 设置所有 maker 显示在 View 中 LatLngBounds bounds = new LatLngBounds.Builder() .include(Constants.XIAN).include(Constants.CHENGDU) .include(marker1).include(marker2).include(marker3) .include(marker4).include(marker5).include(marker6) .include(marker7).include(marker8).include(marker9) .include(marker10).build(); // 移动地图,所有 marker 自适应显示。LatLngBounds 与地图边缘 10 像素的填充区域 aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10)); }

高德软件有限公司 | 49

12

离线地图

用户在使用高德地图应用时, 可以使用离线地图来减少使用过程中的调用地图的流量, 提高访问速度。

12.1 开始下载
目前您可以根据城市编码和城市名称两种方式下载该城市的离线地图。使用方法为 OfflineMapManager.downloadByCityCode(String citycode)和 OfflineMapManager.downloadByCityName(String cityname)。 示例代码如下(详细信息,请参考示例工程“离线地图”案例 / com.amapv2.apis.offlinemap.OfflineMapActivity.java) : /** * 开始下载离线地图 */ private void downloadMap(String city) { amapManager = new OfflineMapManager(this, this); boolean start = false; try { start = amapManager.downloadByCityName(city); if (!start) { ToastUtil.show(this, "下载离线地图数据失败"); } else { ToastUtil.show(this, "开始下载离线地图数据"); } } catch (Exception e) { e.printStackTrace(); ToastUtil.show(this, "开启下载失败,请检查网络是否开启!"); } }

12.2 暂停下载
离线地图下载过程中,可以通过代码暂停地图的下载。 示例代码如下(详细信息,请参考示例工程“离线地图”案例 / com.amapv2.apis.offlinemap.OfflineMapActivity.java) : /** * 点击暂停按钮响应事件回调 */ public void pauseButton(View view) { amapManager = new OfflineMapManager(this, this); amapManager.pause(); ToastUtil.show(this, "暂停下载离线地图数据"); }

高德软件有限公司 | 50

12.3 停止下载
正在下载的离线地图包可以使用 OfflineMapManager. stop()方法停止下载。 示例代码如下(详细信息,请参考示例工程“离线地图”案例 / com.amapv2.apis.offlinemap.OfflineMapActivity.java) : /** * 点击停止按钮响应事件回调 */ public void stopButton(View view) { amapManager = new OfflineMapManager(this, this); amapManager.stop(); ToastUtil.show(this, "停止下载离线地图数据"); }

12.4 更改手机下载目录
默认离线地图数据下载到手机存储卡的“amap\mini_mapv3\vmap”目录下,您可以参照示例代码 自定义该路径。 示例代码如下(详细信息,请参考示例工程“离线地图”案例 / com.amapv2.apis.offlinemap.OfflineMapActivity.java) : protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置应用单独的地图存储目录,在下载离线地图或初始化地图时设置 MapsInitializer.sdcardDir = getSdCacheDir(this); …………………………………………………………………………………………………………… } /** * 获取 map 缓存和读取目录 */ private String getSdCacheDir(Context context) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { java.io.File fExternalStorageDirectory = Environment .getExternalStorageDirectory(); java.io.File autonaviDir = new java.io.File( fExternalStorageDirectory, "Company"); boolean result = false; if (!autonaviDir.exists()) { result = autonaviDir.mkdir(); } java.io.File minimapDir = new java.io.File(autonaviDir, "Name"); if (!minimapDir.exists()) { result = minimapDir.mkdir(); } return minimapDir.toString() + "/"; } else { return null; } }

高德软件有限公司 | 51

12.5 获取离线地图城市列表
使用 OfflineMapManager.getOfflineMapCityList()方法您可以查看离线地图可下载城市的列表。

12.6 获取全国离线地图数据
OfflineMapProvince 类可以用来获取全国包括各省、市离线地图的数据。

12.7 获取已下载城市列表
使用 OfflineMapManager. getDownloadOfflineMapCityList()方法您可以查看已下载的城市列表。

12.8 获取正在或等待下载城市列表
使用 OfflineMapManager. getDownloadingCityList()方法您可以查看正在或等待下载的城市列表。

12.9 判断数据是否存在更新
已经下载的离线地图包,可以使用 OfflineMapManager.updateOfflineCityByName(String cityname)方法判断该地图包是否存在更新。 示例代码如下(详细信息,请参考示例工程“离线地图”案例 / com.amapv2.apis.offlinemap.OfflineMapActivity.java) : /** * 点击更新按钮响应事件回调 */ public void updateButton(View view) { final String city = AMapUtil.checkEditText(cityName); if ("".equals(city)) { ToastUtil.show(OfflineMapActivity.this, "请输入城市名字"); return; } else { ToastUtil.show(this, "下载离线地图数据失败"); new Thread(new Runnable() { @Override public void run() { try { update = amapManager.updateOfflineCityByName(city); runOnUiThread(new Runnable() { @Override public void run() { if (update) { ToastUtil.show(OfflineMapActivity.this, city + "离线数据有更新"); downloadMap(city); } else { ToastUtil.show(OfflineMapActivity.this, city + "离线数据已经是最新的了"); }

高德软件有限公司 | 52

} }); } catch (Exception e) { e.printStackTrace(); } } }).start(); } }

12.10

删除城市离线地图包

当您不需要某一城市的离线地图包时,可以根据城市名称使用 OfflineMapManager. remove(String cityname)删除该离线地图包。 示例代码如下(详细信息,请参考示例工程“离线地图”案例 / com.amapv2.apis.offlinemap.OfflineMapActivity.java) : /** * 点击删除按钮响应事件回调 */ public void deleteButton(View view) { String city = AMapUtil.checkEditText(cityName); if ("".equals(city)) { ToastUtil.show(OfflineMapActivity.this, "请输入城市名字"); return; } else { amapManager.remove(city); ToastUtil.show(this, "删除离线地图数据"); } }

高德软件有限公司 | 53

13

地图*

对当前屏幕的地图区域进行*粒梢缘饔 AMap.OnMapScreenShotListener()接口来实现。此 功能可以对地图、覆盖物(包含信息窗口) 、Logo 进行截取屏幕,地图控件、Toast 窗口除外。 示例代码如下(详细信息,请参考示例工程“地图*凉δ堋卑咐 / com.amapv2.apis.basic.ScreenShotActivity.java) : /** * 对地图进行* */ public void getMapScreenShot(View v) { // 设置*良嗵涌冢厝〉赝伎墒忧 aMap.getMapScreenShot(this); } /** * *粱氐鞣椒 */ @Override public void onMapScreenShot(Bitmap bitmap) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); try { // 保存在 SD 卡根目录下,图片为 png 格式。 FileOutputStream fos = new FileOutputStream( Environment.getExternalStorageDirectory() + "/test_" + sdf.format(new Date()) + ".png"); boolean b = bitmap.compress(CompressFormat.PNG, 100, fos); try { fos.flush(); } catch (IOException e) { e.printStackTrace(); } try { fos.close(); } catch (IOException e) { e.printStackTrace(); } if (b) ToastUtil.show(ScreenShotActivity.this, "*脸晒"); else { ToastUtil.show(ScreenShotActivity.this, "*潦О"); } } catch (FileNotFoundException e) { e.printStackTrace(); } }

高德软件有限公司 | 54

14

兴趣点搜索

注意:Android SDK V2.1.X 版本为全新搜索服务,与 V2.0.4 版本搜索接口互不兼容。 Android SDK 提供了对 POI(Point Of Interesting,兴趣点)的搜索。高德地图 API 总计包含千万 级别的 POI。 目前支持关键字搜索、周边搜索、指定区域搜索、团购/优惠搜索和相关搜索的同步异步方法。前三种 搜索返回 POI 的基本信息,如 POI ID,POI 名称、类型、经纬度、地址等。已知 POI ID 可通过团购/优惠 搜索查询 POI 的团购优惠信息。 兴趣点搜索可以根据 POI 列表的数据,使用 PoiOverlay 画出 POI 图层,包括默认的 Marker 和 InfoWindow。另外也可以自定义 Marker 和 InfoWindow 的图标和信息。

14.1 关键字搜索
1. 搜索条件设置 您需要通过 PoiSearch.Query(String query, String ctgr, String city)设置搜索条件。 参数“query”为搜索的关键字, “ctgr”为搜索类型(类型参照表从相关下载处获取) 、 “ city”为搜 索城市。关键字、类型至少输入一个。参数“city”设置为空,为全国范围内进行搜索。 通过 Query.setPageSize(int) 设置查询每页的结果数目 通过 Query.setPageNum(int)设置查询第几页 2. 发送请求和接收数据

使用 PoiSearch. searchPOIAsyn() 搜索 POI ,在 PoiSearch.OnPoiSearchListener 接口回调方法 onPoiSearched(PoiResult poiResult,int rCode)中处理返回结果。 当指定搜索城市时,若没有返回 POI 结果,则会返回包含关键字的建议城市名称。当关键字搜索无结 果时,则会返回搜索建议关键字。显示效果如图所示:

高德软件有限公司 | 55

示例代码如下: 详细信息,请参见示例工程 PoiKeywordSearchActivity.java。 ? 发送请求

currentPage = 0; query = new PoiSearch.Query(keyWord, "", editCity.getText().toString());// 第 一个参数表示搜索字符串,第二个参数表示 poi 搜索类型,第三个参数表示 poi 搜索区域(空字符串代 表全国) query.setPageSize(10);// 设置每页最多返回多少条 poiitem query.setPageNum(currentPage);// 设置查第一页 PoiSearch poiSearch = new PoiSearch(this, query); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPoiAsyn(); ? 回调接口返回结果

public void onPoiSearched(PoiResult result, int rCode) { dissmissProgressDialog();// 隐藏对话框 if (rCode == 0) { if (result != null && result.getQuery() != null) {// 搜索 poi 的结果 if (result.getQuery().equals(query)) {// 是否是同一条 poiResult = result; poiItems = poiResult.getPois();// 取得第一页的 poiitem 数据, 页 数从数字 0 开始 List<SuggestionCity> suggestionCities = poiResult .getSearchSuggestionCitys();// 当搜索不到 poiitem 数 高德软件有限公司 | 56

据时,会返回含有搜索关键字的城市信息 if (poiItems != null && poiItems.size() > 0) { aMap.clear();// 清理之前的图标 poiOverlay = new PoiOverlay(aMap, poiItems); poiOverlay.removeFromMap(); poiOverlay.addToMap(); poiOverlay.zoomToSpan(); } else if (suggestionCities != null && suggestionCities.size() > 0) { showSuggestCity(suggestionCities); } else { ToastUtil.show(PoiAroundSearchActivity.this, R.string.no_result); } } } else { ToastUtil.show(PoiAroundSearchActivity.this, R.string.no_result); } } else { ToastUtil.show(PoiAroundSearchActivity.this, R.string.error_network); } }

14.2 周边搜索
1. 2. 参照“关键字搜索”步骤 1 设置搜索条件。 设置周边搜索。

使用 PoiSearch.SearchBound (LatLonPoint center, int radiusInMeters)设置周边圆形搜索范围。 参 数“center”为搜索的中心点坐标, “radiusInMeters”为周边搜索的范围。 3. 发送请求和接收数据。

示例代码如下: 详细信息,请参考示例工程“poi 周边搜索”案例 / com.amapv2.apis.poisearch.PoiAroundSearchActivity.java。 ? 发送请求

currentPage = 0; query = new PoiSearch.Query(keyWord, " 餐厅", cityCode);// 第一个参数表示搜索字符 串,第二个参数表示 poi 搜索类型,第三个参数表示 poi 搜索区域(空字符串代表全国) query.setPageSize(10);// 设置每页最多返回多少条 poiitem query.setPageNum(currentPage);//设置查第一页 PoiSearch poiSearch = new PoiSearch(this,query); poiSearch.setBound(new SearchBound(new LatLonPoint( locationMarker.getPosition().latitude, locationMarker.getPosition().longitude), 1000)); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPoiAsyn(); ? 通过回调接口获取数据

public void onPoiSearched(PoiResult result, int rCode) { // TODO Auto-generated method stub 高德软件有限公司 | 57

if(rCode == 0){ if (result != null&&result.getQuery()!=null) {//搜索 POI 的结果 if(result.getQuery().equals(query)){//是否是同一条 poiResult = result; int resultPages = poiResult.getPageCount();// 取得搜索到的 poiitems 有 多少页 List<PoiItem> poiItems = poiResult.getPois();// 取得第一页的 poiitem 数据,页数从数字 0 开始 List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();// 当搜索不到 poiitem 数据时,会返回含有搜索关键字的城 市信息 dissmissProgressDialog();// 隐藏对话框 if (poiItems != null && poiItems.size() > 0) { aMap.clear();//清理之前的图标 PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems); poiOverlay.removeFromMap(); poiOverlay.addToMap(); poiOverlay.zoomToSpan(); } else if (suggestionCities != null && suggestionCities.size() > 0) { showSuggestCity(suggestionCities); }else{ ToastUtil.show(PoiAroundSearchActivity.this, R.string.no_result); } } } else { dissmissProgressDialog();// 隐藏对话框 ToastUtil.show(PoiAroundSearchActivity.this, R.string.no_result); } }else{ dissmissProgressDialog();// 隐藏对话框 ToastUtil.show(PoiAroundSearchActivity.this, R.string.error_network); } }

14.3 指定区域搜索
1. 2. 3. 参照“关键字搜索”步骤 1 设置搜索条件。 根据搜索矩形区域左下角和右上角的顶点坐标,使用 PoiSearch.SearchBound (LatLonPoint lowerLeft, LatLonPoint upperRight)设置搜索范围。 参照“周边搜索”步骤 3,搜索 POI,返回搜索结果。

14.4 团购 / 优惠搜索
以上关键字搜索、周边搜索、指定区域搜索、城市搜索,可以通过设定筛选条件,得到只有团购或者 优惠的 POI ID。获取到 POI ID 后,使用 PoiSearch.searchPOIDetailAsyn(String poiID)发送请求,通过 PoiSearch.OnPoiSearchListener 中 onPoiItemDetailSearched( PoiItemDetail poiItemDetail, int rCode)来得到团购优惠信息。

高德软件有限公司 | 58

显示效果如图所示:

示例代码如下: 详细信息,请参考示例工程“poi 周边搜索”案例 / com.amapv2.apis.poisearch.PoiAroundSearchActivity.java。 switch(searchType){ case 0:{//所有 POI query.setLimitDiscount(false); query.setLimitGroupbuy(false); } break; case 1:{//有团购 query.setLimitGroupbuy(true); query.setLimitDiscount(false); } break; case 2:{//有优惠 query.setLimitGroupbuy(false); query.setLimitDiscount(true); } break; case 3:{//有团购或者优惠 query.setLimitGroupbuy(true); query.setLimitDiscount(true);

高德软件有限公司 | 59

} break; }

高德软件有限公司 | 60

14.5 POI 深度信息
POI 深度信息提供餐饮、酒店、影院、景点四种类型的详细描述信息。餐饮类(Dining)的深度 信息包括口味、环境、服务评分,人均消费,特色菜,氛围图片等该餐厅的描述。酒店类(Hotel) 的深度信息包括综合评分,星级,简介,最低房价,卫生评分等相关信息。影院类(Cinema)的深 度信息包括综合评分,星级,停车场信息,营业时间,图片等相关信息。景点类(Scenic)的深度信 息包括简介,综合评分,信息来源,票价,景区主题等相关信息。 以上关键字搜索、周边搜索、指定区域搜索、城市搜索,可以通过设定筛选条件,得到只有团购 或者优惠的 POI ID。用户在获取到指定的 POI ID 后,使用 PoiSearch.searchPOIDetailAsyn(String poiID)发送请求来获取该指定 POI ID 的深度信息结果,在 POI 详情回调函数 onPoiItemDetailSearched()中处理返回结果,如获取该餐饮 POI 信息:Dining dining = result.getDining(),dining.getTasteRating() 获取用户对该餐厅的口味评分。 显示效果如下图所示:

15

输入提示搜索

用户在类似路径规划或 POI 搜索时, 需要输入关键字来进行查询。 在输入关键字 (至少两个字符) 时, 可以使用类 Inputtips 的 Inputtips.InputtipsListener 接口监听输入信息, 并使用 requestInputtips(String keyword, String city)发送提示请求。 注:提示中会出现相同的关键字,但是这些关键字所在区域不同,使用时可以通过 tipList.get(i).getDistrict()获得区域,也可以在提示时在关键字后加上区域。 例如用户输入“高德” ,输入框下方的列表会显示包含关键字字段的输入提示信息。 显示效果如下:

高德软件有限公司 | 61

示例代码如下: 详细信息,请参考示例工程“poi 关键字搜索”案例 / com.amapv2.apis.poisearch.PoiKeywordSearchActivity.java。 // 输入提示的监听接口 startTextView.addTextChangedListener(new TextWatcher() { // 输入信息改变之后 public void afterTextChanged(Editable editable) { } // 输入信息改变之前 public void beforeTextChanged(CharSequence s, int start, int count, int after) { } // 正在输入 public void onTextChanged(CharSequence s, int start, int before, int count) { String newText = s.toString(); // 输入信息的回调方法 InputtipsinputTips = new Inputtips(RouteActivity.this, new InputtipsListener() { @Override public void onGetInputtips(List<Tip> tipList ,int rCode) { List<String>listString = new ArrayList<String>(); for (inti = 0; i<tipList.size(); i++) { 高德软件有限公司 | 62

listString.add(tipList.get(i).getName()); } aAdapter = new ArrayAdapter<String>( getApplicationContext(), R.layout.route_inputs, listString); startTextView.setAdapter(aAdapter); aAdapter.notifyDataSetChanged(); } }); try { // 发送输入提示请求 inputTips.requestInputtips(newText, "");// 第一个参数表示提示关键字,第 二个参数默认代表全国,也可以为城市区号 } catch (AMapException e) { e.printStackTrace(); } }

高德软件有限公司 | 63

16

路径规划

注意:Android SDK V2.1.X 版本为全新搜索服务,与 V2.0.4 版本搜索接口互不兼容。

16.1 步行路径规划
步行路径规划可以根据起终点和步行路线的数据,使用 WalkRouteOverlay 画出步行路线图层,包括 起终点和转弯点。另外也可以自定义起终点和步行转弯点的图标。 1. 设置搜索条件

通过 WalkRouteQuery(RouteSearch.FromAndTo ft, int mode)设置搜索条件 ft - 路径的起终点。 mode - 计算路径的模式。可选,默认为最快捷。 2. 发送请求和接收数据

根据给出的起终点坐标和路径的模式 (模式类型参照参考手册类 RouteSearch) , 使用类 RouteSearch 的 calculateWalkRouteAsyn(WalkRouteQuery query)方法,得到路径的规划方案。返回的信息中您可 以获得路段的距离、步行的预计时间、步行路段的坐标点、步行路段的道路名称、导航主要操作等信息。 显示效果如下:

示例代码如下: 详细信息,请参考示例工程“Route 功能”案例 / com.amapv2.apis.route.RouteActivity.java 高德软件有限公司 | 64

?

发送请求

routeSearch = new RouteSearch(this); routeSearch.setRouteSearchListener(this); WalkRouteQuery query = new WalkRouteQuery(fromAndTo, walkMode); routeSearch.calculateWalkRouteAsyn(query); ? 回调方法 public void onWalkRouteSearched(WalkRouteResult result, int rCode) { // TODO Auto-generated method stub // 路径规划中步行模式 progDialog.dismiss(); if(rCode == 0){ if(result != null && result.getPaths() != null && result.getPaths().size() > 0){ walkRouteResult = result; WalkPath walkPath = walkRouteResult.getPaths().get(0); aMap.clear();//清理之前的图标 WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay( this,aMap, walkPath, walkRouteResult.getStartPos(), walkRouteResult.getTargetPos()); walkRouteOverlay.removeFromMap(); walkRouteOverlay.addToMap(); walkRouteOverlay.zoomToSpan() }else{ progDialog.dismiss();// 隐藏对话框 ToastUtil.show(RouteActivity.this, R.string.no_result); } }else{ progDialog.dismiss();// 隐藏对话框 ToastUtil.show(RouteActivity.this, R.string.error_network); } }

16.2 公交路径规划
公交路径规划可以根据起终点和公交换乘的数据,使用 BusRouteOverlay 画出公交路线图层,包括 起终点和换乘点。另外也可以自定义起终点和换乘点的图标。 1. 设置搜索条件

目前公交路径规划只支持同一城市起点和终点坐标路径规划。跨城市的查询请参考驾车路径规划。通 过 BusRouteQuery(RouteSearch.FromAndTo ft, int mode, java.lang.String city, int nightflag)设置搜 索条件 ft - 路径的起终点。 mode - 计算路径的模式。可选,默认为最快捷。 city - 城市名称/城市区号/电话区号。此项不能为空。 nightflag - 是否计算夜班车,默认为不计算。0:不计算,1:计算。可选。 如果选择计算夜班车(nightflag=1) ,返回的夜班车数据将会排列在结果的前边。如果存在地铁换乘 出行,返回结果中还包括地铁的入站口和出站口信息。 公交路径规划的一个路段(类 BusStep) ,必存在一段公交导航信息,最多包含一段步行信息。 高德软件有限公司 | 65

返回结果构成如下图所示:

公交规划结果 (BusRouteResult)

方案1 (BusPath)

路段1 (BusStep)

公交信息 RouteBusLineItem 公交信息 RouteBusLineItem 步行信息 RouteBusWalkItem

方案2 (BusPath)

路段2 (BusStep)

路段n (BusStep) 方案n (BusPath)
2. 发送请求和接收数据

使用类 RouteSearch 的 calculateBusRouteAsyn(BusRouteQuery query)方法,得到路径的规划方 案。显示效果如下:

示例代码如下: 详细信息,请参考示例工程“Route 功能”案例 / com.amapv2.apis.route.RouteActivity.java 高德软件有限公司 | 66

?

发送请求

routeSearch = new RouteSearch(this); routeSearch.setRouteSearchListener(this); BusRouteQuery query = new BusRouteQuery(fromAndTo, RouteSearch.BusLeaseWalk, "010",0);// 第一个参数表示路径规划的起点和终点,第二个参数表示公交查询模式,第三个参数表示公 交查询城市区号,第四个参数表示是否计算夜班车,0 表示不计算 RouteSearch.calculateBusRouteAsyn(query); ? 回调方法 public void onBusRouteSearched(BusRouteResult result, int rCode) { // TODO Auto-generated method stub // 路径规划中公交模式 progDialog.dismiss(); if(rCode == 0){ if(result != null && result.getPaths() != null && result.getPaths().size() > 0){ busRouteResult = result; BusPath busPath = busRouteResult.getPaths().get(0); aMap.clear();//清理之前的图标 BusRouteOverlay routeOverlay = new BusRouteOverlay( this,aMap, busPath, busRouteResult.getStartPos(), busRouteResult.getTargetPos()); routeOverlay.removeFromMap(); routeOverlay.addToMap(); routeOverlay.zoomToSpan(); }else{ progDialog.dismiss();// 隐藏对话框 ToastUtil.show(RouteActivity.this, R.string.no_result); } }else{ progDialog.dismiss();// 隐藏对话框 ToastUtil.show(RouteActivity.this, R.string.error_network); } }

16.3 驾车路径规划
驾车路径规划可以根据起终点和驾车路线的数据,使用 DrivingRouteOverlay 画出驾车路线图层,包 括起终点和转弯点。另外也可以自定义起终点和驾车转弯点的图标。 1. 设置搜索条件 ft, int mode, java.util.List<LatLonPoint> java.lang.String

目前驾车路径规划支持途经点、避让区域以及支持选择一条避让道路,通过 DriveRouteQuery(RouteSearch.FromAndTo passedByPoints, avoidRoad)设置搜索条件 ft - 路径的起点终点。 mode - 计算路径的模式。可选,默认为速度优先。 passedByPoints - 途经点,可选。坐标 点之间用 ";"分隔,最多支持 16 个坐标点。 java.util.List<java.util.List<LatLonPoint>> avoidpolygons,

高德软件有限公司 | 67

avoidpolygons - 避让区域,可选。区域避让,支持 32 个避让区域,每个区域最多可有 16 个顶点。 坐标点之间用 ";"分隔,区域之间用 "|"分隔。如果是四边形则有 4 个坐标点,如果是五边形则有 5 个坐标 点。 2. 发送请求和接收数据

使用类 RouteSearch 的 calculateDriveRouteAsyn(DriveRouteQuery query)方法, 得到路径的规划 方案。显示效果如下:

示例代码如下: 详细信息,请参考示例工程“Route 功能”案例 / com.amapv2.apis.route.RouteActivity.java。 ? 发送请求

routeSearch = new RouteSearch(this); routeSearch.setRouteSearchListener(this); DriveRouteQuery query = new DriveRouteQuery(fromAndTo, drivingMode, null, null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车 模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路 routeSearch.calculateDriveRouteAsyn(query); ? 回调方法 public void onDriveRouteSearched(DriveRouteResult result, int rCode) { // TODO Auto-generated method stub // 路径规划中驾车模式 progDialog.dismiss(); if(rCode == 0){ if(result != null && result.getPaths() != null && result.getPaths().size() > 高德软件有限公司 | 68

0){ driveRouteResult = result; DrivePath drivePath = driveRouteResult.getPaths().get(0); aMap.clear();//清理之前的图标 DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(this,aMap, drivePath,driveRouteResult.getStartPos(), driveRouteResult.getTargetPos()); drivingRouteOverlay.removeFromMap(); drivingRouteOverlay.addToMap(); drivingRouteOverlay.zoomToSpan(); }else{ progDialog.dismiss();// 隐藏对话框 ToastUtil.show(RouteActivity.this, R.string.no_result); } }else{ progDialog.dismiss();// 隐藏对话框 ToastUtil.show(RouteActivity.this, R.string.error_network); } }

高德软件有限公司 | 69

17

公交路线查询

注意:Android SDK V2.1.X 版本为全新搜索服务,与 V2.0.4 版本搜索接口互不兼容。 您可以根据线路名称、途经站点、线路 ID 查询公交线路信息。下面将详细介绍三种检索的使用方法。 公交线路查询必须指定查询城市。

17.1 线路名称查询
根据 BusLineSearch(Context act, new BusQuery(String query, BusLineQuery.SearchType ctgr, String city))创建一个 BusLineSearch 对象,并设置查询条件。查询类型参数 ctgr 此处设置为 BusLineQuery.SearchType.BY_LINE_NAME。 使用 BusLineSearch.searchBusLineAsyn()搜索。当根据线路名称搜索无结果时,会自动匹配关键字 为途经点名*兴阉鳌 显示效果如图:

结果返回线路信息有线路 ID、公交类型、线路名称、坐标串、城市编码、首发站、末站。 示例代码: 详细信息,请参考示例工程“Busline 功能”案例 / com.amapv2.apis.busline.BuslineActivity.java ? 发送请求 busLineQuery = new BusLineQuery(search,SearchType.BY_LINE_NAME,cityCode); 高德软件有限公司 | 70

busLineQuery.setPageSize(10); busLineQuery.setPageNumber(0); BusLineSearch busLineSearch = new BusLineSearch(this,busLineQuery); busLineSearch.setOnBusLineSearchListener(this); busLineSearch.searchBusLineAsyn(); ? 回调方法

public void onBusLineSearched(BusLineResult result, int rCode) { // TODO Auto-generated method stub if(rCode == 0){ if(result != null && result.getQuery() != null && result.getQuery().equals(busLineQuery)){ dissmissProgressDialog(); if(result.getQuery().getCategory() == SearchType.BY_LINE_NAME){ if(result.getPageCount() > 0 && result.getBusLines() != null&&result.getBusLines().size()>0){ busLineResult = result; lineItems = result.getBusLines(); showResultList(lineItems); } }else if(result.getQuery().getCategory() == SearchType.BY_LINE_ID){ busLineResult = result; lineItems = busLineResult.getBusLines(); BusLineOverlay busLineOverlay = new BusLineOverlay(this,aMap, lineItems.get(0)); busLineOverlay.removeFromMap(); busLineOverlay.addToMap(); busLineOverlay.zoomToSpan(); } }else{ dissmissProgressDialog(); ToastUtil.show(BuslineActivity.this, R.string.no_result); } }else{ dissmissProgressDialog(); ToastUtil.show(BuslineActivity.this, R.string.error_network); } }

17.2 线路 ID 查询
获取公交线路的详细信息,可使用线路 ID 查询。 结果返回线路信息有线路 ID、公交类型、线路名称、线路坐标、城市编码、首发站、末站、首班车时 间、末班车时间、 所属公交公司、 全程里程、 起步价、 全程票价、 矩形区域 (外包矩形的左下与右上顶点) 、 线路沿途坐标。 参照 “线路名称查询”, 设置查询条件时, 查询类型参数 ctgr 此处设置为 BusLineQuery.SearchType. BY_LINE_ID。 可以根据公交线路的数据,使用 BusLineOverlay 画出公交线路图层,包括起终点和所有公交站点。 另外也可以自定义 Marker 和 InfoWindow 的图标和信息。 详细信息,请参见示例工程 com.amapv2.apis.busline.BuslineActivity.java。 高德软件有限公司 | 71

17.3 途径站点查询
根据 BusStationSearch(Context act, new BusQuery(String query, String city))创建一个 BusStationSearch 对象,并设置查询条件。 通过设置 busStationSearch.setOnBusLineSearchListener(this)来监听,使用 BusStationSearch.searchBusStationAsyn()搜索结果。 并通过 OnBusStationSearchListener.onBusStationSearched() 返回数据, 结果返回车站 ID、 车站 经纬度坐标、车站区域编码、车站名称、经过此公交站的公交路线等信息。

高德软件有限公司 | 72

18

坐标 / 地址查询

注意:Android SDK V2.1.X 版本为全新搜索服务,与 V2.0.4 版本搜索接口互不兼容。 当您想要将中文地址(或地名描述)与地理坐标之间进行转换,请您参考本章节进行操作。 目前高德地图 API 仅支持中国范围内的地理及逆地理编码,且只支持中文的中国地图数据,不支持英 文或汉语拼音的中国地图数据。

18.1 地理编码
地理编码是将中文地址(或地名描述)转换为地理坐标的功能。根据给定的地理名称和查询城市,返回 地理编码的结果列表。 显示效果如图:

示例代码如下: 详细信息,请参考示例工程“地理编码 功能”案例 / com.amapv2.apis.geocoder.GeocoderActivity.java。 ? 发送请求

geocoderSearch = new GeocodeSearch(this); 高德软件有限公司 | 73

geocoderSearch.setOnGeocodeSearchListener(this); GeocodeQuery query = new GeocodeQuery(name, "010");// 第一个参数表示地址,第二 个参数表示查询城市,中文或者中文全拼,citycode、adcode, geocoderSearch.getFromLocationNameAsyn(query); ? 回调方法

public void onGeocodeSearched(GeocodeResult result, int rCode) { // TODO Auto-generated method stub if(rCode == 0){ progDialog.dismiss(); if (result != null && result.getGeocodeAddressList() != null && result.getGeocodeAddressList().size() > 0) { GeocodeAddress address = result.getGeocodeAddressList().get(0); addressName = "经纬度值:" + address.getLatLonPoint() + "\n位置描述:" + address.getFormatAddress(); ToastUtil.show(GeocoderActivity.this, addressName); } else { ToastUtil.show(GeocoderActivity.this, R.string.no_result); } }else{ ToastUtil.show(GeocoderActivity.this, R.string.error_network); } }

18.2 逆地理编码
逆地理编码时将地理坐标转换为中文地址(地名描述)的功能。逆地理编码搜索时,还会返回坐标点 附*的 POI(兴趣点) 、道路以及交叉路口等信息。 目前高德地图 API 支持高德类型坐标、GPS 坐标的逆地理编码查询。 显示效果如图:

高德软件有限公司 | 74

示例代码如下: 详细信息,请参考示例工程“地理编码 功能”案例 / com.amapv2.apis.geocoder.GeocoderActivity.java。 ? 发送请求

geocoderSearch = new GeocodeSearch(this); geocoderSearch.setOnGeocodeSearchListener(this); RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200,GeocodeSearch.AMAP);// 第一个参数表示一个 Latlng,第二参数表示范围多少米,第三个参数 表示是火系坐标系还是 GPS 原生坐标系 geocoderSearch.getFromLocationAsyn(query); ? 回调方法

public void onRegeocodeSearched(RegeocodeResult result, int rCode) { // TODO Auto-generated method stub if(rCode == 0){ progDialog.dismiss(); if(result != null&&result.getRegeocodeAddress() null&&result.getRegeocodeAddress().getFormatAddress()!=null){ addressName = result.getRegeocodeAddress().getFormatAddress() + "附*"; ToastUtil.show(GeocoderActivity.this, addressName); }else{ ToastUtil.show(GeocoderActivity.this, R.string.no_result); } }else{

!=

高德软件有限公司 | 75

ToastUtil.show(GeocoderActivity.this, R.string.error_network); } }

高德软件有限公司 | 76




友情链接: