该文章中百度地图基本操作如下:
* 普通地图和卫星地图切换
* 设置/删除覆盖物(即地图上的标注),并设置可拖动及监听
* 开启/关闭交通图
* POI检索
1.配置
首先需要在百度API端,建立自己的应用:
其中安全码为:数字签名+包名的组合,之后就可以建立应用
其中红色部分就是地图的key,该值需要配置到app应用的清单文件中。如下:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="上面的key值" />
</application>
之后添加必要的使用权限:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_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.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
接着就可以在Activity中使用百度应用了。
2.使用
我们可以在布局文件中通过如下代码定义一个百度地图:
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" >
</com.baidu.mapapi.map.MapView>
其他可以根据情况自定义布局。
注:在setContentView()方法调用前,需要通过
SDKInitializer.initialize(getApplicationContext());
来加载刚刚配置的key,之后才可以使用。
之后在Activity的setContentView()后获取该MapView对象。
同样,我们也可以通过MapView.getMap()方法获取BaiduMap类对象,我们可以在该对象中对百度地图进行配置操作。
也可以直接运行就可以显示地图了
3.设置地图参数
在上个百度的版本中,配置地图参数是通过mapview.getcontroller()的方式获取MapController对象并操作完成的。
而现在,没有该方法。需要通过MapView.getMap()方法获取BaiduMap对象,获取地图控制器。
例子:
//开启交通图
mBaiduMap.setTrafficEnabled(true);
//设置显示风格,两个可选值:BaiduMap.MAP_TYPE_NORMAL 普通 ,BaiduMap.MAP_TYPE_SATELLITE 卫星
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
设置地图中心点:
// 修改显示位置,使得能够显示查询结果。
// 设定中心点坐标
LatLng cenpt = new LatLng(lng.latitude, lng.longitude);
// 定义地图状态
MapStatus mMapStatus = new MapStatus.Builder().target(cenpt)
.zoom(12).build();
// 定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(mMapStatus);
// 改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
具体操作,参见百度API。
4.遮盖物(OverLay)
所谓的遮盖物就是在地图上画一些如标记,文字,路线等信息。大多数的Overlay都是继承自OverlayOptions,所以直接创建该类的子类即可。
下面给出例子:
//定义Maker坐标点
LatLng point = new LatLng(39.963175, 116.400244);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point) //设置marker的位置
.icon(bitmap) //设置marker图标
.zIndex(9) //设置marker所在层级
.draggable(true); //设置手势拖拽
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
以上代码是在地图的(39.963175, 116.400244)位置显示一个标记,该标记的配置可以通过option.XXX的方式进行配置。在配置完成后,需要通过
mBaiduMap.addOverlay(option);
方法,把其添加到地图中。
需要注意的是: mBaiduMap.addOverlay(option);方法返回的是Overlay对象,我们可以通过remove(),setInvisible(),getExtraInfo()等方法,控制该遮盖物。
如删除该遮盖物,可以通过:
Overlay.remove()的方式进行。
5. 搜索功能
百度地图提供了多种搜索功能,如POI检索、公交信息查询、线路规划、地理编码、在线建议查询、短串分享。
以下是搜索所在的包:
我以POI搜索为例,POI的全称是Point of Interest,即兴趣点搜索。
我们可以通过搜索,如福建超市的方式,获取到符合搜索条件的地点。也可以指定在某个范围内,如半径1公里内。
例子如下:
// 第一步,创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
// 第二步,创建POI检索监听者;
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
public void onGetPoiResult(PoiResult result) {
// 在此,处理监听结果,如添加覆盖物,获取地点信息等。
// 如:获取POI检索结果
List<PoiInfo> allPoi = result.getAllPoi();
PoiInfo poiInfo = allPoi.get(0);
LatLng lng = poiInfo.location;
// 修改显示位置,使得能够显示查询结果。
// 设定中心点坐标
LatLng cenpt = new LatLng(lng.latitude, lng.longitude);
// 定义地图状态
MapStatus mMapStatus = new MapStatus.Builder().target(cenpt)
.zoom(12).build();
// 定义MapStatusUpdate对象,以便描述地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
.newMapStatus(mMapStatus);
// 改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate);
}
public void onGetPoiDetailResult(PoiDetailResult result) {
// 获取Place详情页检索结果
}
};
// 第三步,设置POI检索监听者;
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
// 第四步,发起检索请求;
/**
*
* @param place 查询地点
* @param radius 查询半径
* @param pageCapacity 每页条数
* @param pageNum 页数
*/
public void searchNearBy(String place,int radius,int pageCapacity,int pageNum){
LatLng lnt = new LatLng(39.963175, 116.400244);
// radius - 检索半径 单位: m
PoiNearbySearchOption option = new PoiNearbySearchOption()
.keyword(place).location(lnt).pageCapacity(pageCapacity).pageNum(pageNum)
.radius(radius);
mPoiSearch.searchNearby(option);
}
调用上述方法,如:
searchNearBy(“超市”,1000,10,1);
即获取(39.963175, 116.400244)周围半径1000m内的10家超市,这10家排名在第二页。(第一页则最后传入参数为0)。
同理,我们也可以把LatLng作为参数传递,这样就可以指定在不定位置内的兴趣点位置。