admin管理员组

文章数量:1533907

2024年2月28日发(作者:)

使用AutoNavi MAP API 开发地图应用

• 为什么要使用AutoNavi MAP API

• AutoNavi MAP API 概述

• AutoNavi Android MAP API 与 Google Android Map API 比较

• 如何使用 AutoNavi MAP API

如何实现坐标偏转

如何创建MapView

如何创建ItemizedOverlay

如何创建PoiSearch

如何创建Geocoder

如何创建MyLocation

• FAQ

• 技术支持(QQ群:122795260, 邮箱:mapservice@)

为什么要使用AutoNavi MAP API

因为商业上的原因,联想不能在中国市场发布的手机上预装Google相关的手机服务,包括Google地图API。为了解决这一问题,我们和高德公司(AutoNavi)合作,在手机上预置了AutoNavi提供的多种基于位置的服务。高德公司作为中国领先的导航电子地图内容和位置服务解决方案提供商,旗下的互联网MAP

API()同样在业界具有良好的口碑。可为客户提供跨平台、跨媒体的位置服务解决方案。我们同时鼓励中国的开发者们,使用AutoNavi MAP API开发基于位置和地图应用程序,并且发布在中国市场中的联想手机上。

AutoNavi MAP API 概述

AutoNavi MAP API是高德软件公司提供的调用地图的接口方法。用户的应用程序可以通过AutoNavi MAP

API提供的接口方法操作地图数据,实现位置相关或地图相关应用。例如,通过调用AutoNavi MAP API,将地图数据整合到自己的应用中,可以将商户的地理位置信息在地图上进行标注,以很直观的形式展现给使用者。AutoNavi MAP API还将添加自驾,公交及步行的线路规划API。同时,还将加入对矢量地图的支持,大幅提高地图下载的速度。在不久的将来,还会加入3D街区图和其他的个性化地理数据支持。

要创建一个地图,需要在一个页面布局中扩展MapActivity及实现MapView类。您必须设置"android:apiKey"才能在您的应用中使用MapView获取地图数据。在模拟器环境中,您可以通过申请调试API 秘钥,进行程序开发。但在发布时,您必须申请签名证书的API秘钥,并替换MapView中的调试API秘钥。

AutoNavi MAP API 的详细内容可参考 /。

AutoNavi Android MAP API 与 Google Android Map API 比较

首先, AutoNavi Android MAP API 与Google Android Map API是基本兼容的,只需替换Java包名和Map API Key,即可将Google Android Map API替换为AutoNavi Android MAP API。

在此基础之上,AutoNavi Android MAP API同时还提供了一些个性化的功能和服务, 见下文介绍:

1. 坐标偏转:根据中国相关法律规律,GPS坐标首先需要经过偏转,否则此位置点将不能与电子地图匹配。AntoNavi Android MAP API支持了坐标偏转功能,并且在类MyLocation中内置了此功能,因此位置点显示相比较为准确。

2. 本地缓存:位置相关应用的特点是用户的地图访问有一定的局部性。因此,AutoNavi Android MAP

API增加了本地缓存功能,此功能有助于提高速度,且减少最终用户资费。

3. Cell ID定位(手机基站定位): 根据手机的当前连接基站,确定位置。此功能使用Android Location

Manager机制,可以与现有的定位机制无缝集成。当GPS无信号时,可实现使用Cell ID定位。

4. Geocodeing & Reverse Geocoding(地理编码与逆地理编码):在国外,位置信息地址描述相对比较精确,例如:XX市XX街道XX号。但在中国,由于一些生活习惯的特点和差异,用户一般不会准确描述位置信息地址,而是选择通过以下描述来定位位置:XX路口。具体场景如: “我在XX

路口等你“ 或 ”我们在XX大厦旁边见面“。根据此特点,我们进行了本地化设计,因此高德地理编码与逆地理编码API满足了此类需求。

5. Poi搜索: 通过高德Poi搜索API,简单的几条语句,即可进行POI搜索,并且将结果标注在地图上。这大大简化了程序开发人员的工作。另一方面,高德的地理搜索引擎支持语义级别的POI搜索。具体场景: 假设有一个应用想在当前地图上标注所有饭馆,如果使用通用的搜索,如何设置搜索关键字呢?“饭馆”,“饭馆+餐厅”,“吃饭”?似乎没有非常合理的方案。而高德的地理搜索引擎除传统的全文搜索外,同时提供类别搜索。开发人员可自行组合高德POI类别,实现在AutoNavi MAP API

的基础上创造出自有应用程序更强大的应用。

在AutoNavi中未支持的Google Map API

类名

MapView

方法

void computeScroll()

boolean isSatellite()

boolean isStreetView()

boolean isTraffic()

getZoomControls()

void preLoad()

void setSatellite(boolean on)

void setStreetView(boolean on)

void setTraffic(boolean on)

注释

不支持

不支持卫星图

不支持街景图

不支持交通图

Deprecated; Google已声明不支持使用该方法

调用无效

不支持卫星图

不支持街景图

不支持交通图

不支持

Google内部统计函数,不支持

Params debug(

output)

MapActivity

protected boolean isLocationDisplayed()

protected abstract boolean

isRouteDisplayed()

ble boolean onSnapToItem(int x, int y,

snapPoint, MapView 不支持

mapView)

ItemizedOverlay boolean onSnapToItem(int x, int y,

snapPoint, MapView 不支持

mapView)

MyLocationOverlay boolean onSnapToItem(int x, int y,

snapPoint, MapView 不支持

mapView)

TrackballGestureDetector

手势探测,此类中全部函数不支持

如何使用 AutoNavi MAP API

在这一节里我们会通过例子来展示如何创建一个使用AutoNavi API的应用并加以详细说明。AutoNavi MAP

API 允许用户在自己的应用中加入地图功能,给地图添加各种标注、折线等,同时可以进行地图相关操作、显示信息提示窗口等功能。通过本教程使用户可以创建一个MapActivity的子类,将MapView显示于其上,并可以用MapController来控制显示的坐标、视野高度。处理起来非常简单。

注意事项

下面介绍在程序开发中要注意的一些问题:

首先是必须要申请一个Map Api Key, 具体方法可参考这里/android/faq

其次,是一定要在中设置相应的权限,比如:

view sourceprint?

1.

android:name="ET"

/>

2.

android:name="_NETWORK_STATE"

/>

3.

android:name="_EXTERNAL_STORAGE"

/>

如何创建MapView

MapActivity是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity。并且在其派生类的onCreate()中,都要创建一个MapView实例。 可以通过MapView constructor (then add it to a layout

View with w(View)) 或者通过layout XML来创建。

view sourceprint?

;

nt;

ivity;

troller;

w;

06.

class

MapViewDemo extends

MapActivity {

08. MapView mMapView;

09. MapController mMapController;

10. GeoPoint point;

11. @Override

12. /**

13. *显示地图,启用内置缩放控件,并用MapController控制地图的中心点及Zoom级别

14. */

15. protectedvoidonCreate(Bundle savedInstanceState) {

16. // TODO Auto-generated method stub

17. te(savedInstanceState);

18. setContentView(wdemo);

19. mMapView = (MapView) findViewById(View);

20. ltInZoomControls(true); //设置启用内置的缩放控件

21. mMapController = troller(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放

22. point = newGeoPoint((int) (39.90923

* 1E6),

23. (int) (116.397428

* 1E6)); //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)

24. ter(point); //设置地图中心点

25. m(12); //设置地图zoom级别

26. }

27.}

view sourceprint?

01.

02.

03.

04. xmlns:autonavi="/apk/res/jar"

05. android:orientation="vertical"android:layout_width="fill_parent"

06. android:layout_height="fill_parent">

07.

08. android:layout_width="fill_parent"android:layout_height="fill_parent"

09. android:clickable="true"

10. android:apiKey="????????"

11. autonavi:userAgent="androidh"/>

12.

13.

图1:MapView 显示地图

如何创建ItemizedOverlay

ItemizedOverlay是Overlay的一个基类,它包含了一个OverlayItems列表。 使用此类可以在地图上添加多个标记点,并且维护一个焦点选中的item,同时也负责把一个屏幕点击匹配到item上去,分发焦点改变事件给备选的监听器。

view sourceprint?

le marker = getResources().getDrawable(_1); //得到需要标在地图上的资源

nds(0, 0, rinsicWidth(),

3. rinsicHeight()); //为maker定义位置和边界

rlays().add(newOverItemT(marker, this)); //添加ItemizedOverlay实例到mMapView

view sourceprint?

(newOverlayItem(p1, "P1", "point1"));

(newOverlayItem(p2, "P2", "point2"));

(newOverlayItem(p3, "P3",

"point3"));

te(); //createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法

view sourceprint?

tion projection = jection();

(int

index = size() - 1; index >= 0; index--) { // 遍历GeoList

3. OverlayItem overLayItem = getItem(index); // 得到给定索引的item

4. String title = le();

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

6. Point point =

ls(nt(), null);

view sourceprint?

1.

2. android:id="@+id/itemizedoverlayview"

3. android:layout_width="fill_parent"

4. android:layout_height="fill_parent"

5. android:clickable="true"

6. android:apiKey="????"

// ???处加入自己申请的Key

7. autonavi:userAgent="android"

8./>

图2:显示标记点

如何创建PoiSearch

view sourceprint?

{

rch poiSearch = new

PoiSearch(,

03. new

("苏州街", null)); // 设置搜索字符串

edResult result = POI(); // 调用搜索POI方法

05. if

(e(1).isEmpty()) {

06. xt(getApplicationContext(), "没有找到!",

07. _SHORT).show();

08. } else

{

09. PoiOverlay poiOverlay = newPoiOverlay(null,

10.

e(1)); // 将结果的第一页添加到PoiOverlay

11. rlays().add(poiOverlay); // 将poiOverlay标注在地图上

12. }

13.} catch

(IOException e) {

14. xt(getApplicationContext(), "网络连接错误!",

15. _SHORT).show();

16.}

view sourceprint?

1.

2. android:layout_width="fill_parent"android:layout_height="fill_parent"

3. android:clickable="true"

4. android:apiKey="????"

// ???处加入自己申请的Key

5./>

图3:地址搜索结果

如何创建Geocoder

view sourceprint?

er mGeocoder01 = new

Geocoder();

x = itudeE6(); // 得到geo纬度,单位微度 (度 * 1E6)

x1 = ((double) x) / 1000000;

y = gitudeE6(); // 得到geo经度,单位微度 (度 * 1E6)

y1 = ((double) y) / 1000000;

{

07. // 将 GPS数据偏转得到你逆理编码,参数分别为:纬度,经度,最大结果集

08. List

lstAddress =

mRawGpsLocation(x1, y1, 3);

09. if

(!y()) {

10. // Toast输出geo编码得到的地名

11. for

(int

i = 0; i <(); ++i) {

12. Address adsLocation = (i);

13. xt(getApplicationContext(),

14. tureName().toString(),

15. _LONG).show();

16. Log.i(TAG, "Address found = "

+

ng());

17. }

18. } else

{

19. Log.i(TAG, "Address GeoPoint NOT Found.");

20. }

21.}

(Exception e) {

23. xt(getApplicationContext(), "连接错误!",

_SHORT).show();

24.}

view sourceprint?

1.

2. android:layout_width="fill_parent"android:layout_height="fill_parent"

3. android:clickable="true"

4. android:apiKey="????"

// ???处加入自己申请的Key

5./>

图4:经纬度

如何创建MyLocation

绘制用户当前在地图上的位置(精准度),和/或一个嵌入的指南针。子类能覆盖方法dispatchTap()去处理对当前位置的点击为了开启这个overlay的功能,需要去调用enableMyLocation()和/或enableCompass(),

或调用Activity中的me()方法

关键代码

view sourceprint?

est = new

MyLocationOverlay(getApplicationContext(), map);

MyLocation();

Compass(); // 打开指南针

04.// 得到当前位置,如果是模拟器,需要输入模拟数据

ntlocpoint = ocation(); // 得到当前位置

06. rlays().add(mylocTest);

07. eTo(locpoint); // 以点locpoint为中心,显示地图

08. xt(

09. getApplicationContext(),

10. "("

+ gitudeE6() / 1000000.0

11. + ","

+ itudeE6()

12. / 1000000.0

+ ")", _SHORT)

13. .show(); // 在地图上显示locpoint坐标(经度,纬度)

view sourceprint?

1.

2. android:layout_width="fill_parent"android:layout_height="fill_parent"

3. android:clickable="true"

4. android:apiKey="????"

// ???处加入自己申请的Key

5. autonavi:userAgent="android"

6./>

图5:当前位置

如何实现坐标偏转

view sourceprint?

nt point = newGeoPoint( lat , lon, this, apiKay); //以输入参数实例化偏转坐标类

value = "纬度:"

+ (itudeE6() / 1E6) + "n经度:"

3. + (gitudeE6() /

1E6); //得到偏转后的经纬度

图6:坐标偏转

FAQ

请参见 AutoNavi FAQ ( /android/faq )

技术支持

QQ群:122795260

邮箱:mapservice@

本文标签: 地图位置支持