最近碰到一个跟地图有关系的业务,很早之前到是用过百度地图还是1.x 今天去用发现已经不能使用了,查看百度API发现已经都改了,到网上去查新版的地图使用结果
发现全部都是以前的版本,看来想偷懒是不可能,只能自己去看文档来写了。
官方的文档:http://developer.baidu.com/map/index.php 根据需要去下载对应的SDK(我这里只用地图和定位)
根据官方的开发步骤,在自己的工程里 导入需要的jar文件和so文件即可。
同时需要申请key,具体过程请看官方指导很详细,这里就不再啰嗦。
今天要完成的功能是定位和实现在地图上的线路规划(步行)
1 定位:
布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="步行线路"
android:onClick="start_line"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定位"
android:onClick="start_location"
/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/padding_medium"
android:text="@string/hello_world"
/>
</LinearLayout>
<!-- 引入百度地图组件 参考官方例子-->
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</LinearLayout>
根据需要就直接在界面上加入了百度的地图组件 MapView .
先说明下我们会使用到的几个东西:
private MapView baidum = null ;//地图显示组件
private BaiduMap mBaiduMap = null ;//百度地图对象
private LocationClient locationc = null ;//定位客户端
private boolean isFirstLoc = true ;//是否是第一次定位
private RoutePlanSearch mSearch =null ; //poi搜索(步行规划需要)
//还需要对应的定位监听和步行规划监听 2个对象,在后面给出
private BDLocationListener location_listener = null;//定位监听
下面给出代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//
baidum = (MapView)findViewById(R.id.bmapView);
mBaiduMap = baidum.getMap();//获取地图对象
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
locationc = new LocationClient(this);
location_listener = new MyLocationListener();//定位监听实现类
locationc.registerLocationListener(location_listener);//注册监听
}
默认一开始地图会显示京城为默认显示地图,所以这里我用一个按钮来切换到当前自己的 位置:
public void start_location(View v){
//按钮事件
LocationClientOption option = //定位参数设置,参考官方
new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(5*60*1000);//定位的频率(ms)
locationc.setLocOption(option);
locationc.start();//开始定位,定位成功会回调监听
}
监听对象的实现,需要实现定位监听接口:
class MyLocationListener implements BDLocationListener{
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null || baidum == null){
return;
}
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(0).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
mBaiduMap.setMyLocationData(locData);
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
//设置定位显示模式为:跟随(会有个箭头)、普通、指南针三种
mBaiduMap.setMyLocationConfigeration(
new MyLocationConfiguration(LocationMode.FOLLOWING,true,null));
MapStatusUpdate u1 = MapStatusUpdateFactory.zoomTo(17);//定位目标时放到到17倍
mBaiduMap.setMapStatus(u1);
//
MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);//定位到的坐标
mBaiduMap.animateMapStatus(u);//动画显示到目标位置,也就是自己的手机所在地
}
TextView tv = (TextView)findViewById(R.id.tv);
tv.setText("经纬度:"+location.getLongitude() + " : " + location.getLatitude());
}
}
部署到手机,运行,打开GPS和网络 基本就可以实现了(注意,需要在清单里加入所必须的内容和所需的权限在后面给出,如果是空白网格 key错误的可能性比较大)
下面给出步行规划的实现(按钮完成):
public void start_line(View v){
//参考官方包: com.baidu.mapapi.search.route
mSearch = RoutePlanSearch.newInstance();//实例化 路径规划搜索接口
mSearch.setOnGetRoutePlanResultListener(rlistener);//规划监听
WalkingRoutePlanOption option = new WalkingRoutePlanOption() ;//步行规划对象
PlanNode start = PlanNode.withCityNameAndPlaceName("长沙", "林科大"); //起点
PlanNode end = PlanNode.withCityNameAndPlaceName("长沙", "五一广场");//终点
option.from(start);
option.to(end);
if(mSearch.walkingSearch(option)){
Toast.makeText(getApplicationContext(), "步行线路完成", Toast.LENGTH_SHORT).show();
}
}
路径搜索监听:
OnGetRoutePlanResultListener rlistener = new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult result) {
//步行规划结果
List<WalkingRouteLine> all_lines = result.getRouteLines();
if(all_lines!=null){
for(WalkingRouteLine line : all_lines){
//步行规划覆盖层:
WalkingRouteOverlay wo = new WalkingRouteOverlay(mBaiduMap);
wo.setData(line);
wo.addToMap();//添加到地图
wo.zoomToSpan();//缩放到合适大小显示整个线路
}
}
}
@Override
public void onGetTransitRouteResult(TransitRouteResult arg0) {
//公交
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult arg0) {
//驾车
}
};
到此已经能完整的显示结果了。
附权限(都可以从官网上提示获取):
<!-- 这个权限用于进行网络定位-->
<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.ACCESS_GPS" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
需要在清单里写的内容(详情参考官方说明):
在<application>里写入:
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="你自己程序的key" />
还有这个:
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />
Ok。去试试吧!小东西,大神无视吧……