百度地图的使用
API地址 http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v4_2_0/index.html
百度地图平台 http://lbsyun.baidu.com/
准备工作
获取API Key
建立工程
添加地图引擎到android工程
添加权限
<!-- 这个权限用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 这个权限用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 用于读取手机当前的状态--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 访问网络,网络定位需要上网--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡读取权限,用户写入离线定位数据--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!--允许应用读取低级别的系统日志文件 --> <uses-permission android:name="android.permission.READ_LOGS"/>
初始化地图引擎
在清单文件中,在中的添加key
<application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="开发者 key" /> </application>
必须在setContentView之前,校验key。
注意:在SDK各功能组件使用之前都需要调用
SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initSdk(); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } }
initSdk()
//在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); //注册广播接收者,接受校验key的通知 IntentFilter filter = new IntentFilter(); filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); registerReceiver(new MyReceiver(), filter);
广播接收者 MyReceiver
//广播接收者 class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) { Toast.makeText(context, "网络出问题了", Toast.LENGTH_SHORT).show(); } else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) { Toast.makeText(context, "key校验失败", Toast.LENGTH_SHORT).show(); } } }
引入布局 com.baidu.mapapi.MapView
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" />
初始化地图设置
在setContentView(R.layout.hello)之后,初始化地图设置
initSdk();//初始化SDK setContentView(R.layout.hello); init();//初始化地图设置
init()
init(){ //去掉缩放按钮 mapView.showZoomControls(false); //去掉标尺 mapView.showScaleControl(false); //设置缩放级别 //2.X版本 3~19级 3D效果,优化占用空间 //1.X版本 3~18级 // BaiduMap 用于控制MapView 移动、旋转、缩放 BaiduMap baiduMap = mMapView.getMap(); baiduMap.setMapStatus(MapStatusUpdataFactory.zoomTo(19));//默认是1级 //设置中心点,参数是经纬度 baiduMap.setMapStatus(MapStatusUpdataFactory.newLatLng(new LatLng(111111,1111111))); }
管理地图生命周期
@Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); }
地图相关操作
基本操作
放大
baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
缩小
baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
旋转
平面旋转,以中间为中心旋转,范围0~360度
//设置平面旋转 //获取当前地图对象的旋转角度 float rotate = baiduMap.getMapStatus().rotate; //设置对象旋转的角度 MapStatus rotateStatus = new MapStatus.Builder().rotate(rotate + 30).build(); //将设置的角度设置给地图对象 baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(rotateStatus));
俯角旋转 ,范围0~45度
//设置俯角旋转 //获取当前地图对象的俯角 float overlook = baiduMap.getMapStatus().overlook; //设置对象旋转的角度 MapStatus overlookStatus = new MapStatus.Builder().overlook(overlook -15).build(); //将设置的俯角设置给地图对象 baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(overlookStatus));
移动
baiduMap.animateMapStatus(MapStatusUpdataFactory.newLatLng(new LatLng(22222222,22222222)));
图层分类
底图
//展示底图 baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
卫星图
//展示卫星图 baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
交通图
//展示交通图 baiduMap.setTrafficEnabled(true);
覆盖物
–本地覆盖物的抽象基类:OverlayOptions(核心类)
–圆形覆盖物: CircleOptions
创建圆形: CircleOptions() 。
设置圆心坐标:center(LatLng center)
设置圆填充颜色:fillColor(int color) ,16进制如:#00ff0000 透明、红、绿、蓝
设置圆半径:radius(int radius)
设置圆边框信息:stroke(Stroke stroke)
设置圆是否可见:visible(boolean visible)
设置圆zIndex(显示优先级)信息:zIndex(int zIndex),值越大优先级越高
–文字覆盖物: TextOptions
创建文字覆盖物对象, TextOptions()
设置文字覆盖物地理坐标:position(LatLng position)
设置文字覆盖物旋转角度,逆时针:rotate(float rotate)
设置文字覆盖物的文字内容:text(java.lang.String text)
设置文字覆盖物字体:typeface(Typeface typeface)
设置文字覆盖物可见性:visible(boolean visible)
设置文字覆盖物 zIndex:zIndex(int zIndex)
设置文字覆盖物对齐方式,默认居中对齐:align(int alignX, int alignY)
设置文字覆盖物背景颜色:bgColor(int bgColor)
设置文字覆盖物额外信息:extraInfo(Bundle extraInfo)
设置文字覆盖物字体颜色,默认黑色:fontColor(int color)
设置文字覆盖物字体大小:fontSize(int size)
–marker覆盖物: MarkerOptions
某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类。或者用来标记位置某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类。或者用来标记位置
设置 marker 覆盖物的位置坐标:position(LatLng position)
设置 marker 覆盖物的标题:title(java.lang.String title)
设置 Marker 覆盖物的图标:icon(BitmapDescriptor icon)
设置 marker 是否允许拖拽,默认不可拖拽:draggable(boolean draggable)
–圆点覆盖物:DotOptions
–ground覆盖物:GroundOverlayOptions
–多边形覆盖物:PolygonOptions
–折线覆盖物:PolylineOptions
–弧线覆盖物:ArcOptions
创建一个类BaseActivity继承基类Activity,初始化地图引擎(也可以不抽取父类,直接在第二步中初始化引擎)
public class BaseActivity extends Activity { @InjectView(R.id.mapview) MapView mapview; LatLng latLng = new LatLng(39.995685, 116.364061); private BaiduMap baiduMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //初始化引擎 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_common); ButterKnife.inject(this); baiduMap = mapview.getMap(); baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(latLng)); } //管理地图对象的生命周期 @Override protected void onResume() { super.onResume(); mapview.onResume(); } @Override protected void onPause() { super.onPause(); mapview.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapview.onDestroy(); } }
创建类继承BaseActivity
public class MarkerOptionsDemo extends BaseActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ondraw(); }
draw()
private void draw(){ MarkerOptions option = new MarkerOption();//创建覆盖物对象 ...//覆盖物的其他设置 baiduMap.addOverlay(option);//将覆盖物设置在地图上 }
搜索
核心类: PoiSearch和OnGetPoiSearchResultListener
RoutePlanSearch和OnGetRoutePlanResultListener
实现思路
–初始化PoiSearch类,通过setOnGetPoiSearchResultListener方法注册搜索结果的监听对象OnGetPoiSearchResultListener ,实现异步搜索服务。
–通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。
–注意, OnGetPoiSearchResultListener只支持一个,以最后一次设置为准
结合覆盖物展示搜索
–本地搜索覆盖物:PoiOverlay
–驾车路线覆盖物:DrivingRouteOverlay
–步行路线覆盖物:WalkingRouteOverlay
–换乘路线覆盖物:TransitOverlay
POI(Point of interest兴趣点) 三种搜索方式
根据范围和检索词发起范围搜索 searchInBound
周边检索 searchNearby
城市poi检索 searchInCity
poi 详细信息检索 searchPoiDetail
- 创建一个类继承BaseActivity,创建search()方法;
public class SearchInBoundDemo extends BaseActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); search(); }
- search();
private void search() { //创建PoiSerch实例 PoiSearch poiSearch = PoiSearch.newInstance(); //设置poi检索监听者 poiSearch.setOnGetPoiSearchResultListener(new MyListener()); //创建范围搜索PoiBoundSearchOption对象 PoiBoundSearchOption option = new PoiBoundSearchOption(); //设置搜索内容 option.keyword("公交"); //设置搜索范围对象 LatLngBounds bound = new LatLngBounds.Builder() .include(new LatLng(40.107704,116.375825)) //设置搜索范围坐标 .include(new LatLng(40.103565,116.370292)) //设置搜索范围坐标 .build(); //创建搜索范围对象 //设置搜索范围 option.bound(bound); //将搜索设置赋给PoiSearch对象 poiSearch.searchInBound(option); }
返回结果
class MyListener implements OnGetPoiSearchRestultListener{ //poi 查询结果回调 @Override public void onGetPoiResult(PoiResult poiResult) { //如果没有数据,弹出吐司 if (poiResult == null || poiResult.error.equals("SearchResult.ERRORNO.RESULT_NOT_FOUND")) { Toast.makeText(SearchInBoundDemo.this, "没有数据", Toast.LENGTH_SHORT).show(); return; } //创建覆盖物对象 MyPoiOverLay poiOverLay = new MyPoiOverLay(baiduMap); //将事件传递给覆盖物 baiduMap.setOnMarkerClickListener(poiOverLay); //设置数据 poiOverLay.setData(poiResult); //展示到地图 poiOverLay.addToMap(); } //poi 详情查询结果回调 @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } }
创建覆盖物类,重写onPoiClick()方法,设置点击事件
private class MyPoiOverLay extends PoiOverlay{ public MyPoiOverLay(BaiduMap baiduMap) { super(baiduMap); } //设置点击事件 @Override public boolean onPoiClick(int i) { //根据当前点击位置,获取当前覆盖物 PoiInfo poiInfo = getPoiResult().getAllPoi().get(i); //弹出吐司提示 Toast.makeText(SearchInBoundDemo.this, poiInfo.address, Toast.LENGTH_SHORT).show(); return true; } }
路线搜索(驾车为例)
创建一个类继承BaseActivity,在onCreate方法中创建search()方法;
“`java
public class SearchInBoundDemo extends BaseActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);search(); }
“`
search();
“`java
private void search() {//创建路线搜索对象 RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance(); //设置检索监听者 routePlanSearch.setOnGetRoutePlanResultListener(new MyListener()); //创建驾车路线规划参数 DrivingRoutePlanOption option = new DrivingRoutePlanOption(); //设置驾车路线策略 option.policy(DrivingRoutePlanOption.DrivingPolicy.ECAR_FEE_FIRST);
// ECAR_AVOID_JAM
// 驾车策略: 躲避拥堵
// ECAR_DIS_FIRST
// 驾乘检索策略常量:最短距离
// ECAR_FEE_FIRST
// 驾乘检索策略常量:较少费用
// ECAR_TIME_FIRST
// 驾乘检索策略常量:时间优先//设置出行开始节点 PlanNode start = PlanNode.withLocation(latLng); option.from(start); //设置结束节点 PlanNode end = PlanNode.withCityNameAndPlaceName("北京", "天安门"); option.to(end); //设置途经点 //创建集合,用于存储途经点 ArrayList<PlanNode> list = new ArrayList<>(); list.add(PlanNode.withLocation(new LatLng(39.917661,116.215064))); option.passBy(list); //将参数设置给路线搜索对象 routePlanSearch.drivingSearch(option); }
“`
搜索结果处理
“`java
private class MyListener implements OnGetRoutePlanResultListener {
//步行路线结果
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {} //公交换乘路线结果 @Override public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) { } //驾车路线结果 @Override public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) { if(drivingRouteResult==null||drivingRouteResult.error.equals(SearchResult.ERRORNO.RESULT_NOT_FOUND)){ Toast.makeText(DrivingSearchDemo.this, "没有数据", Toast.LENGTH_SHORT).show(); return; } DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(baiduMap); // 给覆盖物传递事件 baiduMap.setOnMarkerClickListener(drivingRouteOverlay); drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(0)); drivingRouteOverlay.addToMap(); drivingRouteOverlay.zoomToSpan(); } }
“`
定位
配置清单文件
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
定位
public class MyLocationDemo extends BaseActivity{ public LocationClient mLocationClient = null; public BDLocationListener myListener = new MyListener(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); location(); } private void location() { //创建定位服务客户端对象 mLocationClient = new LocationClient(this); //注册定位监听函数 mLocationClient.registerLocationListener(myListener); //配置定位参数 LocationClientOption option = new LocationClientOption(); //设置定位模式,可选,高精度,低功耗,仅设备,默认高精度 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //设置坐标类型 option.setCoorType("bd09ll"); //设置扫描间隔,可选,默认0,即仅定位一次 int span = 1000; option.setScanSpan(span); //设置是否需要地址信息,默认为无地址 option.setIsNeedAddress(true); //可选,默认false,设置是否使用gps option.setOpenGps(true); //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setLocationNotify(true); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.setIgnoreKillProcess(false); //可选,默认false,设置是否收集CRASH信息,默认收集 option.SetIgnoreCacheException(false); //将参数配置设置给定位服务端 mLocationClient.setLocOption(option); //设置定位的展示模式 BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, icon); baiduMap.setMyLocationConfigeration(config);
}
@Override
protected void onStart() {
super.onStart();
//开始定位
mLocationClient.start();
}@Override
protected void onPause() {
super.onPause();
//停止定位
mLocationClient.stop();
}private class MyListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//展示定位结果
MyLocationData data = new MyLocationData.Builder()
.latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude())
.build();// 打开定位图层 baiduMap.setMyLocationEnabled(true); //设置定位数据, 只有先允许定位图层后设置数据才会生效 baiduMap.setMyLocationData(data); }
}
}public class MyLocationDemo extends BaseActivity{public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyListener();@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);location();
}
private void location() {
//创建定位服务客户端对象
mLocationClient = new LocationClient(this);
//注册定位监听函数
mLocationClient.registerLocationListener(myListener);//配置定位参数 LocationClientOption option = new LocationClientOption(); //设置定位模式,可选,高精度,低功耗,仅设备,默认高精度 option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //设置坐标类型 option.setCoorType("bd09ll"); //设置扫描间隔,可选,默认0,即仅定位一次 int span = 1000; option.setScanSpan(span); //设置是否需要地址信息,默认为无地址 option.setIsNeedAddress(true); //可选,默认false,设置是否使用gps option.setOpenGps(true); //可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setLocationNotify(true); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死 option.setIgnoreKillProcess(false); //可选,默认false,设置是否收集CRASH信息,默认收集 option.SetIgnoreCacheException(false); //将参数配置设置给定位服务端 mLocationClient.setLocOption(option); //设置定位的展示模式 BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, icon); baiduMap.setMyLocationConfigeration(config);
}
@Override
protected void onStart() {
super.onStart();
//开始定位
mLocationClient.start();
}@Override
protected void onPause() {
super.onPause();
//停止定位
mLocationClient.stop();
}private class MyListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//展示定位结果
MyLocationData data = new MyLocationData.Builder()
.latitude(bdLocation.getLatitude())
.longitude(bdLocation.getLongitude())
.build();// 打开定位图层 baiduMap.setMyLocationEnabled(true); //设置定位数据, 只有先允许定位图层后设置数据才会生效 baiduMap.setMyLocationData(data); }
}
}