本文属于原创作品,转载请注明出处。
数据库课设做了一个Android端的外面平台,包括顾客端、骑手端、商家端和后台审核端四个客户端。
然后想给骑手做一个路线导航的功能,能够自动规划自己当前位置到顾客或者商家的路线。
这里调用了百度地图的API。
以下是具体内容。
下载百度地图SDK
上百度地图官网下载,下载时建议把示例代码也下载下来,里面有些文件之后可以用到。
配置AndroidStudio
具体配置过程可以参看这篇博客
源代码
找到之前下载的示例代码中的assets文件夹,将它复制到src/main目录下,这个文件夹里面含有百度地图路线规划的图片素材,当然也可以自定义使用。
然后,将示例代码中的DrivingRouteOverlay.java和OverlayManager.java复制过来
接下来是源代码,这里以驾车路线规划作为展示:
activity_map.xml
MapActivity.java
/**
* 百度地图定位与导航
* Created by Administrator on 2018/9/30 0030.
*/
public class MapActivity extends BaseActivity {
private MapView mMapView;
private LocationClient locationClient;
private BaiduMap baiduMap;
private boolean firstLocation;
private RoutePlanSearch mySearch;
private ImageView back;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//此方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_map);
back = findViewById(R.id.back);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
mMapView = findViewById(R.id.map);
baiduMap = mMapView.getMap();
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15f);
baiduMap.setMapStatus(msu);
// 定位初始化
locationClient = new LocationClient(this);
firstLocation =true;
// 设置定位的相关配置
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setOpenGps(true);
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1000);
locationClient.setLocOption(option);
locationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mMapView == null)
return;
// 构造定位数据
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置定位数据
baiduMap.setMyLocationData(locData);
// 第一次定位时,将地图位置移动到当前位置
if (firstLocation)
{
firstLocation = false;
//手机定位到的当前位置
LatLng xy = new LatLng(location.getLatitude(),
location.getLongitude());
mySearch = RoutePlanSearch.newInstance();
mySearch.setOnGetRoutePlanResultListener(listener);
PlanNode stNode = PlanNode.withLocation(xy);
//目的位置
PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", "天安门广场");
//驾车路线规划
mySearch.drivingSearch((new DrivingRoutePlanOption())
.from(stNode)
.to(enNode));
mySearch.destroy();
MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(xy);
baiduMap.animateMapStatus(status);
}
}
});
}
@Override
protected void onStart()
{
// 如果要显示位置图标,必须先开启图层定位
baiduMap.setMyLocationEnabled(true);
if (!locationClient.isStarted())
{
locationClient.start();
}
super.onStart();
}
@Override
protected void onStop()
{
// 关闭图层定位
baiduMap.setMyLocationEnabled(false);
locationClient.stop();
super.onStop();
}
@Override
protected void onDestroy()
{
super.onDestroy();
// 在activity执行onDestroy时执行mMapView.onDestroy()
mMapView.onDestroy();
mMapView = null;
}
@Override
protected void onResume()
{
super.onResume();
// 在activity执行onResume时执行mMapView. onResume ()
mMapView.onResume();
}
@Override
protected void onPause()
{
super.onPause();
// 在activity执行onPause时执行mMapView. onPause ()
mMapView.onPause();
}
OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() {
//获取步行线路规划结果
@Override
public void onGetWalkingRouteResult(WalkingRouteResult result) {
}
//获取综合公共交通线路规划结果
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
}
//获取**跨城**综合公共交通线路规划结果
@Override
public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) {
}
//获取驾车线路规划结果
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MapActivity.this, "抱歉,未找到结果"+drivingRouteResult.error, Toast.LENGTH_SHORT).show();
Log.e("error",""+drivingRouteResult.error.toString());
}
if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
drivingRouteResult.getSuggestAddrInfo();
return;
}
if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
if (drivingRouteResult.getRouteLines().size() >= 1) {
DrivingRouteOverlay overlay = new DrivingRouteOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
overlay.setData(drivingRouteResult.getRouteLines().get(0));
overlay.addToMap();
overlay.zoomToSpan();
} else {
Log.d("route result", "结果数<0");
return;
}
}
}
//室内路线规划结果
@Override
public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) {
}
//获取普通骑行路规划结果
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MapActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
}
if (bikingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
// 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
bikingRouteResult.getSuggestAddrInfo();
return;
}
if (bikingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
if (bikingRouteResult.getRouteLines().size() >= 1) {
BikingRouteOverlay overlay = new BikingRouteOverlay(baiduMap);
baiduMap.setOnMarkerClickListener(overlay);
overlay.setData(bikingRouteResult.getRouteLines().get(0));//设置路线数据
overlay.addToMap();
overlay.zoomToSpan();
} else {
Log.d("route result", "结果数<0");
return;
}
}
}
};
}
但是我也试过骑行路线规划,不知道为什么骑行路线的搜索结果数量时钟为0,如果有哪位大佬知道原因的请评价告知一下,在此万分感谢!