什么是百度地图API?

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

面向的读者

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

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

获取API Key

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

兼容性

支持Android 1.5及以上系统。

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

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

百度地图的“Hello,World”

在Manifest中添加使用权限

<uses-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版本支持

<supports-screensandroid:largeScreens="true"

android:normalScreens="true"android:smallScreens="true"

android:resizeable="true"android:anyDensity="true"/>

<uses-sdkandroid:minSdkVersion="3"></uses-sdk>

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

importjava.util.ArrayList;

importjava.util.List;

importandroid.content.Context;

importandroid.graphics.Canvas;

importandroid.graphics.Paint;

importandroid.graphics.Point;

importandroid.graphics.drawable.Drawable;

importandroid.location.Location;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.View;

importandroid.widget.Toast;

importcom.baidu.mapapi.BMapManager;

importcom.baidu.mapapi.GeoPoint;

importcom.baidu.mapapi.ItemizedOverlay;

importcom.baidu.mapapi.LocationListener;

importcom.baidu.mapapi.MKAddrInfo;

importcom.baidu.mapapi.MKDrivingRouteResult;

importcom.baidu.mapapi.MKGeneralListener;

importcom.baidu.mapapi.MKLocationManager;

importcom.baidu.mapapi.MKPlanNode;

import com.baidu.mapapi.MKPoiResult;

importcom.baidu.mapapi.MKSearch;

importcom.baidu.mapapi.MKSearchListener;

importcom.baidu.mapapi.MKTransitRouteResult;

importcom.baidu.mapapi.MKWalkingRouteResult;

importcom.baidu.mapapi.MapActivity;

importcom.baidu.mapapi.MapController;

importcom.baidu.mapapi.MapView;

importcom.baidu.mapapi.MyLocationOverlay;

importcom.baidu.mapapi.Overlay;

importcom.baidu.mapapi.OverlayItem;

importcom.baidu.mapapi.PoiOverlay;

importcom.baidu.mapapi.RouteOverlay;

import com.baidu.mapapi.TransitOverlay;

public classMyMapActivity extends MapActivity {

@Override

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

@Override

protected boolean isRouteDisplayed() {

return false;

}

}

在布局xml中添加地图控件

<?xmlversion="1.0" encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

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

android:layout_height="fill_parent">

<TextView android:layout_width="fill_parent"

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

<com.baidu.mapapi.MapViewandroid:id="@+id/bmapsView"

android:layout_width="fill_parent"android:layout_height="fill_parent"

android:clickable="true"/>

</LinearLayout>

初始化地图Activity

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

mBMapMan = newBMapManager(getApplication());

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

super.initMapActivity(mBMapMan);

MapView mMapView =(MapView) findViewById(R.id.bmapsView);

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

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

GeoPoint point = newGeoPoint((int) (39.915 * 1E6),

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

mMapController.setCenter(point);  //设置地图中心点

mMapController.setZoom(12);    //设置地图zoom级别

Override以下方法,管理API:

@Override

protected voidonDestroy() {

if (mBMapMan != null) {

mBMapMan.destroy();

mBMapMan = null;

}

super.onDestroy();

}

@Override

protected voidonPause() {

if (mBMapMan != null) {

mBMapMan.stop();

}

super.onPause();

}

@Override

protected voidonResume() {

if (mBMapMan != null) {

mBMapMan.start();

}

super.onResume();

}

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

地图图层概念

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

底图

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

实时交通信息

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

mMapView.setTraffic(true);

运行程序,结果如下:

卫星图

在此版本API中暂不支持。

mMapView.setSatellite(true);

实景图

在此版本API中暂不支持。

mMapView.setStreetView(true);

地图覆盖物概述

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

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

Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。

MyLocationOverlay:一个负责显示用户当前位置的Overlay。

ItemizedOverlay<Itemextends OverlayItem>:Overlay的一个基类,包含了一个OverlayItem列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。

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

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

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

覆盖物的抽象基类:Overlay

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

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

public classMyOverlay extends Overlay {

GeoPoint geoPoint = new GeoPoint((int)(39.915 * 1E6), (int) (116.404 * 1E6));

Paint paint = new Paint();

@Override

public void draw(Canvas canvas, MapViewmapView, boolean shadow) {

//在天安门的位置绘制一个String

Point point =mMapView.getProjection().toPixels(geoPoint, null);

canvas.drawText("★这里是天安门", point.x, point.y, paint);

}

}

添加到MapView的覆盖物中:

mMapView.getOverlays().add(newMyOverlay());

运行结果如下:

当前位置:MyLocationOverlay

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

初始化Location模块

// 初始化Location模块

mLocationManager =mBMapMan.getLocationManager();

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

//mLocationManager.enableProvider(MKLocationManager.MK_NETWORK_PROVIDER);

//mLocationManager.disableProvider(MKLocationManager.MK_GPS_PROVIDER);

// 添加定位图层

MyLocationOverlaymylocTest = new MyLocationOverlay(this, mMapView);

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

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

mMapView.getOverlays().add(mylocTest);

运行结果如下:

分条目覆盖物:ItemizedOverlay

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

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

class OverItemTextends ItemizedOverlay<OverlayItem> {

private List<OverlayItem> GeoList =new ArrayList<OverlayItem>();

private Context mContext;

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

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

private double mLat2 = 39.9022;

private double mLon2 = 116.3922;

private double mLat3 = 39.917723;

private double mLon3 = 116.3722;

public OverItemT(Drawable marker, Context context) {

super(boundCenterBottom(marker));

this.mContext = context;

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

GeoPoint p1 = new GeoPoint((int) (mLat1* 1E6), (int) (mLon1 * 1E6));

GeoPoint p2 = new GeoPoint((int) (mLat2* 1E6), (int) (mLon2 * 1E6));

GeoPoint p3 = new GeoPoint((int) (mLat3* 1E6), (int) (mLon3 * 1E6));

GeoList.add(new OverlayItem(p1,"P1", "point1"));

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

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

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

}

@Override

protected OverlayItem createItem(int i) {

return GeoList.get(i);

}

@Override

public int size() {

return GeoList.size();

}

@Override

// 处理当点击事件

protected boolean onTap(int i) {

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

Toast.LENGTH_SHORT).show();

return true;

}

}

添加到MapView的覆盖物中:

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

//得到需要标在地图上的资源

mMapView.getOverlays().add(newOverItemT(marker, this));

//添加ItemizedOverlay实例到mMapView

点击其中一个图标,运行结果如下:

本地搜索覆盖物:PoiOverlay

详见详见在POI搜索及PoiOverlay。

驾车路线覆盖物:RouteOverlay

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

换乘路线覆盖物:TransitOverlay

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

搜索服务

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

public classMySearchListener implements MKSearchListener {

@Override

public void onGetAddrResult(MKAddrInforesult, int iError) {    }

@Override

public voidonGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {    }

@Override

public void onGetPoiResult(MKPoiResultresult, int type, int iError) {   }

@Override

public voidonGetTransitRouteResult(MKTransitRouteResult result, int iError) {    }

@Override

public voidonGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {    }

}

然后初始化MKSearch类:

mMKSearch = newMKSearch();

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

POI搜索及PoiOverlay

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

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

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

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

@Override

public voidonGetPoiResult(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);

}

运行结果如下:

驾车路线搜索及RouteOverlay

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

MKPlanNode start =new MKPlanNode();

start.pt = newGeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));

MKPlanNode end = newMKPlanNode();

end.pt = newGeoPoint(40057031, 116307852);

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

mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);

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

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

@Override

public voidonGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {

if (result == null) {

return;

}

RouteOverlay routeOverlay = newRouteOverlay(MyMapActivity.this, mMapView);

// 此处仅展示一个方案作为示例

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

mMapView.getOverlays().add(routeOverlay);

}

运行结果如下:

步行路线搜索及RouteOverlay

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

公交换乘路线搜索及TransitOverlay

检索从天安门到百度大厦的公交换乘路线:

MKPlanNode start =new MKPlanNode();

start.pt = newGeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));

MKPlanNode end = newMKPlanNode();

end.pt = newGeoPoint(40057031, 116307852);

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

mMKSearch.setTransitPolicy(MKSearch.EBUS_TRANSFER_FIRST);

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

实现MySearchListener的onGetTransitRouteResult(MKTransitRouteResult, int),并展示检索结果:

@Override

public voidonGetTransitRouteResult(MKTransitRouteResult result, int iError) {

if (result == null) {

return;

}

TransitOverlay transitOverlay = newTransitOverlay(MyMapActivity.this, mMapView);

// 此处仅展示一个方案作为示例

transitOverlay.setData(result.getPlan(0));

mMapView.getOverlays().add(transitOverlay);

}

地址信息查询

根据地理坐标查询地址信息:

mMKSearch.reverseGeocode(newGeoPoint(40057031, 116307852));

实现MySearchListener的onGetAddrResult,得到查询结果。

事件

定位监听

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

mLocationManager =mBMapMan.getLocationManager();

LocationListenerlistener = new LocationListener() {

@Override

public void onLocationChanged(Locationlocation) {

// TODO 在此处处理位置变化

}

};

// 注册监听

mLocationManager.requestLocationUpdates(listener);

// 不需要时移除监听

mLocationManager.removeUpdates(listener);

一般事件监听

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

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

@Override

public void onGetPermissionState(intiError) {

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

}

@Override

public void onGetNetworkState(int iError) {

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

}

});

这是我在看了一天百度地图开发以及别人的例子所理解的,都是最基础的。不过我看的例子不是百度发布的最新的api,在新的api中这些有的已经过时,但是基本原理还是这些。几天后我开发玩我的项目会来补全这些。

Android学习 - 百度地图开发基础相关推荐

  1. 基于Android的百度地图开发

    参考资料: android studio获得SHA1的值,然后在百度地图移动版API官网申请key Android Studio怎么查看程序的安全码获取SHA1值? http://www.codese ...

  2. Android studio 百度地图开发(5)查询周边服务(加油站)

    Android studio 百度地图开发(5)查询周边服务(加油站) email:chentravelling@163.com 开发环境:win7 64位,Android Studio,请注意是An ...

  3. 用android studio测量距离,Android studio 百度地图开发(6)Marker绑定事件、计算两点距离...

    Android studio 百度地图开发(6)Marker绑定事件.计算两点距离 email:chentravelling@163.com 开发环境:win7 64位,Android Studio, ...

  4. Android studio 百度地图开发(3)地图导航

    Android studio 百度地图开发(3)地图导航 email:chentravelling@163.com 工程下载地址:http://blog.csdn.net/chentravelling ...

  5. 谷歌 地图 android studio,Android Studio百度地图开发(一)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本人用Android Studio做百度地图开发,调试了一整天,始终无法通过.然后怀疑代码有问题,就换Eclipse进行代码编写,毕竟网上关于Eclips ...

  6. android手机百度地图开发

    最近在做android手机上的地图开发,我们选用百度地图进行开发. 1.百度资源下载及参考文档 http://developer.baidu.com/map/sdk-android.htm 里面的开发 ...

  7. android百度地图定位文字表述,Android studio 百度地图开发(8)地图已标记POI点和搜索POI点的获取和利用...

    一.简要描述 百度地图的POI点可以分有两种:地图中已经标记的点和通过关键词搜索得到的POI点.对于这两种POI点,百度封装成了不同的类和接口来实现监听,下面简单讲一点. 二.地图中已标记POI点 首 ...

  8. android的百度地图开发(二) 定位

    参考:http://blog.csdn.net/mr_wzc/article/details/51590485 第一步,初始化LocationClient类 //获取地图控件引用mMapView = ...

  9. Android Studio百度地图开发所需参数获取SHA1或MD5的最简单方法(图文教程)

    Android Studio获取SHA1或MD5的最简单方法 /*** Copyright (c) 2016, smuyyh@gmail.com All Rights Reserved.* # #* ...

最新文章

  1. linux setcap指令,Linux下setcap详解
  2. Linux的进程间通信-消息队列
  3. 数据算法 --hadoop/spark数据处理技巧 --(二次排序问题和TopN问题)
  4. Boost:gzifstream和gzofstream的测试程序
  5. 从一个极简的微服务架构开始
  6. Nginx+httpd反代实现动静分离
  7. Python中的浅复制(shallow copy)和深复制(deep copy)
  8. Visual C++ 2008入门经典 第十章标准模板库(二)
  9. java ssh jar_java应用程序远程登录linux并执行其命令(ssh jar包)
  10. geohash java 距离排序_APP筛选附近的人并排序(geohash算法)
  11. 面向组学大数据的生物信息学研究
  12. Arduino教程六—DS1302时钟模块
  13. 如何使用工时表软件跟踪时间和成本?
  14. 目录扫描暴力破解网站管理员密码
  15. 计算机上的按键名有哪些,电脑键盘上各个按键名称与功能作用
  16. Win10修修补补日记:Win10周年更新再出BUG 淡定
  17. PROBLEM F: 切煎饼
  18. bcprov-jdk15on 简介、中文文档、中英对照文档 下载
  19. 灵魂画师全都出来了,都怪昨天那个AI画猫的应用……
  20. 并行与分布式计算导论(六)MPI入门

热门文章

  1. 华为设备软件SACG认证
  2. ElasticSearch批量(mget)查询
  3. 要坚信错误信息能帮你解决问题
  4. 隐形眼镜会影响角膜,戴过的人还能做近视手术么?
  5. android空包签名,安卓空包签名教程
  6. CSS笔记:漂亮的卡片投射阴影
  7. 医药智慧物流新突破,极智嘉携手九州通打造全球首个AMR月台集货
  8. 小程序图片作为背景图无法铺满的问题
  9. TG申请取消禁言教程
  10. 派查查 :一个WearOS智能手表系统上的快递查询应用