分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04 一、简介 线路规划支持以下功能: 公交信息查询:可对公交详细信息进行查询; 公交换乘查询:根据起、终点,查询策略,进行线路规划方案; 驾车线路规划:提供不同策略,规划驾车路线;(支
分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04
一、简介
线路规划支持以下功能:
公交信息查询:可对公交详细信息进行查询;
公交换乘查询:根据起、终点,查询策略,进行线路规划方案;
驾车线路规划:提供不同策略,规划驾车路线;(支持设置途经点)
步行路径检索:支持步行路径的规划。
其中驾车线路规划自v3.4.0版本起支持多线路检索结果的能力。
二、运行截图
简介:介绍公交、驾车和步行三种线路规划方法和自设路线方法。
详述:
(1)驾车查询新增路径点查询功能,具体使用方法详见开发者指南路径规划部分,只需重载接口;
(2)自设路线功能演示开发者如何自己设定一条路线,包括如何设定起点、终点、途径站点和路段;
(3)自设路线功能同时也介绍如何在两个Activity之间切换的时候管理Mapview的生命周期;
(4)可自定义路线的起终点图标;
本示例运行截图如下:
三、设计步骤
1、添加自定义类【代码太多,就不再粘贴在这里了】
本示例用到的文件很多,主要涉及的是自定义覆盖物的相关类,这些文件都在SrcOverlayUtil文件夹下,除了上一节列出的OverlayManager.cs文件和PoiOverlay.cs外,还包括下面的文件。
(1)BikingRouteOverlay.cs文件
用于显示骑行路线的Overlay,自3.4.0版本起可实例化多个添加在地图中显示。
(2)BusLineOverlay.cs文件
用于显示一条公交详情结果的Overlay。
(3)DrivingRouteOverlay.cs文件
用于显示一条驾车路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示,当数据中包含路况数据时,则默认使用路况纹理分段绘制。
(4)TransitRouteOverlay.cs文件
用于显示换乘路线的Overlay,自3.4.0版本起可实例化多个添加在地图中显示。
(5)WalkingRouteOverlay.cs文件
用于显示步行路线的overlay,自3.4.0版本起可实例化多个添加在地图中显示。
2、添加demo13_routeplan.xml文件
在layout文件夹下添加该文件,然后将代码改为下面的内容:
xml version="1.0" encoding="utf-8"?>
EditText>
LinearLayout>
EditText>
LinearLayout>
LinearLayout>
LinearLayout>
LinearLayout>
RelativeLayout>
LinearLayout>
3、添加Demo13RoutePlan.cs文件
在SrcSdkDemos文件夹下添加该文件,然后将代码改为下面的内容:
usingAndroid.App;usingAndroid.Content.PM;usingAndroid.OS;usingAndroid.Views;usingAndroid.Widget;usingCom.Baidu.Mapapi.Map;usingCom.Baidu.Mapapi.Model;usingCom.Baidu.Mapapi.Search.Core;usingCom.Baidu.Mapapi.Search.Route;usingBdMapV371Demos.SrcOverlayUtil;namespaceBdMapV371Demos.SrcSdkDemos
{///
///此demo用来展示如何进行驾车、步行、公交路线搜索并在地图使用RouteOverlay、TransitOverlay绘制,///同时展示如何进行节点浏览并弹出泡泡。///
[Activity(Label = "@string/demo_name_route",
ConfigurationChanges= ConfigChanges.Orientation |ConfigChanges.KeyboardHidden,
ScreenOrientation=ScreenOrientation.Sensor)]public classDemo13RoutePlan : Activity
{//浏览路线节点相关
Button btnPre = null;//上一个节点
Button btnNext = null;//下一个节点
int nodeIndex = -2;//节点索引,供浏览节点时使用
RouteLine route = null;
OverlayManager routeOverlay= null;bool useDefaultIcon = false;private TextView popupText = null;//泡泡view//地图相关,使用MyRouteMapView目的是重写touch事件实现泡泡处理。//如果不处理touch事件,则无需继承,直接使用TextureMapView即可。
TextureMapView mMapView = null; //地图View
BaiduMap mBaidumap = null;//搜索相关
RoutePlanSearch mSearch = null; //搜索模块,也可去掉地图模块独立使用
protected override voidOnCreate(Bundle savedInstanceState)
{base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.demo13_routeplan);//初始化地图
mMapView = FindViewById(Resource.Id.map);
mBaidumap=mMapView.Map;
btnPre= FindViewById(Resource.Id.pre);
btnNext= FindViewById(Resource.Id.next);
btnPre.Visibility=ViewStates.Invisible;
btnNext.Visibility=ViewStates.Invisible;//处理地图点击事件
mBaidumap.MapClick += (s, e) =>{//LatLng point = e.P0;//Toast.MakeText(this, point.ToString(), ToastLength.Long).Show();
mBaidumap.HideInfoWindow();
};//--begin--初始化搜索模块,注册处理事件
mSearch =RoutePlanSearch.NewInstance();//处理驾车搜索结果
mSearch.GetDrivingRouteResult += (s, e) =>{var result =e.P0;if (result == null || result.Error !=SearchResult.ERRORNO.NoError)
{
Toast.MakeText(this, "抱歉,未找到结果", ToastLength.Short).Show();
}if (result.Error ==SearchResult.ERRORNO.AmbiguousRoureAddr)
{//起终点或途经点地址有岐义,通过result.SuggestAddrInfo属性获取建议查询信息//......
return;
}if (result.Error ==SearchResult.ERRORNO.NoError)
{
nodeIndex= -1;
btnPre.Visibility=ViewStates.Visible;
btnNext.Visibility=ViewStates.Visible;
route= result.RouteLines[0];
DrivingRouteOverlay overlay= new MyDrivingRouteOverlay(this, mBaidumap);
routeOverlay=overlay;
mBaidumap.MarkerClick+= (sender, args) =>{//......
};
overlay.SetData(result.RouteLines[0]);
overlay.AddToMap();
overlay.ZoomToSpan();
}
};//处理公交搜索结果
mSearch.GetTransitRouteResult += (s,e) =>{var result =e.P0;if (result == null || result.Error !=SearchResult.ERRORNO.NoError)
{
Toast.MakeText(this, "抱歉,未找到结果", ToastLength.Short).Show();
}if (result.Error ==SearchResult.ERRORNO.AmbiguousRoureAddr)
{//起终点或途经点地址有岐义,通过以下接口获取建议查询信息//result.getSuggestAddrInfo()
return;
}if (result.Error ==SearchResult.ERRORNO.NoError)
{
nodeIndex= -1;
btnPre.Visibility=ViewStates.Visible;
btnNext.Visibility=ViewStates.Visible;
route= result.RouteLines[0];
TransitRouteOverlay overlay= new MyTransitRouteOverlay(this, mBaidumap);
mBaidumap.MarkerClick+= (sender, args) =>{//......
};
routeOverlay=overlay;
overlay.SetData(result.RouteLines[0]);
overlay.AddToMap();
overlay.ZoomToSpan();
}
};//处理步行搜索结果
mSearch.GetWalkingRouteResult += (s, e) =>{var result =e.P0;if (result == null || result.Error !=SearchResult.ERRORNO.NoError)
{
Toast.MakeText(this, "抱歉,未找到结果", ToastLength.Short).Show();
}if (result.Error ==SearchResult.ERRORNO.AmbiguousRoureAddr)
{//起终点或途经点地址有岐义,通过以下接口获取建议查询信息//result.getSuggestAddrInfo()
return;
}if (result.Error ==SearchResult.ERRORNO.NoError)
{
nodeIndex= -1;
btnPre.Visibility=ViewStates.Visible;
btnNext.Visibility=ViewStates.Visible;
route= result.RouteLines[0];
WalkingRouteOverlay overlay= new MyWalkingRouteOverlay(this, mBaidumap);
mBaidumap.MarkerClick+= (sender, args) =>{//......
};
routeOverlay=overlay;
overlay.SetData(result.RouteLines[0]);
overlay.AddToMap();
overlay.ZoomToSpan();
}
};//处理骑行搜索结果
mSearch.GetBikingRouteResult += (s, e) =>{var result =e.P0;if (result == null || result.Error !=SearchResult.ERRORNO.NoError)
{
Toast.MakeText(this, "抱歉,未找到结果", ToastLength.Short).Show();
}if (result.Error ==SearchResult.ERRORNO.AmbiguousRoureAddr)
{//如果起终点或途经点地址有岐义,可通过result.SuggestAddrInfo属性获取建议查询信息//......
return;
}if (result.Error ==SearchResult.ERRORNO.NoError)
{
nodeIndex= -1;
btnPre.Visibility=ViewStates.Visible;
btnNext.Visibility=ViewStates.Visible;
route= result.RouteLines[0];
BikingRouteOverlay overlay= new MyBikingRouteOverlay(this, mBaidumap);
routeOverlay=overlay;
mBaidumap.MarkerClick+= (sender, args) =>{//......
};
overlay.SetData(result.RouteLines[0]);
overlay.AddToMap();
overlay.ZoomToSpan();
}
};//--end--初始化搜索模块,注册监听事件//处理【驾车搜素】按钮点击事件
var btnDrive = FindViewById(Resource.Id.drive);
btnDrive.Click+= delegate{
SearchButtonProcess(Resource.Id.drive);
};//处理【公交搜素】按钮点击事件
var btnTransit = FindViewById(Resource.Id.transit);
btnTransit.Click+= delegate{
SearchButtonProcess(Resource.Id.transit);
};//处理【步行搜素】按钮点击事件
var btnWalk = FindViewById(Resource.Id.walk);
btnWalk.Click+= delegate{
SearchButtonProcess(Resource.Id.walk);
};//处理【骑行搜素】按钮点击事件
var btnBike = FindViewById(Resource.Id.bike);
btnBike.Click+= delegate{
SearchButtonProcess(Resource.Id.bike);
};//处理【自定义起终点图标】按钮点击事件
var btnCustomicon = FindViewById(Resource.Id.customicon);
btnCustomicon.Click+= delegate{//切换路线图标,刷新地图使其生效。注意:起终点图标使用中心对齐。
if (routeOverlay == null) return;if(useDefaultIcon)
{
btnCustomicon.Text= "自定义起终点图标";
Toast.MakeText(this,"将使用系统起终点图标", ToastLength.Short).Show();
}else{
btnCustomicon.Text= "系统起终点图标";
Toast.MakeText(this, "将使用自定义起终点图标", ToastLength.Short).Show();
}
useDefaultIcon= !useDefaultIcon;
routeOverlay.RemoveFromMap();
routeOverlay.AddToMap();
};//处理节点浏览相关的按钮事件
btnPre.Click += delegate{
NodeClick(Resource.Id.pre);
};
btnNext.Click+= delegate{
NodeClick(Resource.Id.next);
};
}///
///发起路线规划搜索///
/// 按钮的id
public void SearchButtonProcess(intid)
{//重置浏览节点的路线数据
route = null;
btnPre.Visibility=ViewStates.Invisible;
btnNext.Visibility=ViewStates.Invisible;
mBaidumap.Clear();//处理搜索按钮响应示例
EditText editSt = FindViewById(Resource.Id.start);
EditText editEn= FindViewById(Resource.Id.end);//设置起终点信息,对于tranist search 来说,城市名无意义
PlanNode stNode = PlanNode.WithCityNameAndPlaceName("北京", editSt.Text);
PlanNode enNode= PlanNode.WithCityNameAndPlaceName("北京", editEn.Text);//实际使用中请对起点终点城市进行正确的设定
if (id ==Resource.Id.drive)
{
mSearch.DrivingSearch(newDrivingRoutePlanOption()
.From(stNode).To(enNode));
}else if (id ==Resource.Id.transit)
{
mSearch.TransitSearch(newTransitRoutePlanOption()
.From(stNode).City("北京").To(enNode));
}else if (id ==Resource.Id.walk)
{
mSearch.WalkingSearch(newWalkingRoutePlanOption()
.From(stNode).To(enNode));
}else if (id ==Resource.Id.bike)
{
mSearch.BikingSearch(newBikingRoutePlanOption()
.From(stNode).To(enNode));
}
}///
///节点浏览示例///
/// 按钮的id
public void NodeClick(intid)
{if (nodeIndex < -1 || route == null ||route.AllStep== null || nodeIndex >route.AllStep.Count)
{return;
}//设置节点索引
if (id == Resource.Id.next && nodeIndex < route.AllStep.Count - 1)
{
nodeIndex++;
}else if (id == Resource.Id.pre && nodeIndex > 1)
{
nodeIndex--;
}if (nodeIndex < 0 || nodeIndex >=route.AllStep.Count)
{return;
}//获取节结果信息
LatLng nodeLocation = null;string nodeTitle = null;var step =route.AllStep[nodeIndex];if (step isDrivingRouteLine.DrivingStep)
{
nodeLocation=((DrivingRouteLine.DrivingStep)step).Entrance.Location;
nodeTitle=((DrivingRouteLine.DrivingStep)step).Instructions;
}else if (step isWalkingRouteLine.WalkingStep)
{
nodeLocation=((WalkingRouteLine.WalkingStep)step).Entrance.Location;
nodeTitle=((WalkingRouteLine.WalkingStep)step).Instructions;
}else if (step isTransitRouteLine.TransitStep)
{
nodeLocation=((TransitRouteLine.TransitStep)step).Entrance.Location;
nodeTitle=((TransitRouteLine.TransitStep)step).Instructions;
}if (nodeLocation == null || nodeTitle == null)
{return;
}//移动节点至中心
mBaidumap.SetMapStatus(MapStatusUpdateFactory.NewLatLng(nodeLocation));//Show popup
popupText= new TextView(this);
popupText.SetBackgroundResource(Resource.Drawable.popup);
popupText.SetTextColor(Android.Graphics.Color.Black);
popupText.Text=nodeTitle;
mBaidumap.ShowInfoWindow(new InfoWindow(popupText, nodeLocation, 0));
}protected override voidOnRestoreInstanceState(Bundle savedInstanceState)
{base.OnRestoreInstanceState(savedInstanceState);
}//定制RouteOverly
private classMyDrivingRouteOverlay : DrivingRouteOverlay
{
Demo13RoutePlan routePlanDemo;publicMyDrivingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :base(baiduMap)
{this.routePlanDemo =routePlanDemo;
}public overrideBitmapDescriptor GetStartMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
}return null;
}public overrideBitmapDescriptor GetTerminalMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
}return null;
}
}private classMyWalkingRouteOverlay : WalkingRouteOverlay
{
Demo13RoutePlan routePlanDemo;publicMyWalkingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :base(baiduMap)
{this.routePlanDemo =routePlanDemo;
}public newBitmapDescriptor GetStartMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
}return null;
}public newBitmapDescriptor GetTerminalMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
}return null;
}
}private classMyTransitRouteOverlay : TransitRouteOverlay
{
Demo13RoutePlan routePlanDemo;publicMyTransitRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :base(baiduMap)
{this.routePlanDemo =routePlanDemo;
}public overrideBitmapDescriptor GetStartMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
}return null;
}public overrideBitmapDescriptor GetTerminalMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
}return null;
}
}private classMyBikingRouteOverlay : BikingRouteOverlay
{
Demo13RoutePlan routePlanDemo;public MyBikingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) : base(baiduMap)
{this.routePlanDemo =routePlanDemo;
}public newBitmapDescriptor GetStartMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);
}return null;
}public newBitmapDescriptor GetTerminalMarker()
{if(routePlanDemo.useDefaultIcon)
{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);
}return null;
}
}protected override voidOnPause()
{
mMapView.OnPause();base.OnPause();
}protected override voidOnResume()
{
mMapView.OnResume();base.OnResume();
}protected override voidOnDestroy()
{
mSearch.Destroy();
mMapView.OnDestroy();base.OnDestroy();
}
}
}
4、修改MainActivity.cs
在MainActivity.cs文件的demos字段定义中,去掉【示例13】下面的注释。
运行观察结果。
本文原创发布php中文网,转载请注明出处,感谢您的尊重!