【Android】第3章(14)路径规划功能

王朝学院·作者佚名  2016-08-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

分类:C#、Android、VS2015、百度地图应用; 创建日期:2016-02-04

一、简介线路规划支持以下功能:

公交信息查询:可对公交详细信息进行查询;公交换乘查询:根据起、终点,查询策略,进行线路规划方案;驾车线路规划:提供不同策略,规划驾车路线;(支持设置途经点)步行路径检索:支持步行路径的规划。其中驾车线路规划自v3.4.0版本起支持多线路检索结果的能力。

二、运行截图简介:介绍公交、驾车和步行三种线路规划方法和自设路线方法。

详述:

(1)驾车查询新增路径点查询功能,具体使用方法详见开发者指南路径规划部分,只需重载接口;

(2)自设路线功能演示开发者如何自己设定一条路线,包括如何设定起点、终点、途径站点和路段;

(3)自设路线功能同时也介绍如何在两个Activity之间切换的时候管理Mapview的生命周期;

(4)可自定义路线的起终点图标;

本示例运行截图如下:

[flash=500,400]http://s1.knowsky.com/20160211/varouulddlc54.png[/flash]

三、设计步骤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"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/textView1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="起点:"/><EditTextandroid:id="@+id/start"android:layout_width="fill_parent"android:layout_height="wrap_content"android:ems="10"android:text="龙泽"><requestFocus/></EditText></LinearLayout><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="终点:"/><EditTextandroid:id="@+id/end"android:layout_width="fill_parent"android:layout_height="wrap_content"android:ems="10"android:text="西单"><requestFocus/></EditText></LinearLayout><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginBottom="5dip"android:layout_marginTop="5dip"android:orientation="horizontal"><Buttonandroid:id="@+id/drive"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_marginRight="2dip"android:layout_weight="1.0"android:background="@drawable/button_style"android:text="驾车搜索"/><Buttonandroid:id="@+id/transit"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_marginRight="2dip"android:layout_weight="1.0"android:background="@drawable/button_style"android:text="公交搜索"/><Buttonandroid:id="@+id/walk"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_marginRight="2dip"android:layout_weight="1.0"android:background="@drawable/button_style"android:text="步行搜索"/><Buttonandroid:id="@+id/bike"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_marginRight="2dip"android:layout_weight="1.0"android:background="@drawable/button_style"android:text="骑行搜索"/></LinearLayout><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.baidu.mapapi.map.TextureMapViewandroid:id="@+id/map"android:layout_width="fill_parent"android:layout_height="fill_parent"android:clickable="true"/><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:layout_alignWithParentIfMissing="false"android:layout_marginRight="10dp"android:layout_marginTop="10dip"android:orientation="vertical"><Buttonandroid:id="@+id/customicon"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginTop="10dip"android:layout_weight="1.0"android:background="@drawable/button_style"android:text="自定义起终点图标"/></LinearLayout><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignWithParentIfMissing="false"android:layout_centerHorizontal="true"android:layout_centerVertical="false"android:layout_marginBottom="10dip"><Buttonandroid:id="@+id/PRe"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_marginRight="2dip"android:layout_weight="1.0"android:background="@drawable/pre_"/><Buttonandroid:id="@+id/next"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_marginLeft="2dip"android:layout_marginRight="2dip"android:layout_weight="1.0"android:background="@drawable/next_"/></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

{///<summary>///此demo用来展示如何进行驾车、步行、公交路线搜索并在地图使用RouteOverlay、TransitOverlay绘制,///同时展示如何进行节点浏览并弹出泡泡。///</summary>[Activity(Label ="@string/demo_name_route",

ConfigurationChanges= ConfigChanges.Orientation |ConfigChanges.KeyboardHidden,

ScreenOrientation=ScreenOrientation.Sensor)]publicclassDemo13RoutePlan : Activity

{//浏览路线节点相关Button btnPre =null;//上一个节点Button btnNext =null;//下一个节点intnodeIndex = -2;//节点索引,供浏览节点时使用RouteLine route =null;

OverlayManager routeOverlay=null;booluseDefaultIcon =false;privateTextView popupText =null;//泡泡view//地图相关,使用MyRouteMapView目的是重写touch事件实现泡泡处理。//如果不处理touch事件,则无需继承,直接使用TextureMapView即可。TextureMapView mMapView =null;//地图ViewBaiduMap mBaidumap =null;//搜索相关RoutePlanSearch mSearch =null;//搜索模块,也可去掉地图模块独立使用protectedoverridevoidOnCreate(Bundle savedInstanceState)

{base.OnCreate(savedInstanceState);

SetContentView(Resource.Layout.demo13_routeplan);//初始化地图mMapView = FindViewById<TextureMapView>(Resource.Id.map);

mBaidumap=mMapView.Map;

btnPre= FindViewById<Button>(Resource.Id.pre);

btnNext= FindViewById<Button>(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) =>{varresult =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=newMyDrivingRouteOverlay(this, mBaidumap);

routeOverlay=overlay;

mBaidumap.MarkerClick+= (sender, args) =>{//......};

overlay.SetData(result.RouteLines[0]);

overlay.AddToMap();

overlay.ZoomToSpan();

}

};//处理公交搜索结果mSearch.GetTransitRouteResult += (s,e) =>{varresult =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=newMyTransitRouteOverlay(this, mBaidumap);

mBaidumap.MarkerClick+= (sender, args) =>{//......};

routeOverlay=overlay;

overlay.SetData(result.RouteLines[0]);

overlay.AddToMap();

overlay.ZoomToSpan();

}

};//处理步行搜索结果mSearch.GetWalkingRouteResult += (s, e) =>{varresult =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=newMyWalkingRouteOverlay(this, mBaidumap);

mBaidumap.MarkerClick+= (sender, args) =>{//......};

routeOverlay=overlay;

overlay.SetData(result.RouteLines[0]);

overlay.AddToMap();

overlay.ZoomToSpan();

}

};//处理骑行搜索结果mSearch.GetBikingRouteResult += (s, e) =>{varresult =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=newMyBikingRouteOverlay(this, mBaidumap);

routeOverlay=overlay;

mBaidumap.MarkerClick+= (sender, args) =>{//......};

overlay.SetData(result.RouteLines[0]);

overlay.AddToMap();

overlay.ZoomToSpan();

}

};//--end--初始化搜索模块,注册监听事件//处理【驾车搜素】按钮点击事件varbtnDrive = FindViewById<Button>(Resource.Id.drive);

btnDrive.Click+=delegate{

SearchButtonProcess(Resource.Id.drive);

};//处理【公交搜素】按钮点击事件varbtnTransit = FindViewById<Button>(Resource.Id.transit);

btnTransit.Click+=delegate{

SearchButtonProcess(Resource.Id.transit);

};//处理【步行搜素】按钮点击事件varbtnWalk = FindViewById<Button>(Resource.Id.walk);

btnWalk.Click+=delegate{

SearchButtonProcess(Resource.Id.walk);

};//处理【骑行搜素】按钮点击事件varbtnBike = FindViewById<Button>(Resource.Id.bike);

btnBike.Click+=delegate{

SearchButtonProcess(Resource.Id.bike);

};//处理【自定义起终点图标】按钮点击事件varbtnCustomicon = FindViewById<Button>(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);

};

}///<summary>///发起路线规划搜索///</summary>///<param name="id">按钮的id</param>publicvoidSearchButtonProcess(intid)

{//重置浏览节点的路线数据route =null;

btnPre.Visibility=ViewStates.Invisible;

btnNext.Visibility=ViewStates.Invisible;

mBaidumap.Clear();//处理搜索按钮响应示例EditText editSt = FindViewById<EditText>(Resource.Id.start);

EditText editEn= FindViewById<EditText>(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));

}elseif(id ==Resource.Id.transit)

{

mSearch.TransitSearch(newTransitRoutePlanOption()

.From(stNode).City("北京").To(enNode));

}elseif(id ==Resource.Id.walk)

{

mSearch.WalkingSearch(newWalkingRoutePlanOption()

.From(stNode).To(enNode));

}elseif(id ==Resource.Id.bike)

{

mSearch.BikingSearch(newBikingRoutePlanOption()

.From(stNode).To(enNode));

}

}///<summary>///节点浏览示例///</summary>///<param name="id">按钮的id</param>publicvoidNodeClick(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++;

}elseif(id == Resource.Id.pre && nodeIndex >1)

{

nodeIndex--;

}if(nodeIndex <0|| nodeIndex >=route.AllStep.Count)

{return;

}//获取节结果信息LatLng nodeLocation =null;stringnodeTitle =null;varstep =route.AllStep[nodeIndex];if(stepisDrivingRouteLine.DrivingStep)

{

nodeLocation=((DrivingRouteLine.DrivingStep)step).Entrance.Location;

nodeTitle=((DrivingRouteLine.DrivingStep)step).Instructions;

}elseif(stepisWalkingRouteLine.WalkingStep)

{

nodeLocation=((WalkingRouteLine.WalkingStep)step).Entrance.Location;

nodeTitle=((WalkingRouteLine.WalkingStep)step).Instructions;

}elseif(stepisTransitRouteLine.TransitStep)

{

nodeLocation=((TransitRouteLine.TransitStep)step).Entrance.Location;

nodeTitle=((TransitRouteLine.TransitStep)step).Instructions;

}if(nodeLocation ==null|| nodeTitle ==null)

{return;

}//移动节点至中心mBaidumap.SetMapStatus(MapStatusUpdateFactory.NewLatLng(nodeLocation));//Show popuppopupText=newTextView(this);

popupText.SetBackgroundResource(Resource.Drawable.popup);

popupText.SetTextColor(Android.Graphics.Color.Black);

popupText.Text=nodeTitle;

mBaidumap.ShowInfoWindow(newInfoWindow(popupText, nodeLocation,0));

}protectedoverridevoidOnRestoreInstanceState(Bundle savedInstanceState)

{base.OnRestoreInstanceState(savedInstanceState);

}//定制RouteOverlyprivateclassMyDrivingRouteOverlay : DrivingRouteOverlay

{

Demo13RoutePlan routePlanDemo;publicMyDrivingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :base(baiduMap)

{this.routePlanDemo =routePlanDemo;

}publicoverrideBitmapDescriptor GetStartMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);

}returnnull;

}publicoverrideBitmapDescriptor GetTerminalMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);

}returnnull;

}

}privateclassMyWalkingRouteOverlay : WalkingRouteOverlay

{

Demo13RoutePlan routePlanDemo;publicMyWalkingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :base(baiduMap)

{this.routePlanDemo =routePlanDemo;

}publicnewBitmapDescriptor GetStartMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);

}returnnull;

}publicnewBitmapDescriptor GetTerminalMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);

}returnnull;

}

}privateclassMyTransitRouteOverlay : TransitRouteOverlay

{

Demo13RoutePlan routePlanDemo;publicMyTransitRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :base(baiduMap)

{this.routePlanDemo =routePlanDemo;

}publicoverrideBitmapDescriptor GetStartMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);

}returnnull;

}publicoverrideBitmapDescriptor GetTerminalMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);

}returnnull;

}

}privateclassMyBikingRouteOverlay : BikingRouteOverlay

{

Demo13RoutePlan routePlanDemo;publicMyBikingRouteOverlay(Demo13RoutePlan routePlanDemo, BaiduMap baiduMap) :base(baiduMap)

{this.routePlanDemo =routePlanDemo;

}publicnewBitmapDescriptor GetStartMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_st);

}returnnull;

}publicnewBitmapDescriptor GetTerminalMarker()

{if(routePlanDemo.useDefaultIcon)

{returnBitmapDescriptorFactory.FromResource(Resource.Drawable.icon_en);

}returnnull;

}

}protectedoverridevoidOnPause()

{

mMapView.OnPause();base.OnPause();

}protectedoverridevoidOnResume()

{

mMapView.OnResume();base.OnResume();

}protectedoverridevoidOnDestroy()

{

mSearch.Destroy();

mMapView.OnDestroy();base.OnDestroy();

}

}

}

4、修改MainActivity.cs

在MainActivity.cs文件的demos字段定义中,去掉【示例13】下面的注释。

运行观察结果。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航