转载地址:http://www.cnblogs.com/rocomp/p/4994110.html

百度地图API简介

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

一、准备工作

  • 1.注册百度开发者账号,创建应用,获取API key
  • 地址:http://lbsyun.baidu.com/apiconsole/key
  • 2.创建应用需要应用的数字签名SHA1和包名
  • 在Preference中可以看到Android项目Eclipse默认的数字签名SHA1

  • 切换到模拟器安装目录下输入命令命令 "C:\Program Files\Java\jdk1.6.0_45\bin\keytool.exe" -list -v -keystoredebug.keystore默认密码是android也能获取数字签名的SHA1

  • 获取创建的API key
  • 3.添加地图引擎(类库和.so文件)到工程中
  • 4.添加权限

  1. <!-- 这个权限用于进行网络定位-->
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
  3. <!-- 这个权限用于访问GPS定位-->
  4. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
  5. <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
  7. <!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
  8. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  9. <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
  10. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
  11. <!-- 用于读取手机当前的状态-->
  12. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
  13. <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
  14. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  15. <!-- 访问网络,网络定位需要上网-->
  16. <uses-permission android:name="android.permission.INTERNET" />
  17. <!-- SD卡读取权限,用户写入离线定位数据-->
  18. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
  19. <!--允许应用读取低级别的系统日志文件 -->
  20. <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
  • 5.在清单文件Application节点下添加
  1. <meta-data
  2. android:name="com.baidu.lbsapi.API_KEY"
  3. android:value="33c6iZyFukuzDOg77Wk6wE2t"/>

二、MapView和BaiduMap介绍

  1. public class HelloWorld extends Activity{
  2. private static final String TAG ="HelloWorld";
  3. private MapView mapView;
  4. private BaiduMap baiduMap;
  5. private double latitude = 40.050966;// 纬度
  6. private double longitude = 116.303128;// 经度
  7. private LatLng hmPos = new LatLng(latitude, longitude);// 坐标
  8. private MyBaiduSdkReceiver receiver;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. intManager();
  13. setContentView(R.layout.common);
  14. init();
  15. }
  16. private void intManager() {
  17. receiver = new MyBaiduSdkReceiver();
  18. IntentFilter filter = new IntentFilter();
  19. filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
  20. filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
  21. registerReceiver(receiver, filter);
  22. }
  23. private void init() {
  24. mapView = (MapView) findViewById(R.id.mapView);
  25. //BaiduMap管理具体的某一个MapView: 旋转,移动,缩放,事件。。。
  26. baiduMap = mapView.getMap();
  27. //设置缩放级别,默认级别为12
  28. MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);;
  29. baiduMap.setMapStatus(mapstatusUpdate);
  30. //设置地图中心点,默认是天安门
  31. MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory.newLatLng(hmPos);
  32. baiduMap.setMapStatus(mapstatusUpdatePoint );
  33. //mapView.showScaleControl(false);//默认是true,显示缩放按钮
  34. //mapView.showZoomControls(false);//默认是true,显示比例尺
  35. }
  36. @Override
  37. public boolean onKeyDown(int keyCode, KeyEvent event) {
  38. //旋转,移动,缩放
  39. switch (keyCode) {
  40. case KeyEvent.KEYCODE_1:
  41. //放大地图缩放级别,每次放大一个级别
  42. baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
  43. break;
  44. case KeyEvent.KEYCODE_2:
  45. //每次缩小一个级别
  46. baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
  47. break;
  48. case KeyEvent.KEYCODE_3:
  49. //以一个点为中心旋转
  50. //获取地图当前的状态
  51. MapStatus mapStatus = baiduMap.getMapStatus();
  52. float rotate = mapStatus.rotate;
  53. Log.d(TAG, "rotate:" + rotate);
  54. //旋转范围 0-360
  55. MapStatus newRotate = new MapStatus.Builder().rotate(rotate+30).build();
  56. baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(newRotate));
  57. break;
  58. case KeyEvent.KEYCODE_4:
  59. //以一条直线为轴,旋转 调整俯仰角 overlook
  60. //范围 0-45
  61. float overlook = baiduMap.getMapStatus().overlook;
  62. MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build();
  63. baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(overStatus));
  64. break;
  65. case KeyEvent.KEYCODE_5:
  66. //移动
  67. MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868));
  68. //带动画的更新地图状态,还是300毫秒
  69. baiduMap.animateMapStatus(moveStatusUpdate);
  70. break;
  71. default:
  72. break;
  73. }
  74. return super.onKeyDown(keyCode, event);
  75. }
  76. @Override
  77. protected void onDestroy() {
  78. //卸载super的前后是没有却别的
  79. mapView.onDestroy();
  80. unregisterReceiver(receiver);
  81. super.onDestroy();
  82. }
  83. @Override
  84. protected void onResume() {
  85. mapView.onResume();
  86. super.onResume();
  87. }
  88. @Override
  89. protected void onPause() {
  90. // TODO Auto-generated method stub
  91. super.onPause();
  92. mapView.onPause();
  93. }
  94. class MyBaiduSdkReceiver extends BroadcastReceiver{
  95. @Override
  96. public void onReceive(Context context, Intent intent) {
  97. String action = intent.getAction();
  98. if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
  99. //网络错误
  100. Toast.makeText(getApplicationContext(), "无网络", 0).show();
  101. }else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
  102. //key校验失败
  103. Toast.makeText(getApplicationContext(), "校验失败", 0).show();
  104. }
  105. }
  106. }
  107. }

三、地图图层

什么是地图图层

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

    图层分类

  • 底图
    • 基本的地图图层,包括软杆个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容
  • 实时交通信息图baiduMap.setTrafficEnabled(true)
  • 卫星图baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE)
    • 卫星地图是卫星拍摄的真实的地理面貌(其实很多都是飞机航拍的,因为卫星拍照贵啊),所以卫星地图可用来检测地面的信息

      覆盖物的成绩压盖关系,具体如下(从下至上的顺序):
      1.基础底图(包括底图、底图道路、卫星图等);
      2.地形图图层(GroundOverlay);
      3.热力图图层(HeatMap);
      4.实时路况图图层(BaiduMap.setTrafficEnabled(true););
      5.百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true););
      6.底图标注(指的是底图上面自带的那些POI元素);
      7.几何图形图层(点、折线、弧线、圆、多边形);
      8.标注图层(Marker),文字绘制图层(Text);
      9.指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针);
      10.定位图层(BaiduMap.setMyLocationEnabled(true););
      11.弹出窗图层(InfoWindow);
      12.自定义View(MapView.addView(View););

  • 切换地图,交通图,卫星图,是否显示实时交通

  1. @Override
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {
  3. //切换 地图、交通图、 卫星图
  4. switch (keyCode) {
  5. case KeyEvent.KEYCODE_1:
  6. //按1 设置显示底图
  7. baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
  8. break;
  9. case KeyEvent.KEYCODE_2:
  10. //卫星图
  11. baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
  12. break;
  13. case KeyEvent.KEYCODE_3:
  14. //打开交通图
  15. baiduMap.setTrafficEnabled(true);
  16. break;
  17. }
  18. return super.onKeyDown(keyCode, event);
  19. }

四、覆盖物

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

覆盖物包括:本地覆盖物和搜索覆盖物

#### 本地覆盖物的抽象基类:OverlayOptions(核心类)

  • 圆形覆盖物: CircleOptions
  • 文字覆盖物: TextOptions
  • marker覆盖物: MarkerOptions
  • 圆点覆盖物:DotOptions
  • ground 覆盖物:GroundOverlayOptions
  • 圆点覆盖物:DotOptions
  • 多边形覆盖物:PolygonOptions
  • 折线覆盖物:PolylineOptions
  • 弧线覆盖物:ArcOptions

    搜索覆盖物抽象类: OverlayManager (核心类)

  • 本地搜索覆盖物:PoiOverlay
  • 驾车路线覆盖物:DrivingRouteOverlay
  • 步行路线覆盖物:WalkingRouteOverlay
  • 换乘路线覆盖物:TransitOverlay
  • 公交路线覆盖物:BusLineOverlay

    创建覆盖物的步骤:

  1. 创建自己
  2. 给自己设置数据
  3. 把覆盖物添加到地图中
  • 添加圆形覆盖物
  1. private void draw() {
  2. //定义一个圆 : 圆心+半径
  3. //1.创建自己
  4. CircleOptions circleOptions = new CircleOptions();
  5. //2.给自己设置数据
  6. circleOptions.center(hmPos) //圆心
  7. .radius(1000)//半径 单位米
  8. .fillColor(0x60ff0000)//填充色
  9. .stroke(new Stroke(2,0x6000ff00));//边框宽度和颜色
  10. //3.把覆盖物添加到地图中
  11. baiduMap.addOverlay(circleOptions);
  12. }
  • 效果

  • 添加文字覆盖物

  1. private void draw() {
  2. TextOptions textOptions = new TextOptions();
  3. textOptions.fontColor(0x60ff0000)//设置字体颜色
  4. .text("无良印品,窗前明月光")//文字内容
  5. .position(hmPos)//位置
  6. .fontSize(24)//字体大小
  7. .typeface(Typeface.SERIF)//字体
  8. .rotate(30);//旋转
  9. baiduMap.addOverlay(textOptions);
  10. }
  • 效果

  • Marker覆盖物

  1. public class MarkerOptionsDemo extends BaseActivity {
  2. private View pop;
  3. private TextView title;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. draw();
  8. //点击某一个Marker,在脑袋上弹出pop
  9. initPop();
  10. }
  11. private void draw() {
  12. BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.eat_icon);
  13. MarkerOptions markerOptions = new MarkerOptions();
  14. markerOptions.position(hmPos)//设置位置
  15. .icon(bitmapDescriptor)//设置覆盖物小图标
  16. .draggable(true)//设置是否可以拖拽,默认为否
  17. .title("中心");//设置标题
  18. baiduMap.addOverlay(markerOptions);
  19. markerOptions = new MarkerOptions().title("向北")
  20. .position(new LatLng(latitude+0.001, longitude))
  21. .icon(bitmapDescriptor);
  22. baiduMap.addOverlay(markerOptions);
  23. ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();
  24. bitmaps.add(bitmapDescriptor);
  25. bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));
  26. markerOptions = new MarkerOptions().title("向东")
  27. .position(new LatLng(latitude, longitude+0.001))
  28. .icons(bitmaps)//图标设置一个帧动画,多个图片来回切换
  29. .period(10);//切换帧的时间间隔
  30. baiduMap.addOverlay(markerOptions);
  31. markerOptions = new MarkerOptions().title("向西南")
  32. .position(new LatLng(latitude-0.001, longitude-0.001))
  33. .icon(bitmapDescriptor);
  34. baiduMap.addOverlay(markerOptions);
  35. baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
  36. @Override
  37. public boolean onMarkerClick(Marker result) {
  38. //当点击时,更新pop的位置,设置为显示
  39. MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder()
  40. .layoutMode(ELayoutMode.mapMode)//按照经纬度设置位置
  41. .position(result.getPosition())//不能传null
  42. .width(MapViewLayoutParams.WRAP_CONTENT)
  43. .height(MapViewLayoutParams.WRAP_CONTENT)
  44. .yOffset(-5)//距离position的像素 向下是正值,向上是负值
  45. .build();
  46. mapview.updateViewLayout(pop, layoutParams);
  47. pop.setVisibility(View.VISIBLE);
  48. title.setText(result.getTitle());
  49. return true;
  50. }
  51. });
  52. }
  53. private void initPop() {
  54. //加载pop 添加到mapview,设置为隐藏
  55. pop = View.inflate(getApplicationContext(), R.layout.pop, null);
  56. MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder()
  57. .layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)//按照经纬度设置位置
  58. .position(hmPos)//不能传null,设置为mapMode时,必须设置position
  59. .width(MapViewLayoutParams.WRAP_CONTENT)
  60. .height(MapViewLayoutParams.WRAP_CONTENT)
  61. .build();
  62. mapview.addView(pop, layoutParams);
  63. pop.setVisibility(View.INVISIBLE);
  64. title = (TextView) pop.findViewById(R.id.title);
  65. }
  66. }
  • 效果

五、搜索

百度地图移动版API集成搜索服务,包括位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索

核心类

PoiSearch和OnGetPoiSearchResultListener RoutePlanSearch和OnGetRoutePlanResultListener

实现思路

  • 初始化PoiSearch类,通过setOnGetPoiSearchResultListtener方法注册搜索结果的监听对象OnGetPoiSearchResultListener
    ,实现异步搜索服务。
  • 通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。
  • 注意,OnGetPoiSearchResultListener只支持一个,一最后一次设置为准

    结合覆盖物展示搜索

    本地搜索覆盖物:PoiOverlay
    驾车路线覆盖物:DrivingRouteOverlay
    步行路线覆盖物:WalkingRouteOverlay
    换乘路线覆盖物:TransitOverlay

    POI(Point of Interest兴趣点)搜索有三种方式

    根据范围和检索词发起范围检索searchInBound
    周边检索searchNearby
    城市poi检索searchInCity
    poi详细信息检索 searchPoiDetail
    结果的展示: PoiOverlay

    在OnGetPoiSearchResultListener的onGetPoiResult方法中处理搜索结果

  • 处理步骤:
  • 判断服务器结果返回
  • 创建poi覆盖物
  • 将服务器返回数据添加到poi覆盖物中
  • 添加覆盖物到地图addToMap
  • 缩放地图,使所有Overlay都在合适的视野内
  • 注意
  • POI检索结果每页容量默认情况下为10,可以通过pageCapacity设置,支持1-50(10)
  • 翻页功能重新调用通过PoiSearch类的searchInXxx()方法并传递页数角标pageNum来实现,该方法是异步函数,搜索成功后会调用注册的事件处理函数onGetPoiResult 返回查询页的结果

  • 在一定范围内搜索POI

  1. /**
  2. * 范围内搜索
  3. * @author mwp
  4. *
  5. */
  6. public class PoiSearchInBoundsDemo extends BaseActivity{
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. search();
  11. }
  12. private void search() {
  13. PoiSearch poiSearch = PoiSearch.newInstance();
  14. PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();
  15. LatLngBounds latLngBounds = new LatLngBounds.Builder()
  16. .include(new LatLng(40.049233, 116.302675))//东北的点
  17. .include(new LatLng(40.050645, 116.303695))//西南的点
  18. .build();
  19. //由东北的点和西南的点两个点确定搜索的矩形范围
  20. boundSearchOption.bound(latLngBounds);//设置搜索范围
  21. boundSearchOption.keyword("加油站");//搜索关键字
  22. poiSearch.searchInBound(boundSearchOption);// 只是把范围能搜索到的poi设置为 地图的中心,同时会搜索到范围外的poi
  23. poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
  24. @Override
  25. public void onGetPoiResult(PoiResult result) {
  26. if (result==null || result.error==ERRORNO.RESULT_NOT_FOUND) {
  27. Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
  28. return;
  29. }
  30. //搜索poi的覆盖物
  31. MyPoiOverlay overlay = new MyPoiOverlay(baiduMap);
  32. //把事件分发给overlay,overlay才能处理那个点击事件
  33. baiduMap.setOnMarkerClickListener(overlay);
  34. overlay.setData(result);//设置结果
  35. overlay.addToMap();//把搜索的结果添加到地图中
  36. overlay.zoomToSpan();//缩放地图,使所有overlay都在合适的视野内, 注: 该方法只对Marker类型的overlay有效
  37. }
  38. @Override
  39. public void onGetPoiDetailResult(PoiDetailResult result) {
  40. }
  41. });
  42. }
  43. class MyPoiOverlay extends PoiOverlay{
  44. public MyPoiOverlay(BaiduMap arg0) {
  45. super(arg0);
  46. }
  47. @Override
  48. public boolean onPoiClick(int index) {
  49. //获取搜索结果
  50. PoiResult poiResult = getPoiResult();
  51. //获取点击的那个poi的信息
  52. PoiInfo poiInfo = poiResult.getAllPoi().get(index);
  53. String text = poiInfo.name+","+poiInfo.address;
  54. Toast.makeText(getApplicationContext(), text, 0).show();
  55. return super.onPoiClick(index);
  56. }
  57. }
  58. }
  • 搜索结果

  • 周边搜索

  1. /**
  2. * 周边搜索
  3. * @author mwp
  4. *
  5. */
  6. public class PoiSearchNearByDemo extends BaseActivity{
  7. private PoiSearch poiSearch;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. search();
  12. }
  13. private void search() {
  14. poiSearch = PoiSearch.newInstance();
  15. PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
  16. nearbySearchOption.location(hmPos);//设置中心点
  17. nearbySearchOption.radius(1000);//设置半径 米
  18. nearbySearchOption.keyword("加油站");//关键字
  19. poiSearch.searchNearby(nearbySearchOption);
  20. poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
  21. @Override
  22. public void onGetPoiResult(PoiResult result) {
  23. if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
  24. Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
  25. return;
  26. }
  27. PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆盖物
  28. baiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件
  29. overlay.setData(result);// 设置结果
  30. overlay.addToMap();// 把搜索的结果添加到地图中
  31. overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效
  32. }
  33. @Override
  34. public void onGetPoiDetailResult(PoiDetailResult result) {
  35. if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){
  36. Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
  37. return;
  38. }
  39. String text = result.getAddress()+ "::" + result.getCommentNum() + result.getEnvironmentRating();
  40. Toast.makeText(getApplicationContext(), text, 0).show();
  41. }
  42. });
  43. }
  44. class MyPoiOverlay extends PoiOverlay{
  45. public MyPoiOverlay(BaiduMap arg0) {
  46. super(arg0);
  47. }
  48. @Override
  49. public boolean onPoiClick(int index) {
  50. PoiResult poiResult = getPoiResult();
  51. PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息
  52. String text = poiInfo.name + "," + poiInfo.address;
  53. Toast.makeText(getApplicationContext(), text, 0).show();
  54. PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption();
  55. detailSearchOption.poiUid(poiInfo.uid);//设置poi的uid
  56. poiSearch.searchPoiDetail(detailSearchOption);
  57. return super.onPoiClick(index);
  58. }
  59. }
  60. }
  • 搜索结果

  • 城市内搜索

  1. /**
  2. * 城市内搜索
  3. * @author mwp
  4. *
  5. */
  6. public class PoiSearchIncityDemo extends BaseActivity {
  7. private PoiSearch poiSearch;
  8. private int currentPageIndex = 0;
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. poiSearch = PoiSearch.newInstance();
  13. search();
  14. poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
  15. @Override
  16. public void onGetPoiResult(PoiResult result) {
  17. if (result == null
  18. || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
  19. Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
  20. return;
  21. }
  22. String text = "共" + result.getTotalPageNum() + "页,共"
  23. + result.getTotalPoiNum() + "条,当前第"
  24. + result.getCurrentPageNum() + "页,当前页"
  25. + result.getCurrentPageCapacity() + "条";
  26. Toast.makeText(getApplicationContext(), text, 1).show();
  27. baiduMap.clear();//清空地图所有的Overlay覆盖物以及InfoWindow
  28. PoiOverlay overlay = new MyPoiOverlay(baiduMap);
  29. baiduMap.setOnMarkerClickListener(overlay);
  30. overlay.setData(result);
  31. overlay.addToMap();
  32. overlay.zoomToSpan();
  33. }
  34. @Override
  35. public void onGetPoiDetailResult(PoiDetailResult arg0) {
  36. }
  37. });
  38. }
  39. private void search() {
  40. PoiCitySearchOption citySearchOption = new PoiCitySearchOption();
  41. citySearchOption.city("北京");
  42. citySearchOption.keyword("加油站");
  43. citySearchOption.pageNum(currentPageIndex);
  44. poiSearch.searchInCity(citySearchOption);
  45. }
  46. @Override
  47. public boolean onKeyDown(int keyCode, KeyEvent event) {
  48. //每按一下数字键1就显示下一页的POI
  49. if (keyCode == KeyEvent.KEYCODE_1) {
  50. currentPageIndex++;
  51. search();
  52. }
  53. return super.onKeyDown(keyCode, event);
  54. }
  55. class MyPoiOverlay extends PoiOverlay{
  56. public MyPoiOverlay(BaiduMap arg0) {
  57. super(arg0);
  58. }
  59. @Override
  60. public boolean onPoiClick(int index) {
  61. PoiResult poiResult = getPoiResult();
  62. PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息
  63. String text = poiInfo.name + "," + poiInfo.address;
  64. Toast.makeText(getApplicationContext(), text, 0).show();
  65. return super.onPoiClick(index);
  66. }
  67. }
  68. }
  • 搜索结果

六、路线规划

自驾路线规划

结果展示: DrivingRouteOverlay

  • 驾车路线查询
  • 查询:RoutePlanSearch.drivingSearch驾乘路线搜索,或者增加途经点.
  • PlanNode内容的设置:可以使用经纬度和地名,但不支持模糊查询,需要输入准确的名称
  • 可以通过DrivingRoutePlanOption.policy (int policy)来设置驾车路线规划策略
  • 结果处理:OnGetRoutePlanResultListener. onGetDrivingRouteResult(DrivingRouteResult result)

步行路线规划

步行路线查询
结果展示: WalkingRouteOverlay
RoutePlanSearch. walkingSearch步行路线搜索.
结果处理: OnGetRoutePlanResultListener. onGetWalkingRouteResult(WalkingRouteResult result)

公交换乘路线规划

结果展示:TransitRouteOverlay
检索: RoutePlanSearch. transitSearch
通过TransitRoutePlanOption.policy (int policy) 设置路线规划策略
结果处理: OnGetRoutePlanResultListener. onGetTransitRouteResult(TransitRouteResult result)

  • 自驾线路规划(路过特定地点)
  1. /**
  2. * 驾车路线
  3. * @author mwp
  4. *
  5. */
  6. public class DrivingRouteOverlayDemo extends BaseActivity {
  7. private RoutePlanSearch routePlanSearch;
  8. @Override
  9. protected void onCreate(Bundle savedInstanceState) {
  10. super.onCreate(savedInstanceState);
  11. search();
  12. }
  13. private void search() {
  14. routePlanSearch = RoutePlanSearch.newInstance();
  15. DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();
  16. PlanNode from = PlanNode.withLocation(hmPos);//窗前起点
  17. PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));//创建终点
  18. drivingOption.from(from);//设置起点
  19. drivingOption.to(to);//设置终点
  20. List<PlanNode> nodes = new ArrayList<PlanNode>();
  21. nodes.add(PlanNode.withCityNameAndPlaceName("北京", "天安门"));
  22. drivingOption.passBy(nodes);
  23. drivingOption.policy(DrivingPolicy.ECAR_DIS_FIRST);//设置策略,驾乘检索策略常量:最短距离
  24. routePlanSearch.drivingSearch(drivingOption);
  25. routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
  26. @Override
  27. public void onGetWalkingRouteResult(WalkingRouteResult arg0) {
  28. }
  29. @Override
  30. public void onGetTransitRouteResult(TransitRouteResult arg0) {
  31. }
  32. // 自驾搜索结果回调
  33. @Override
  34. public void onGetDrivingRouteResult(DrivingRouteResult result) {
  35. if (result == null
  36. || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
  37. Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
  38. return;
  39. }
  40. DrivingRouteOverlay drivingOverlay = new MyDrivingOverlay(baiduMap);
  41. baiduMap.setOnMarkerClickListener(drivingOverlay);
  42. drivingOverlay.setData(result.getRouteLines().get(0));//设置线路为搜索结果的第一条
  43. drivingOverlay.addToMap();
  44. drivingOverlay.zoomToSpan();
  45. }
  46. });
  47. }
  48. class MyDrivingOverlay extends DrivingRouteOverlay{
  49. public MyDrivingOverlay(BaiduMap arg0) {
  50. super(arg0);
  51. }
  52. @Override
  53. public BitmapDescriptor getStartMarker() {
  54. // 覆写此方法以改变默认起点图标
  55. return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
  56. }
  57. @Override
  58. public BitmapDescriptor getTerminalMarker() {
  59. // 覆写此方法以改变默认终点图标
  60. return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
  61. }
  62. }
  63. }
  • 搜索结果

  • 步行线路规划

  1. /**
  2. * 步行路线
  3. * @author mwp
  4. *
  5. */
  6. public class WalkingRouteOverlayDemo extends BaseActivity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. search();
  11. }
  12. private void search() {
  13. RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();
  14. WalkingRoutePlanOption walkingOption = new WalkingRoutePlanOption();
  15. PlanNode from = PlanNode.withLocation(hmPos);//创建起点
  16. PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 创建终点
  17. walkingOption.from(from);
  18. walkingOption.to(to);
  19. routePlanSearch.walkingSearch(walkingOption);
  20. routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
  21. @Override
  22. public void onGetWalkingRouteResult(WalkingRouteResult result) {
  23. if (result == null
  24. || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
  25. Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
  26. return;
  27. }
  28. WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);
  29. baiduMap.setOnMarkerClickListener(overlay);
  30. overlay.setData(result.getRouteLines().get(0));
  31. overlay.addToMap();
  32. overlay.zoomToSpan();
  33. }
  34. @Override
  35. public void onGetTransitRouteResult(TransitRouteResult arg0) {
  36. }
  37. @Override
  38. public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
  39. }
  40. });
  41. }
  42. }
  • 搜索结果

  • 公交换乘规划

  1. /**
  2. * 公交换乘路线规划
  3. * @author mwp
  4. *
  5. */
  6. public class TransitRouteOverlayDemo extends BaseActivity {
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. search();
  11. }
  12. private void search() {
  13. RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();
  14. TransitRoutePlanOption transitOption = new TransitRoutePlanOption();
  15. PlanNode from = PlanNode.withLocation(hmPos);// 创建起点
  16. PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 创建终点
  17. transitOption.from(from);
  18. transitOption.to(to);
  19. transitOption.city("北京");//公交换乘只能在一个城市中,不能跨城市
  20. transitOption.policy(TransitPolicy.EBUS_WALK_FIRST);//公交检索策略常量:最少步行距离
  21. routePlanSearch.transitSearch(transitOption);
  22. routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
  23. @Override
  24. public void onGetWalkingRouteResult(WalkingRouteResult arg0) {
  25. }
  26. @Override
  27. public void onGetTransitRouteResult(TransitRouteResult result) {
  28. if (result == null
  29. || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {
  30. Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
  31. return;
  32. }
  33. TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);
  34. baiduMap.setOnMarkerClickListener(overlay);
  35. overlay.setData(result.getRouteLines().get(0));
  36. overlay.addToMap();
  37. overlay.zoomToSpan();
  38. }
  39. @Override
  40. public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
  41. }
  42. });
  43. }
  44. class MyDrivingOverlay extends DrivingRouteOverlay{
  45. public MyDrivingOverlay(BaiduMap arg0) {
  46. super(arg0);
  47. }
  48. @Override
  49. public BitmapDescriptor getStartMarker() {
  50. //覆写此方法以改变默认起点图标
  51. return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
  52. }
  53. @Override
  54. public BitmapDescriptor getTerminalMarker() {
  55. //覆写此方法以改变默认终点图标
  56. return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
  57. }
  58. }
  59. }
  • 规划结果

七、地址解析服务

GeoCoder.geocode(GeoCodeOption option)
根据地址名获取地址信息 异步函数,返回结果在OnGetGeoCoderResultListener里的onGetGeoCodeResult方法通知
GeoCoder.reverseGeoCode(ReverseGeoCodeOption option)
根据地理坐标点获取地址信息 异步函数,返回结果在OnGetGeoCoderResultListener里的onGetReverseGeoCodeResult方法通知

八、联想词检索

SuggestionSearch . requestSuggestion(SuggestionSearchOption option)
查询一系列与指定key相关的内容,结果中包括城市及包含key的名称
结果处理OnGetSuggestionResultListener . onGetSuggestionResult(SuggestionResult result)

九、定位

在百度地图移动版API中,提供一个重要的特色功能:定位,通过这个功能,能获取到用户当前所在位置。
在程序中,如果使用此功能,必须注册GPS和网络的使用权限。
在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可用位置信息,则会通过判断网络是否连接(即确认手机是否能上网,不论是连接
2G/3G或Wi-Fi网络),如果是,则通过请求百度网络定位服务,返回网络定位结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开
关。

目前系统自带的网络定位服务精度低,且服务不稳定、精度低,并且从未来的趋势看,基站定位是不可控的(移动公司随时可能更改基站编号以垄断定位服务),而
Wi-Fi定位则不然,它是一种精度更高、不受管制的定位方法。国内其它使用Wi-Fi定位的地图软件,Wi-Fi定位基本不可用,百度的定位服务量化指
标优秀,网络接口返回速度快(服务端每次定位响应时间50毫秒以内),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆盖率
98%,在国内处于一枝独秀的地位。
注意
关于经纬度的说明:该经纬度信息是经过加密处理,所以在其它地图工具中测得的经纬度 信息不适合百度的坐标系统。
使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理坐标如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0

  1. /**
  2. * 定位
  3. *
  4. * @author mwp
  5. *
  6. */
  7. public class LocationDemo extends BaseActivity {
  8. private LocationClient locationClient;
  9. private BitmapDescriptor geo;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. lacate();
  14. }
  15. private void lacate() {
  16. locationClient = new LocationClient(getApplicationContext());
  17. LocationClientOption option = new LocationClientOption();
  18. option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
  19. option.setCoorType("bd0911");// 返回的定位结果是百度经纬度,默认值gcj02
  20. option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
  21. option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
  22. option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
  23. locationClient.setLocOption(option);
  24. locationClient.registerLocationListener(new BDLocationListener() {
  25. @Override
  26. public void onReceiveLocation(BDLocation result) {
  27. if (result != null) {
  28. MyLocationData data = new MyLocationData.Builder()
  29. .latitude(result.getLatitude())
  30. .longitude(result.getLongitude()).build();
  31. baiduMap.setMyLocationData(data);
  32. }
  33. }
  34. });
  35. geo = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);
  36. MyLocationConfiguration configuration = new MyLocationConfiguration(
  37. MyLocationConfiguration.LocationMode.FOLLOWING, true, geo);
  38. baiduMap.setMyLocationConfigeration(configuration);// 设置定位模式
  39. baiduMap.setMyLocationEnabled(true);// 打开定位图层
  40. }
  41. @Override
  42. protected void onStart() {
  43. locationClient.start();
  44. super.onStart();
  45. }
  46. @Override
  47. protected void onPause() {
  48. locationClient.stop();
  49. super.onPause();
  50. }
  51. @Override
  52. public boolean onKeyDown(int keyCode, KeyEvent event) {
  53. switch (keyCode) {
  54. case KeyEvent.KEYCODE_1:
  55. //正常
  56. baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
  57. MyLocationConfiguration.LocationMode.NORMAL, true, geo));
  58. break;
  59. case KeyEvent.KEYCODE_2:
  60. //罗盘
  61. baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
  62. MyLocationConfiguration.LocationMode.COMPASS, true, geo));
  63. break;
  64. case KeyEvent.KEYCODE_3:
  65. //跟随
  66. baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(
  67. MyLocationConfiguration.LocationMode.FOLLOWING, true, geo));
  68. break;
  69. default:
  70. break;
  71. }
  72. return super.onKeyDown(keyCode, event);
  73. }
  74. }

十、离线地图

离线文件下载
http://shouji.baidu.com/map/map.html?from=3052,指定机型和城市下载对应的离线地图

  • 2.0以上版本处理步骤
  • 将下载好的离线地图包解压缩。
  • 找到解压出的"BaiduMap"文件夹,把它放入手机存储卡根目录。在上述过程中如遇提示“是否需要覆盖文件”,点击确定即可。
  • 断开与电脑连接,打开百度手机地图(如已打开请重启),系统会提示导入成功。
  • 提示:下载多个城市包时,经解压后,这些城市数据都会被同时解压到BaiduMap文件夹中,不同城市不会出现被覆盖的情况。
  • 1.X版本处理步骤
  • 将离线地图加压,把Mapdata文件夹拷入SD卡根目录下的BaiduMapSdk下
  • 利用MKOfflineMap在初始化(init)后调用scan()扫描本地地图资源
  1. /** 离线地图初始化 **/
  2. mOffline = new MKOfflineMap();
  3. mOffline.init(mBMapMan, new MKOfflineMapListener() {
  4. public void onGetOfflineMapState(int type, int state) {
  5. switch (type) {
  6. case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:
  7. {
  8. MKOLUpdateElement update = mOffline.getUpdateInfo(state);
  9. //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio));
  10. }
  11. break;
  12. case MKOfflineMap.TYPE_NEW_OFFLINE:
  13. Log.d("OfflineDemo", String.format("add offlinemapnum:%d", state));
  14. break;
  15. case MKOfflineMap.TYPE_VER_UPDATE:
  16. Log.d("OfflineDemo", String.format("new offlinemapver"));
  17. break;
  18. }
  19. }
  20. }
  21. );
  22. /** 离线地图导入离线包 **/
  23. intnum = mOffline.scan();

【转载】Android端百度地图API使用详解的更多相关文章

  1. Android端百度地图API使用详解

    百度地图API简介 百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能丰富.交互性强的地图应用程序. 百度地图移动版A ...

  2. iOS百度地图简单使用详解

    iOS百度地图简单使用详解 百度地图 iOS SDK是一套基于iOS 5.0及以上版本设备的应用程序接口,不仅提供展示地图的基本接口,还提供POI检索.路径规划.地图标注.离线地图.定位.周边雷达等丰 ...

  3. Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息

    本文主要介绍了Android项目集成百度地图API,使用AlarmManager定时调用Service,在Service中请求坐标更新,并通过坐标得到省.市和县三级地理位置信息的方法. 程序结构很简单 ...

  4. web端百度地图API实现实时轨迹动态展现

    最近在工作中遇到了一个百度地图api中的难题,恐怕有的程序员可能也遇到过.就是实时定位并显示轨迹,网上大部分都是通过创建polyline对象贴到地图上.当然,百度地图的画线就是这样实现的,但是好多人会 ...

  5. android 基于百度地图api开发定位以及获取详细地址

    一:百度地图开发必须要到百度开发平台android开发api下载相应的库,已经申请百度地图开发key. 二:新建项目baidumaplocation.设计main.xml文件这里注意的是MapView ...

  6. Android 调用百度地图API

    一.到 百度地图开发平台下载SDK http://lbsyun.baidu.com/index.php?title=androidsdk/sdkandev-download 1.点击自定义下载 2.下 ...

  7. Android使用百度地图API实现GPS步行轨迹

    百度地图Android SDK下载:http://developer.baidu.com/map/sdkandev-download.htm 下面是效果: 采样点取得太频繁所以看起来像是一个个点... ...

  8. 【Android接百度地图API】百度地图Demo点击按钮闪退

    运行百度地图自带的BaiduMap_AndroidSDK_v4.1.0_Sample里面的BaiduMapsApiASDemo发现点击上面的按钮会闪退,控制台报的是xml的问题 查了一下,官方文档特别 ...

  9. android笔记---百度地图api应用 (二) 获取公交路线的详细信息

    package com.example.bdtest; import com.baidu.mapapi.MKEvent; import com.baidu.mapapi.MKPlanNode; imp ...

随机推荐

  1. android中文字斜着显示

    /** * 自定义一个Textview * * @author Administrator * */ public class MyTextView extends TextView { public ...

  2. SQL2008删除大量数据

    常见问题:工作中数据库难免产生大量的日志,而用户可能关心的只有最近一个月左右的,这些日志占用了服务器磁盘,还可能影响了服务运行效率.甚至在数据库迁移时更因为体积而带来巨大麻烦. 那么,在需要时,删除不 ...

  3. 页面加载,使用ajax查询某个类别,并且给它们添加(拼接)连接

    直接上代码 $(function(){ var a = ''; $.get("productType1_findAll.action",function(data){ consol ...

  4. HTML5新增的语义标签和IE版本低的兼容性问题

    <!DOCTYPE html><html> <head> <!-- HTML5中浏览器兼容(较低版本的IE浏览器不支持H5的布局):需要在<head&g ...

  5. FZU 1063 三维扫描(三维连通块)

    Accept: 415    Submit: 1291 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 工业 ...

  6. 解决Mysql报错缺少libaio.so.1

    解决Mysql报错缺少libaio.so.1 报错如上图,需要安装libaio.so.1 64位系统安装: wget http://mirror.centos.org/centos/6/os/x86_ ...

  7. 【转】mysql利用init-connect增加访问审计功能

    mysql的连接首先都是要通过init-connect初始化,然后连接到实例. 我们利用这一点,通过在init-connect的时候记录下用户的thread_id,用户名和用户地址实现db的访问审计功 ...

  8. JSTL 标签库

    1. JSTL 概述 JSTL 是 apache 对 EL 表达式的扩展, JSTL 是标签语言! 需要导入 jstl-1.2.jar 包 2. JSTL 标签库 core: 核心标签库; fmt: ...

  9. Linux三剑客之老二-------sed命令详解

    sed命令 文件 编辑 本文索引 [隐藏] sed的选项.命令.替换标记 选项 参数 sed命令 sed替换标记 sed元字符集 sed用法实例 替换操作:s命令 全面替换标记g 定界符 删除操作:d ...

  10. 我的Android进阶之旅------>Android中查看应用签名信息

    一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...