百度地图的API的使用

permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permissionandroid:name="android.permission.INTERNET"></uses-permission> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"></uses-permission>
在Manifest中添加Android版本支持

  1. <supports-screensandroid:largeScreens="true"
  2. android:normalScreens="true"android:smallScreens="true"
  3. android:resizeable="true"android:anyDensity="true"/>
  4. <uses-sdkandroid:minSdkVersion="3"></uses-sdk>
让创建的地图Activity继承com.baidu.mapapi.MapActivity, 并import相关类

  1. importjava.util.ArrayList;
  2. importjava.util.List;
  3. importandroid.content.Context;
  4. importandroid.graphics.Canvas;
  5. importandroid.graphics.Paint;
  6. importandroid.graphics.Point;
  7. importandroid.graphics.drawable.Drawable;
  8. importandroid.location.Location;
  9. importandroid.os.Bundle;
  10. importandroid.util.Log;
  11. importandroid.view.View;
  12. importandroid.widget.Toast;
  13. importcom.baidu.mapapi.BMapManager;
  14. importcom.baidu.mapapi.GeoPoint;
  15. importcom.baidu.mapapi.ItemizedOverlay;
  16. importcom.baidu.mapapi.LocationListener;
  17. importcom.baidu.mapapi.MKAddrInfo;
  18. importcom.baidu.mapapi.MKDrivingRouteResult;
  19. importcom.baidu.mapapi.MKGeneralListener;
  20. importcom.baidu.mapapi.MKLocationManager;
  21. importcom.baidu.mapapi.MKPlanNode;
  22. importcom.baidu.mapapi.MKPoiResult;
  23. importcom.baidu.mapapi.MKSearch;
  24. importcom.baidu.mapapi.MKSearchListener;
  25. importcom.baidu.mapapi.MKTransitRouteResult;
  26. importcom.baidu.mapapi.MKWalkingRouteResult;
  27. importcom.baidu.mapapi.MapActivity;
  28. importcom.baidu.mapapi.MapController;
  29. importcom.baidu.mapapi.MapView;
  30. importcom.baidu.mapapi.MyLocationOverlay;
  31. importcom.baidu.mapapi.Overlay;
  32. importcom.baidu.mapapi.OverlayItem;
  33. importcom.baidu.mapapi.PoiOverlay;
  34. importcom.baidu.mapapi.RouteOverlay;
  35. importcom.baidu.mapapi.TransitOverlay;
  36. publicclassMyMapActivityextendsMapActivity{
  37. @Override
  38. publicvoidonCreate(Bundle savedInstanceState){
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.main);
  41. }
  42. @Override
  43. protectedbooleanisRouteDisplayed(){
  44. returnfalse;
  45. }
  46. }
在布局xml中添加地图控件

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <TextViewandroid:layout_width="fill_parent"
  6. android:layout_height="wrap_content"android:text="@string/hello"/>
  7. <com.baidu.mapapi.MapViewandroid:id="@+id/bmapsView"
  8. android:layout_width="fill_parent"android:layout_height="fill_parent"
  9. android:clickable="true"/>
  10. </LinearLayout>
初始化地图Activity

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

  1. mBMapMan=newBMapManager(getApplication());
  2. mBMapMan.init("我的Key",null);
  3. super.initMapActivity(mBMapMan);
  4. MapView mMapView=(MapView)findViewById(R.id.bmapsView);
  5. mMapView.setBuiltInZoomControls(true);//设置启用内置的缩放控件
  6. MapController mMapController=mMapView.getController();// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
  7. GeoPoint point=newGeoPoint((int)(39.915*1E6),
  8. (int)(116.404*1E6));//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
  9. mMapController.setCenter(point);//设置地图中心点
  10. mMapController.setZoom(12);//设置地图zoom级别
Override以下方法,管理API: <style> <!-- --> </style>

  1. @Override
  2. protectedvoidonDestroy(){
  3. if(mBMapMan!=null){
  4. mBMapMan.destroy();
  5. mBMapMan=null;
  6. }
  7. super.onDestroy();
  8. }
  9. @Override
  10. protectedvoidonPause(){
  11. if(mBMapMan!=null){
  12. mBMapMan.stop();
  13. }
  14. super.onPause();
  15. }
  16. @Override
  17. protectedvoidonResume(){
  18. if(mBMapMan!=null){
  19. mBMapMan.start();
  20. }
  21. super.onResume();
  22. }
完成上述步骤后,运行程序,结果如下:

地图图层

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

底图

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

实时交通信息

在以下11个城市中,支持实时交通信息:北京,上海,广州,深圳,南京,南昌,成都,重庆,武汉,大连,常州。在地图中显示实时交通信息示例如下: <style> <!-- --> </style>

  1. mMapView.setTraffic(true);
运行程序,结果如下:

卫星图

在此版本API中暂不支持。 <style> <!-- --> </style>

  1. mMapView.setSatellite(true);

实景图

在此版本API中暂不支持。 <style> <!-- --> </style>

  1. mMapView.setStreetView(true);

覆盖物

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

  • Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。
  • MyLocationOverlay:一个负责显示用户当前位置的Overlay。
  • ItemizedOverlay<Item extends OverlayItem>:Overlay的一个基类,包含了一个OverlayItem列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。

  • PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“公园”,通过此图层将公园显示在地图上。

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

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

覆盖物的抽象基类:Overlay

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

  • 自定义类继承Overlay,并Override其draw()方法,如果需要点击、按键、触摸等交互操作,还需Override onTap()等方法。 <style> <!-- --> </style>

    1. publicclassMyOverlayextendsOverlay{
    2. GeoPoint geoPoint=newGeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
    3. paint=new();
    4. @Override
    5. publicvoiddraw(canvas, MapView mapView,booleanshadow){
    6. //在的位置绘制一个String
    7. point=mMapView.getProjection().toPixels(geoPoint,null);
    8. canvas.drawText("★这里是", point.x, point.y, paint);
    9. }
    10. }

    添加到MapView的覆盖物中: <style> <!-- --> </style>

    1. mMapView.getOverlays().add(newMyOverlay());
    运行结果如下:

当前位置:MyLocationOverlay

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

  • 初始化Location模块 <style> <!-- --> </style>

    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=newMyLocationOverlay(this, mMapView);
    8. mylocTest.enableMyLocation();// 启用定位
    9. mylocTest.enableCompass();// 启用指南针
    10. mMapView.getOverlays().add(mylocTest);

    运行结果如下:

分条目覆盖物:ItemizedOverlay

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

  • 自定义类继承ItemizedOverlay<OverlayItem>,并Override其draw()方法,如果需要点击、按键、触摸等交互操作,还需Override onTap()等方法。 <style> <!-- --> </style>

    1. classOverItemTextendsItemizedOverlay<OverlayItem>{
    2. privateList<OverlayItem>GeoList=newArrayList<OverlayItem>();
    3. privatemContext;
    4. privatedoublemLat1=39.90923;//39.9022; // point1纬度
    5. privatedoublemLon1=116.397428;//116.3822; // point1经度
    6. privatedoublemLat2=39.9022;
    7. privatedoublemLon2=116.3922;
    8. privatedoublemLat3=39.917723;
    9. privatedoublemLon3=116.3722;
    10. publicOverItemT(Drawable marker,context){
    11. super(boundCenterBottom(marker));
    12. this.mContext=context;
    13. // 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
    14. GeoPoint p1=newGeoPoint((int)(mLat1*1E6),(int)(mLon1*1E6));
    15. GeoPoint p2=newGeoPoint((int)(mLat2*1E6),(int)(mLon2*1E6));
    16. GeoPoint p3=newGeoPoint((int)(mLat3*1E6),(int)(mLon3*1E6));
    17. GeoList.add(newOverlayItem(p1,"P1","point1"));
    18. GeoList.add(newOverlayItem(p2,"P2","point2"));
    19. GeoList.add(newOverlayItem(p3,"P3","point3"));
    20. populate();//createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法
    21. }
    22. @Override
    23. protectedOverlayItem createItem(inti){
    24. returnGeoList.get(i);
    25. }
    26. @Override
    27. publicintsize(){
    28. returnGeoList.size();
    29. }
    30. @Override
    31. // 处理当点击事件
    32. protectedbooleanonTap(inti){
    33. Toast.makeText(this.mContext, GeoList.get(i).getSnippet(),
    34. Toast.LENGTH_SHORT).show();
    35. returntrue;
    36. }
    37. }

    添加到MapView的覆盖物中: <style> <!-- --> </style>

    1. Drawable marker=getResources().getDrawable(R.drawable.iconmark);//得到需要标在地图上的资源
    2. mMapView.getOverlays().add(newOverItemT(marker,this));//添加ItemizedOverlay实例到mMapView
    点击其中一个图标,运行结果如下:

本地搜索覆盖物:PoiOverlay

详见详见在。

驾车路线覆盖物:RouteOverlay

详见详见在和。

换乘路线覆盖物:TransitOverlay

详见详见在。

服务类

搜索服务

百度地图移动版API集成搜索服务包括:位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索,通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener,实现异步搜索服务。首先自定义MySearchListener实现MKSearchListener接口,通过不同的回调方法,获得搜索结果: <style> <!-- --> </style>

  1. publicclassMySearchListenerimplementsMKSearchListener{
  2. @Override
  3. publicvoidonGetAddrResult(MKAddrInfo result,intiError){
  4. }
  5. @Override
  6. publicvoidonGetDrivingRouteResult(MKDrivingRouteResult result,intiError){
  7. }
  8. @Override
  9. publicvoidonGetPoiResult(MKPoiResult result,inttype,intiError){
  10. }
  11. @Override
  12. publicvoidonGetTransitRouteResult(MKTransitRouteResult result,intiError){
  13. }
  14. @Override
  15. publicvoidonGetWalkingRouteResult(MKWalkingRouteResult result,intiError){
  16. }
  17. }
然后初始化MKSearch类: <style> <!-- --> </style>

  1. mMKSearch=newMKSearch();
  2. mMKSearch.init(mBMapMan,newMySearchListener());

POI搜索及PoiOverlay

POI搜索有三种方式,根据范围和检索词发起范围检索poiSearchInbounds,城市poi检索poiSearchInCity,周边检索poiSearchNearBy,以下以周边检索为例介绍如何进行检索并显示覆盖物PoiOverlay:

  • 检索周边5000米之内的KFC餐厅: <style> <!-- --> </style>

    1. mMKSearch.poiSearchNearBy("KFC",newGeoPoint((int)(39.915*1E6),(int)(116.404*1E6)),5000);
  • 实现MySearchListener的onGetPoiResult,并展示检索结果: <style> <!-- --> </style>

    1. @Override
    2. publicvoidonGetPoiResult(MKPoiResult result,inttype,intiError){
    3. if(result==null){
    4. return;
    5. }
    6. PoiOverlay poioverlay=newPoiOverlay(MyMapActivity.this, mMapView);
    7. poioverlay.setData(result.getAllPoi());
    8. mMapView.getOverlays().add(poioverlay);
    9. }

    运行结果如下:

驾车路线搜索及RouteOverlay

  • 检索从到百度大厦的驾车路线: <style> <!-- --> </style>

    1. MKPlanNode start=newMKPlanNode();
    2. start.pt=newGeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
    3. MKPlanNode end=newMKPlanNode();
    4. end.pt=newGeoPoint(40057031,116307852);
    5. // 设置驾车路线搜索策略,时间优先、费用最少或距离最短
    6. mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);
    7. mMKSearch.drivingSearch(null, start,null, end);
  • 实现MySearchListener的onGetDrivingRouteResult,并展示检索结果: <style> <!-- --> </style>

    1. @Override
    2. publicvoidonGetDrivingRouteResult(MKDrivingRouteResult result,intiError){
    3. if(result==null){
    4. return;
    5. }
    6. RouteOverlay routeOverlay=newRouteOverlay(MyMapActivity.this, mMapView);
    7. // 此处仅展示一个方案作为示例
    8. routeOverlay.setData(result.getPlan(0).getRoute(0));
    9. mMapView.getOverlays().add(routeOverlay);
    10. }

    运行结果如下:

步行路线搜索及RouteOverlay

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

公交换乘路线搜索及TransitOverlay

  • 检索从到百度大厦的公交换乘路线: <style> <!-- --> </style>

    1. MKPlanNode start=newMKPlanNode();
    2. start.pt=newGeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
    3. MKPlanNode end=newMKPlanNode();
    4. end.pt=newGeoPoint(40057031,116307852);
    5. // 设置乘车路线搜索策略,时间优先、最少换乘、最少步行距离或不含地铁
    6. mMKSearch.setTransitPolicy(MKSearch.EBUS_TRANSFER_FIRST);
    7. mMKSearch.transitSearch("北京", start, end);// 必须设置城市名
  • 实现MySearchListener的onGetTransitRouteResult(MKTransitRouteResult, int),并展示检索结果: <style> <!-- --> </style>

    1. @Override
    2. publicvoidonGetTransitRouteResult(MKTransitRouteResult result,intiError){
    3. if(result==null){
    4. return;
    5. }
    6. TransitOverlay transitOverlay=newTransitOverlay(MyMapActivity.this, mMapView);
    7. // 此处仅展示一个方案作为示例
    8. transitOverlay.setData(result.getPlan(0));
    9. mMapView.getOverlays().add(transitOverlay);
    10. }

地址信息查询

根据地理坐标查询地址信息: <style> <!-- --> </style>

  1. mMKSearch.reverseGeocode(newGeoPoint(40057031,116307852));
实现MySearchListener的onGetAddrResult,得到查询结果。

事件

定位监听

实现方式与系统的定位监听类似,通过MKLocationManager注册或者移除定位监听器: <style> <!-- --> </style>

  1. mLocationManager=mBMapMan.getLocationManager();
  2. LocationListener listener=newLocationListener(){
  3. @Override
  4. publicvoidonLocationChanged(Location location){
  5. // TODO 在此处处理位置变化
  6. }
  7. };
  8. // 注册监听
  9. mLocationManager.requestLocationUpdates(listener);
  10. // 不需要时移除监听
  11. mLocationManager.removeUpdates(listener);

一般事件监听

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

  1. mBMapMan.init("我的key",newMKGeneralListener(){
  2. @Override
  3. publicvoidonGetPermissionState(intiError){
  4. // TODO 返回授权验证错误,通过错误代码判断原因,MKEvent中常量值。
  5. }
  6. @Override
  7. publicvoidonGetNetworkState(intiError){
  8. // TODO 返回网络错误,通过错误代码判断原因,MKEvent中常量值。
  9. }
  10. });

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值