百度地图AndroidAPI
sf2gis@163.com
2014年1月2日
1 概述
百度地图安卓SDK是基于安卓的地图操作SDK,对于非盈利性质应用免费,商用收费。具有基本地图操作、定位、导航(需使用百度地图)、图层管理、POI、地图编码/逆地理编码、路线规划、云存储、离线地图、分享等功能。
参考:http://developer.baidu.com/map/sdk-android.htm
2 使用步骤
2.1 使用SDK之前需要申请Key
通过SDK的主页进入Key页面,按照说明生成Key。
1) 生成keystorefile
右键项目-》Android工具-》导出签名应用-》生成keystorefile。
2) 生成sha1
使用keytool命令生成sha1等安全码。
keytool -list -v -keystore keystorefile-storepass 123456
3) 生成key
将sha1码和包名提交百度,生成key。
2.2 引入百度地图库
下载SDK,按照说明引用相关库。
2.3 显示地图
2.3.1 Manifest添加权限
2.3.2 Activity中添加MapView
<com.baidu.mapapi.map.MapView
android:id=@+id/mapview
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:clickable=”true”
/>
2.3.3 控制Activity
注意:所有的Activity状态响应,都要调用MapView的状态响应。
2.3.4 生成地图控件
在Activity的onCreate()中生成地图管理器,一定要在setContentView()之前初始化地图控件。
bMapManager = newBMapManager(getApplication());
2.3.4.1 验证Key
bMapManager.init(key,MKGeneralListener);
2.3.5 生成地图初图
bMapView = (MapView)findViewById(R.id.mapview);//获取MapView指针
bMapView.setBuiltInZoomControls(true);//使用内置缩放器
//设置视图
MapController mapcontroller = bmapView.getController();
GeoPointptCenter = new GeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
mapcontroller.setCenter(ptCenter);//设置地图中心点
mapcontroller.setZoom(12);//设置缩放级别
2.4 查询
百度地图查询使用MKSearch进行异步查询。查询结果在MKSearchListener处理。查询完成之后使用destroy释放。
2.4.1 POI查询
2.5 Overlay
指地图之上的所有图层。
增加/删除步骤:
1) 获取Overlay列表:mapview.getOverlays();
2) 修改列表。
3) 刷新显示:mapview.refresh();
2.5.1 GraphicsOverlay
用于绘制点、线、面等几何图形。
public void showPolyline(String[] polyline)
{
//生成地理点数组
GeoPoint[] pts = new GeoPoint[polyline.length];
for(int i = 0; i < polyline.length; i++)
{
String strPt = polyline[i];
String[] ptXY = strPt.split(",");
double[] dPt = {Double.parseDouble(ptXY[0]),Double.parseDouble(ptXY[1])};
GeoPoint pt = new GeoPoint((int)(dPt[0]*1E6),(int)(dPt[1]*1E6));
pts[i] = pt;
}
//生成对象
Geometry geoPolyline = new Geometry();
geoPolyline.setPolyLine(pts);
Symbol symbolLine = new Symbol();
Symbol.Color colorLine = symbolLine.new Color(255,255,0,0);//AARRGGBB:AA表示不透明度,如果是0表示全透明,255表示完全不透明
symbolLine.setLineSymbol(colorLine, 5);
Graphic graphicPolyline = new Graphic(geoPolyline, symbolLine);//一定要设置样式,如果使用null,将无法显示
GraphicsOverlay overlayPolyline = new GraphicsOverlay(bmapView);
overlayPolyline.setData(graphicPolyline);
//overlay列表
bmapView.getOverlays().add(overlayPolyline);
//refresh
bmapView.refresh();
}
2.5.2 MyLocationOverlay
2.6 导航
设置导航参数:起止点坐标、起止点名称。
打开百度导航:BaiduMapNavigation.openBaiduMapNavi。
/**
* 打开百度导航。
* 注意:返回后要刷新MapView。
*/
public void showNavigation()
{
GeoPoint ptStart = new GeoPoint((int)(39.945*1E6),(int)(116.404*1E6));
GeoPoint ptEnd = new GeoPoint((int)(0),(int)(0));
NaviPara navipara = new NaviPara();
navipara.startPoint = ptStart;
//navipara.startName = "默认起点:天安门";
navipara.endPoint = ptStart;
//navipara.endName = "保福寺";
try
{
BaiduMapNavigation.openBaiduMapNavi(navipara,this);
}
catch(BaiduMapAppNotSupportNaviException e)
{
e.printStackTrace();
}
}
2.7 定位
2.7.1 申请Key
与百度地图AndroidSDK 可以使用相同的key,申请方式相同(见2.1)。
2.7.2 导入库文件
将liblocSDK4.so复制到项目的libs/armeabi文件夹中。
在libs文件夹下加入jar文件。
在项目属性中java build path->library->add jars添加jar。
2.7.3 声明service组件
在AndroidManifest.xml中声明定位服务组件。
<service android:name=”com.baidu.location.f” android:enabled=”true” android:process=”:remote”/>
2.7.4 声明使用权限
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<uses-permissionandroid:name="android.permission.READ_LOGS"></uses-permission>
3 相关类
3.1 BMapManager
包:com.baidu.mapapi
功能:地图引擎管理器,用于验证Key,开启消息循环,释放资源。
方法:
BMapManager(context):使用应用程序构造。
init(key,MKGeneralListener):验证key,返回网络状态和验证信息。
start()/stop():开启/停止消息循环。
destroy():释放资源。
3.1.1 MKGeneralListener
包:com.baidu.mapapi
功能:检测网络状态。
方法:
onGetNetwWorkState():检测网络状态。
onGetPermissionState():检测授权状态。
3.2 MapView
包:com.baidu.mapapi.map
功能:地图视图,在布局上设置地图视图,并在后台处理地图操作函数。
方法:
setBuiltInZoomControls():使用内置的缩放控制器。
onPause():隐藏时调用。
onResume():显示时调用。
destroy():释放资源。
getController():返回缩放、平移控制器。
setTraffic():显示路况图。
setSatellite():显示卫星图。
showScaleControl():显示比例尺。
setScaleControlPosition(x,y):x,y表示屏幕的像素值,以地图的左上角为原点。
setVisibility():透明度。0:不透明,100:全透明。
getOverlays():获取Overlay列表。
3.3 MapController
包:com.baidu.mapapi.map
功能:地图控制器。用于控制地图的显示、缩放等动作。
3.4 Graphic
包:com.baidu.mapapi.map
功能:图形类。设置图形的坐标和样式(如果不设置样式,则无法显示)。
方法:
getGeometry()/getID()/getSymbol():获取几何元素、ID、样式。
3.5 Geometry
包:com.baidu.mapapi.map
功能:几何图形类。
方法:
setPoint()/setPolyline()/setPolygon()/setEnvelop()/setCircle():设置点、线、面、矩形、圆。
3.6 GeoPoint
包:com.baidu.platform.comapi.basestruct
功能:表示地理坐标点。以微度(10E-6)为单位。
方法:
GeoPoint(纬度,经度):构造,注意参数顺序。
3.7 Symbol
包:com.baidu.mapapi.map
功能:样式类。
方法:
setPointSymbol()/setLineSymbol()/setSurfaceSymbol():设置样式。
3.7.1 Symbol.Color
功能:颜色类。
按照:alpha,R,G,B排列。0~255之间取值。可以使用0xAARRGGBB设置。
3.7.2 Symbol.Stroke
功能:边框类。
可以设置颜色和宽度。
3.8 MKSearch
包:com.baidu.mapapi.search
功能:搜索。
3.9 MKSearchListener
包:com.baidu.mapapi.search
功能:搜索结果通知接口。返回POI、公交、驾乘、步行搜索结果。
方法:
onGetPoiResult():回调POI搜索结果。
OnGetPoiDetailSearchResult():回调POI详细搜索结果。
3.10 MKPoiResult
包:com.baidu.mapapi.search
功能:POI结果类。
3.11 MKPoiInfo
包:com.baidu.com.mapapi.search
功能:POI信息。
3.12 GraphicsOverlay
包:com.baidu.mapapi.map
功能:绘制点、线、面的图层。
方法:
GraphicsOverlay():使用MapView的对象构造。
getAllGraphics():获取所有几何对象列表。
removeAll():删除所有几何对象。
removeGraphic():删除指定几何对象。
setData():添加几何对象。
3.13 BaiduMapNavigation
包:com.baidu.mapapi.navi
功能:调用百度地图进行导航(必须安装百度导航)。
方法:
GetLatestBaiduMapApp(Activity context):打开最新版百度地图APP下载页面。
openBaiduMapNavi(NaviPara para,Activity context):打开百度地图APP。
3.14 NaviPara
包:com.baidu.mapapi.navi
功能:输入百度地图导航的初始导航路径。如果GPS可用,则定位当前位置到终点的导航路径;如果GPS不可用,则使用给定路径的模拟导航。
方法:
startPoint/endpoint:起止点,不可以为空。
startName/endName:起止点名称,可以为空,只用于显示。
3.15 LocationClient
3.16 MyLocationOverlay
包:com.baidu.mapapi.map
功能:用于显示位置点的图层。可以设置位置、指南针、图标。
方法:
MyLocationOverlay(MapView):使用MapView构造。
3.17 LocationData
包:com.baidu.mapapi.map
功能:位置点图层的定位数据。包括GPS速度、方向、卫星数据,以及经纬度。
方法:
注意:这里的经度和纬度都是使用度为单位的double型。
3.18 示例
package com.example.yjtdemo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.Menu;
import android.widget.CheckBox;
import android.widget.FrameLayout;
import android.widget.RadioButton;
import android.widget.Toast;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;
public class MainActivity extends Activity {
BMapManager mBMapMan = null;
MapView mMapView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBMapMan=new BMapManager(getApplication());
mBMapMan.init("wo0msZa5DUTBSgOAUXFa9csP", null);
//注意:请在试用setContentView前初始化BMapManager对象,否则会报错
setContentView(R.layout.activity_main);
mMapView=(MapView)findViewById(R.id.bmapsView);
mMapView.setBuiltInZoomControls(true);
//设置启用内置的缩放控件
MapController mMapController=mMapView.getController();
// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404*1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 *1E6)
mMapController.setCenter(point);//设置地图中心点
mMapController.setZoom(12);//设置地图zoom级别
}
public void loadSatelliteMap(View v)
{
CheckBox cb = (CheckBox)v;
boolean bCheck = cb.isChecked();
cb.setChecked(bCheck);
mMapView.setSatellite(bCheck);
}
public void loadCommunicateMap(View v)
{
CheckBox cb = (CheckBox)v;
boolean bCheck = cb.isChecked();
cb.setChecked(bCheck);
mMapView.setTraffic(bCheck);
mMapView.showScaleControl(bCheck);
mMapView.setScaleControlPosition(10, 100);
mMapView.setVisibility(0);
GeoPoint ptCenter = mMapView.getMapCenter();
int iLat = ptCenter.getLatitudeE6();
ptCenter.setLatitudeE6(iLat + 1000000);
MapController mController = mMapView.getController();
mController.setCenter(ptCenter);
mController.animateTo(ptCenter);
}
@Override
protected void onDestroy(){
mMapView.destroy();
if(mBMapMan!=null){
mBMapMan.destroy();
mBMapMan=null;
}
super.onDestroy();
}
@Override
protected void onPause(){
mMapView.onPause();
if(mBMapMan!=null){
mBMapMan.stop();
}
super.onPause();
}
@Override
protected void onResume(){
mMapView.onResume();
if(mBMapMan!=null){
mBMapMan.start();
}
super.onResume();
}
}
4 Android基础
4.1 Activity生命周期
4.1.1 活动状态
onCreate():首次启动Activity时,使用NULL作为参数。结束后重新打开,使用Bundle恢复。Activity重建时。
4.1.2 Destory状态:activity释放
onDestroy():Activity释放资源时。
4.1.3 Stop状态:activity被其它activity隐藏
onStart():激活时。
onStop():退出时。
onRestart():重新启动。
4.1.4 Pause状态:被通知等隐藏,但仍可见
onPause():当前Activity被覆盖时。
OnResume():pause之后重新显示。
4.1.5 状态保存
onSaveInstanceState():保存状态Bundle。
OnRestoreInstanceState():恢复状态Bundle。
4.2 Activity消息传递
使用Intent传递消息,包括动作和参数。
4.3 启动Activity
startActivity():启动活动。
startActivityForResult():启动活动,完成后回调onActivityResult()。