Android个人移动地图开题报告

毕业设计(论文)开题报告及文献综述

 

第二篇:百度地图移动版API for android开发指南

百度地图移动版API for android

开发指南

2011.4.27

CopyRight @ Baidu.com

1

目录

1 简介 ............................................................................................................... 3

2 在您的地图中显示......................................................................................... 3

3 地图图层 ....................................................................................................... 7

3.1 底图 ..................................................................................................... 7

3.2 实时交通信息 ...................................................................................... 7

3.3 卫星图 ................................................................................................. 8

3.4 实景图 ................................................................................................. 8

4 覆盖物 ........................................................................................................... 8

4.1 覆盖物的抽象类 :Overlay ................................................................. 9

4.2 当前位置:MyLocationOverlay ............................................................ 9

4.3 分条目覆盖物:ItemizedOverlay ........................................................ 10

4.4 本地搜索覆盖物:PoiOverlay ............................................................. 11

4.5 驾车路线覆盖物:RouteOverlay ......................................................... 11

4.6 换乘路线覆盖物:TransitOverlay ........................................................ 11

5 服务类 .......................................................................................................... 11

5.1 搜索服务 ............................................................................................. 11

5.2 POI搜索及PoiOverlay ........................................................................ 12

5.3 驾车路线搜索及RouteOverlay ............................................................ 13

5.4 步行路线搜索及RouteOverlay ............................................................ 15

5.5 公交换乘路线搜索及TransitOverlay ......................................................... 15

5.6 地址信息查询 ..................................................................................... 16

6 事件 .............................................................................................................. 16

6.1 定位监听 ............................................................................................. 16

6.2 一般事件监听 ..................................................................................... 17

2

1 简介

什么是百度地图API?

百度地图移动版API(Android)是一套基于Android 1.5及以上设备的应用程序接口,通过该接口,您可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。百度地图移动版API不仅包含构建地图的基本接口,还提供了诸如地图定位、本地搜索、路线规划等数据服务,你可以根据自己的需要进行选择。

面向的读者

API是提供给那些具有一定Android编程经验和了解面向对象概念的读者使用。此外,读者还应该对地图产品有一定的了解。

您在使用中遇到任何问题,都可以通过API贴吧或交流群反馈给我们。

获取API Key

用户在使用API之前需要获取百度地图移动版API Key,该Key与你的百度账户相关联,您必须先有百度帐户,才能获得API KEY。并且,该KEY与您引用API的程序名称有关,具体流程请参照获取密钥。

兼容性

支持Android 1.5及以上系统。

2 在您的地图中显示

如何把API添加到我的Android工程中?

首先将API包括的两个文件baidumapapi.jar和libBMapApiEngine.so拷贝到工程根目录及libs\armeabi目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定baidumapapi.jar,确定后返回,这样您就可以在您的程序中使用API了。

百度地图的“Hello,World”

在Manifest中添加使用权限

1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

2. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

3. <uses-permission android:name="android.permission.INTERNET"></uses-permission> 4. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

5. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

3

百度地图移动版APIforandroid开发指南

6. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permis

sion>

7. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permiss

ion>

在Manifest中添加Android版本支持

1. <supports-screens android:largeScreens="true" android:normalScreens="true" androi

d:smallScreens="true" android:resizeable="true" android:anyDensity="true"/> 2. <uses-sdk android:minSdkVersion="3"></uses-sdk>

让创建的地图Activity继承com.baidu.mapapi.MapActivity, 并import相关类

1. import java.util.ArrayList;

2. import java.util.List;

3. import android.content.Context;

4. import android.graphics.Canvas;

5. import android.graphics.Paint;

6. import android.graphics.Point;

7. import android.graphics.drawable.Drawable;

8. import android.location.Location;

9. import android.os.Bundle;

10. import android.util.Log;

11. import android.view.View;

12. import android.widget.Toast;

13. import com.baidu.mapapi.BMapManager;

14. import com.baidu.mapapi.GeoPoint;

15. import com.baidu.mapapi.ItemizedOverlay;

16. import com.baidu.mapapi.LocationListener;

17. import com.baidu.mapapi.MKAddrInfo;

18. import com.baidu.mapapi.MKDrivingRouteResult;

19. import com.baidu.mapapi.MKGeneralListener;

20. import com.baidu.mapapi.MKLocationManager;

21. import com.baidu.mapapi.MKPlanNode;

22. import com.baidu.mapapi.MKPoiResult;

23. import com.baidu.mapapi.MKSearch;

24. import com.baidu.mapapi.MKSearchListener;

25. import com.baidu.mapapi.MKTransitRouteResult;

26. import com.baidu.mapapi.MKWalkingRouteResult;

27. import com.baidu.mapapi.MapActivity;

28. import com.baidu.mapapi.MapController;

4

29. import com.baidu.mapapi.MapView;

30. import com.baidu.mapapi.MyLocationOverlay;

31. import com.baidu.mapapi.Overlay;

32. import com.baidu.mapapi.OverlayItem;

33. import com.baidu.mapapi.PoiOverlay;

34. import com.baidu.mapapi.RouteOverlay;

35. import com.baidu.mapapi.TransitOverlay;

36.

37. public class MyMapActivity extends MapActivity {

38.

39.

40.

41.

42.

43.

44.

45.

46.

47.

48. } @Override protected boolean isRouteDisplayed() { } return false; @Override public void onCreate(Bundle savedInstanceState) { } super.onCreate(savedInstanceState); setContentView(R.layout.main);

在布局xml中添加地图控件

1. <?xml version="1.0" encoding="utf-8"?>

2. <LinearLayout xmlns:android="/apk/res/android"android:or

ientation="vertical" android:layout_width="fill_parent" android:layout_height="f

ill_parent">

3. <TextView android:layout_width="fill_parent" android:layout_height="wrap_content

" android:text="@string/hello" />

4. <com.baidu.mapapi.MapView android:id="@+id/bmapsView" android:layout_width="fill

_parent" android:layout_height="fill_parent" android:clickable="true" />

5. </LinearLayout>

初始化地图Activity

在地图Activity中定义变量: BMapManager mBMapMan = null; 在onCreate方法中增加以下代码,并将您申请的Key替换“我的Key”:

1. mBMapMan = new BMapManager(getApplication());

2. mBMapMan.init("我的Key", null);

3. super.initMapActivity(mBMapMan);

5

4. MapView mMapView = (MapView) findViewById(R.id.bmapsView); 5. mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 6. MapController mMapController = mMapView.getController(); // 得到mMapView的控制权,可

以用它控制和驱动平移和缩放

7. GeoPoint point = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)); //用

给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) 8. mMapController.setCenter(point); //设置地图中心点 9. mMapController.setZoom(12); //设置地图zoom级别 Override以下方法,管理API:

1. @Override

2. protected void onDestroy() { 3. if (mBMapMan != null) { 4. mBMapMan.destroy(); 5. mBMapMan = null;

6. }

7. super.onDestroy();

8. }

9. @Override

10. protected void onPause() { 11. if (mBMapMan != null) { 12. mBMapMan.stop();

13. }

14. super.onPause();

15. }

16. @Override

17. protected void onResume() { 18. if (mBMapMan != null) { 19. mBMapMan.start(); 20. }

21. super.onResume();

22. }

完成上述步骤后,运行程序,结果如下:

6

3 地图图层

地图图层概念

地图可以包含一个或多个图层,每个图层在每个级别都是由若干张图块组成的,它们覆盖了地球的整个表面。例如您所看到包括街道、兴趣点、学校、公园等内容的地图展现就是一个图层,另外交通流量的展现也是通过图层来实现的。

3.1 底图

基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容。

3.2 实时交通信息

在以下11个城市中,支持实时交通信息:北京,上海,广州,深圳,南京,南昌,成都,重庆,武

汉,大连,常州。在地图中显示实时交通信息示例如下: mMapView.setTraffic(true);

百度地图移动版APIforandroid开发指南

7

运行程序,结果如下:

3.3 卫星图

在此版本API中暂不支持。 mMapView.setSatellite(true);

3.4 实景图

在此版本API中暂不支持。

mMapView.setStreetView(true);

百度地图移动版APIforandroid开发指南

4 覆盖物

地图覆盖物概述

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

地图API提供了如下几种覆盖物:

?

?

? Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。 MyLocationOverlay:一个负责显示用户当前位置的Overlay。 ItemizedOverlay<Item extends OverlayItem>:Overlay的一个基类,包含了一个OverlayItem

列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。

? PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“公园”,

通过此图层将公园显示在地图上。

?

RouteOverlay:步行、驾车导航线路图层,将步行、驾车出行方案的路线及关键点显示在地图上。 8

? TransitOverlay:公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示

在地图上。

4.1 覆盖物的抽象类 :Overlay

一般来说,在MapView中添加一个Overlay需要经过以下步骤:

? 自定义类继承Overlay,并Override其draw()方法,如果需要点击、按键、触摸等交互操

作,还需Override onTap()等方法。

1. public class MyOverlay extends Overlay {

2. GeoPoint geoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)); 3. Paint paint = new Paint();

4. @Override

5. public void draw(Canvas canvas, MapView mapView, boolean shadow) { 6. //在天安门的位置绘制一个String

7. Point point = mMapView.getProjection().toPixels(geoPoint, null); 8. canvas.drawText("★这里是天安门", point.x, point.y, paint);

9. }

10. }

添加到MapView的覆盖物中:

mMapView.getOverlays().add(new MyOverlay());

运行结果如下:

4.2 当前位置:MyLocationOverlay

将MyLocationOverlay添加到覆盖物中,能够实现在地图上显示当前位置的图标以及指南针:

? 初始化Location模块

1. // 初始化Location模块

2. mLocationManager = mBMapMan.getLocationManager();

3. // 通过enableProvider和disableProvider方法,选择定位的Provider

4. // mLocationManager.enableProvider(MKLocationManager.MK_NETWORK_PROVIDER); 5. // mLocationManager.disableProvider(MKLocationManager.MK_GPS_PROVIDER); 6. // 添加定位图层

7. MyLocationOverlay mylocTest = new MyLocationOverlay(this, mMapView); 9

8. mylocTest.enableMyLocation(); // 启用定位

百度地图移动版APIforandroid开发指南

9. mylocTest.enableCompass(); // 启用指南针

10. mMapView.getOverlays().add(mylocTest);

运行结果如下:

4.3 分条目覆盖物:ItemizedOverlay

某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类:

? 自定义类继承ItemizedOverlay<OverlayItem>,并Override其draw()方法,如果需要点击、

按键、触摸等交互操作,还需Override onTap()等方法。

1. class OverItemT extends ItemizedOverlay<OverlayItem> {

2. private List<OverlayItem> GeoList = new ArrayList<OverlayItem>(); 3. private Context mContext;

4. private double mLat1 = 39.90923;//39.9022; // point1纬度

5. private double mLon1 = 116.397428;//116.3822; // point1经度

6. private double mLat2 = 39.9022;

7. private double mLon2 = 116.3922;

8. private double mLat3 = 39.917723;

9. private double mLon3 = 116.3722;

10. public OverItemT(Drawable marker, Context context) {

11. super(boundCenterBottom(marker));

12. this.mContext = context;

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

14. GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6)); 15. GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6)); 16. GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6)); 17. GeoList.add(new OverlayItem(p1, "P1", "point1"));

18. GeoList.add(new OverlayItem(p2, "P2", "point2"));

19. GeoList.add(new OverlayItem(p3, "P3", "point3"));

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

用 这个方法

21. }

22. @Override

23. protected OverlayItem createItem(int i) {

10

24. return GeoList.get(i);

25. }

26. @Override

27. public int size() {

28. return GeoList.size();

29. }

30. @Override

31. // 处理当点击事件

32. protected boolean onTap(int i) {

33. Toast.makeText(this.mContext, GeoList.get(i).getSnippet(),

34. Toast.LENGTH_SHORT).show();

35. return true;

36. }

37. }

添加到MapView的覆盖物中:

38. Drawable marker = getResources().getDrawable(R.drawable.iconmark); //得

到需要标在地图上的资源

39. mMapView.getOverlays().add(new OverItemT(marker, this)); //添加ItemizedOverlay

实例到mMapView

4.4 本地搜索覆盖物:PoiOverlay

详见POI搜索及PoiOverlay章节。

4.5 驾车路线覆盖物:RouteOverlay

详见驾车路线搜索及RouteOverlay和步行路线搜索及RouteOverlay章节。

4.6 换乘路线覆盖物:TransitOverlay

详见公交换乘路线搜索及TransitOverlay章节。

5 服务类

5.1 搜索服务

百度地图移动版API集成搜索服务包括:位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索,通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener,实现异步搜

11

索服务。首先自定义MySearchListener实现MKSearchListener接口,通过不同的回调方法,获得搜索结果: 1. public class MySearchListener implements MKSearchListener {

2. @Override

3. public void onGetAddrResult(MKAddrInfo result, int iError) {

4. }

5. @Override

6. public onGetDrivingRouteResult(MKDrivingRouteResult result, iError) void int

{

7. }

8. @Override

9. public void onGetPoiResult(MKPoiResult result, int type, int iError) { 10. }

11. @Override

12. public onGetTransitRouteResult(MKTransitRouteResult result, iError) void int

{

13. }

14. @Override

15. public onGetWalkingRouteResult(MKWalkingRouteResult result, iError) void int

{

16. }

17. }

然后初始化MKSearch类:

1. mMKSearch = new MKSearch();

2. mMKSearch.init(mBMapMan, new MySearchListener());

5.2 POI搜索及PoiOverlay

POI搜索有三种方式,根据范围和检索词发起范围检索poiSearchInbounds,城市poi检索

poiSearchInCity,周边检索poiSearchNearBy,以下以周边检索为例介绍如何进行检索并显示覆盖物PoiOverlay:

? 检索天安门周边5000米之内的KFC餐厅:

mMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)), 5000);

12

? 实现MySearchListener的onGetPoiResult,并展示检索结果: ?

?

?

?

?

?

?

?

? @Override

百度地图移动版APIforandroid开发指南

public void onGetPoiResult(MKPoiResult result, int type, int iError) { if (result == null) { return; } PoiOverlay poioverlay = new PoiOverlay(MyMapActivity.this, mMapView); poioverlay.setData(result.getAllPoi()); mMapView.getOverlays().add(poioverlay); }

运行结果如下:

5.3 驾车路线搜索及RouteOverlay

? 检索从天安门到百度大厦的驾车路线:

13

1. MKPlanNode start = new MKPlanNode();

2. start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)); 3. MKPlanNode end = new MKPlanNode();

4. end.pt = new GeoPoint(40057031, 116307852);

5. // 设置驾车路线搜索策略,时间优先、费用最少或距离最短

6. mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);

7. mMKSearch.drivingSearch(null, start, null, end);

实现MySearchListener的onGetDrivingRouteResult,并展示检索结果:

@Override

1. public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) { 2. if (result == null) {

3. return;

4. }

5. RouteOverlay routeOverlay = new RouteOverlay(MyMapActivity.this, mMapView); 6. // 此处仅展示一个方案作为示例

7. routeOverlay.setData(result.getPlan(0).getRoute(0));

8. mMapView.getOverlays().add(routeOverlay);

9. }

运行结果如下

14

5.4 步行路线搜索及RouteOverlay

方式与驾车路线搜索类似,只需将mMKSearch.drivingSearch(null, start, null, end)修改为mMKSearch.walkingSearch(null, start, null, end),实现的方法改为onGetWalkingRouteResult即可,不再赘述。

5.5 公交换乘路线搜索及TransitOverlay ? 检索从天安门到百度大厦的公交换乘路线: 1. MKPlanNode start = new MKPlanNode();

百度地图移动版APIforandroid开发指南

2. start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)); 3. MKPlanNode end = new MKPlanNode();

4. end.pt = new GeoPoint(40057031, 116307852);

5. // 设置乘车路线搜索策略,时间优先、最少换乘、最少步行距离或不含地铁

6. mMKSearch.setTransitPolicy(MKSearch.EBUS_TRANSFER_FIRST);

7. mMKSearch.transitSearch("北京", start, end); // 必须设置城市名

15

实现 MySearchListener 的 onGetTransitRouteResult(MKTransitRouteResult, int),并展示检索 结果:0. 1. 2. 3. 4. 5.@Override public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { if (result == null) { return; } TransitOverlay transitOverlay = new TransitOverlay(MyMapActivity.this, mMapView); // 此处仅展示一个方案作为示例 transitOverlay.setData(result.getPlan(0)); mMapView.getOverlays().add(transitOverlay); }6. 7. 8. 9.5.6地址信息查询根据地理坐标查询地址信息:1. mMKSearch.reverseGeocode(new GeoPoint(40057031, 116307852));实现 MySearchListener 的 onGetAddrResult,得到查询结果。6事件6.1 定位监听实现方式与系统的定位监听类似,通过 MKLocationManager 注册或者移除定位监听器:1. mLocationManager = mBMapMan.getLocationManager(); 2. LocationListener listener = new LocationListener() { 3. 4. 5. 6. 7. }; 8. // 注册监听 16 } @Override public void onLocationChanged(Location location) { // TODO 在此处处理位置变化

9. mLocationManager.requestLocationUpdates(listener);

10. // 不需要时移除监听

11. mLocationManager.removeUpdates(listener);

6.2 一般事件监听

在初始化地图Activity时,注册一般事件监听,并实现MKGeneralListener的接口处理相应事件,将mBMapMan.init("我的Key", null)替换为下面的代码:

1. mBMapMan.init("我的key", new MKGeneralListener() {

2. @Override

3. public void onGetPermissionState(int iError) {

4. // TODO 返回授权验证错误,通过错误代码判断原因,MKEvent中常量值。 5. }

6. @Override

7. public void onGetNetworkState(int iError) {

8. // TODO 返回网络错误,通过错误代码判断原因,MKEvent中常量值。

9. }

10. });

17

相关推荐