版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ArcGISServer开发系列物流配送
相应的代码比较容易看懂,结合上面实现的ui效果图与代码注释就能明白每部分代码所
完成的功能,实现代码:
protectedoverridevoidCreateChildControls()
□□(
Controls.Clear();
base.CreateChildControls();
由白#regionCreatetopleveltable
System.Web.UI.WebControls.Tabletable=newSystem.Web.UI.WebCo
ntrols.Table();
table.Width=System.Web.UI.WebControls.Unit.Pixel(240);
Controls.Add(table);
TableRowtr;
TableCelltd;
卜#endregion
由白#regionOrdersLabel
tr=newTableRow();
td=newTableCell();
td.Text="Selectorderstoservice',;
tr.Cells.Add(td);
table.Rows.Add(tr);
卜#endregion
由白#regionCreateandpopulateordersListbox
_oids=newList<int>();
_ordersCheckBoxList=newCheckBoxList();
_ordersCheckBoxList.ID="OrdersCheckBoxList";
_ordersCheckBoxList.Width=System.Web.UI.WebControls.Unit.Poin
t(200);
IServerContextservercontext=MapResourceLocal.ServerContextln
fo.ServerContext;
IMapvrpMap=Utility.GetCartoIMap(Mapinstance,"NA_MapResource
Item*1);
IFeatureLayerordersInputFLayer=Utility.GetFeatureLayer(MStor
es"zvrpMap);
IFeatureClassordersInputFClass=ordersInputFLayer.FeatureClas
intnameindex=ordersInputFClass.FindField("Namen);
IIFeatureCursorordersInputFCursor=ordersZnputFClass.Search(nu
11,false);
IFeatureorderFeature=ordersInputFCursor.NextFeature();
while(orderFeature!=null)
由由(
Listitemli=newListltem(orderFeature.get_Value(nameindex).To
String());
li.Selected=true;
_ordersCheckBoxList.Items.Add(li);
_oids.Add(orderFeature.OID);
orderFeature=ordersInputFCursor.NextFeature();
卜)
r#endregion
由白#regionOrdersPanel
tr=newTableRow();
td=newTableCell();
PanelordersPanel=newPanel();
ordersPanel.Height=200;
ordersPanel.Width=240;
ordersPanel.Bordercolor=System.Drawing.Color.Black;
ordersPanel.BorderStyle=BorderStyle.Inset;
ordersPanel.Borderwidth=1;
ordersPanel.ScrollBars=ScrollBars.Vertical;
ordersPanel.Controls.Add(_ordersCheckBoxList);
td.Controls.Add(ordersPanel);
tr.Cells.Add(td);
table.Rows.Add(tr);
卜#endregion
由白#regionGetDirectionsButton
tr=newTableRow();
tr.Attributes.Add(''align","right”);
td=newTableCell();
td.ColumnSpan=2;
HtmllnputButtonbutton=newHtmllnputButton();
button.VA1HA="GptDiranticns”;
button.ID="execute";
td.Controls.Add(button);
tr.Cells.Add(td);
table.Rows.Add(tr);
卜打endregion
I
由白#regionOnClickEventforexecutingtask
stringargument=string.Format("'selectedZndexes='+getChecke
dltemlndexes('{0},/'•1}')”,_ordersCheckBoxList.ClientID,_order
sCheckBoxList.Items.Count);
由stringonClick=string.Format("executeTask({0},\"{1}\);"/arg
ument,CalIbackFunctionString);
button.Attributes.Add("onclicku,onClick);
卜#endregion
//Accessthegraphicslayersoitiscreatedandshowninthe
TOC
ElementGraphicsLayerpointsGraphicsLayer=PointsGraphicsLayer;
%
CreateChildControls用于构建VRPTaskUL除了界面要素之外,还需要从源数据中读
取商店信息,如读取商店名称显示在界面上,当VRPTask中的商店被勾选上时,车辆将为
该商店送货。商店供货信息存储在数据源中单独的一个图层中stores.shp,包含商店所需的
货物数量与估计提供服务的时间。
VRPTaskUI完成之后,接下来要设计VRP的业务逻辑,ArcGIS9.3NetworkExtension
提供了一个基本的VRP解决方案,因此我们在公布NATasks服务的时候需要勾选Network
Analyst功能,通过ScrvcrContcxt去远程调用A0方法。
第一步,获取VRP分析图层。
IServerContextserverContext=MapResourceLocal.SeiA'ei-Contextlnfo.ServerContext;
IMapvrpMap=U(ility.GetCartoIMap(MapIns(ance,"NA_MapResourccItcm");
IGPMcssagcsgpMcssagcs=se^erContcxt.CrcatcObjcctC'csriGcodatabasc.GPMcssagcs")asIGP
Messages;
INALayer2vrpNALayer=Utility.GetNALayer("VehicleRoutingProblem",vrpMap);
INAContextvrpNAContcxt=vrpNALayer.CopyContext();
INAContextEditvrpNAConte\tEdit=vrpNAContextasINAContextEdit;
vrpNAContcxtEdit.Bind(vrpNALayer.Con(ext.Nc(workDatasct.gpMcssagcs);
第二步,获取配送中心信息、商店信息、车辆信息与司机午餐时间。
IFcaturcLayerdepotsInputFLayer=Utili(y.GctFeaturcLaycr("DisiributionCcnters",vrpMap);
IFeatureClassdepotsInputFClass=depotsInputFLayer.FeatureClass;
IFeatureCursordepotsInputFCursor=depotslnputFClass.Search(null,false);
LoadAnalysisClassCsen^rContcxt.vrpNAContcxt."Depots",depotsInputFCursorasICursor);
//LoadOrders
IFcaturcLayerordersInputFLaycr=Utility.GctFeaturcLaycr("Storcs".vrpMap):
IFeatureClassordersInputFCIass=ordersInputFLayer.FeatureClass;
IFeatureCursorordersInputFCuisor=oidersInputFClass.GetFeatures(oids,true);
LoadAnalysisClassCsen^rContcxt.vrpNAContcxt,"Orders".ordcrsInpucFCursorasICursor);
//LoadtheRoutes
ITableroutcsInputTable=Utility.Gc(S(andaloncTable("Vehicles",vrpMap).Tablc;
ICursorroutesInputCursor=routesInputTable.Search(null,true);
LoadAnalysisClass(ser\erContext,vipNAContext,"Routes",routesInputCursorasICursor);
//LoadtheBreaks
ITablebreaksInputTable=Utility.GetStandaloneTable("LunchBreaks",vrpMap).Table;
ICursorbrcaksInputCursor=brcaksInputTablc.Scarch(nulktrue);
LoadAnalysisClass(serverContext,vrpNAContext,"Breaks",breiiksInputCursorasICursor);
//Messageallofthenetworkanalysisagentsthattheanalysiscontexthaschanged
vrpNAContextEdit.ContextChanged();
配送中心、商店信息均存储在物理图层中,分别对应DistributionCenters.shp、Stores.shp.
车辆信息与司机午餐时间存储于Table表中。车辆Table包含物流配送过程中与车辆有关的
一切信息,如起止配送中心、承载量、最多订单数、发车时间、最长驾驶时间、最长行驶距
离等,司机午餐Table包含同意的午餐持续时间、同意的午餐时间范闱等,这些都将用于
ArcGISVRP模型的计算中。
第三步,路径计算,做过ArcEngineNetworkAnalyst开发的工程师对INASolver
INAVRPSolver•定非常熟悉了,调用过程比较简单,路径计算的同时处理系统反馈的消息
信息。
gpMessages.Clear();
INASolvernaSolver=vrpNAContext.Solver;
INAVRPSolvervrpSolver=naSolverasINAVRPSolver;
vrpSolvcr.GcncratcIntcrnalRoutcContcxt=true;//Requiredfortruc-shapcanddirections
vrpSolver.DefaultDate=DateTime.Today;//Setthedefaultdatetobetoday
boolpanialRcsults=naSolver.Solve(vrpNAContext,gpMessages.null);
//reporterrors
if(parlialResulls||gpMessages.Count>0)
□□!
IStringBuildcrsErrors=newStringBuilderO;
Ifor(inii=0;i<gpMessages.Count;i++)
IsErrors.AppendLine(gpMessages.GetMessage(i).Description);
Results=sErrors.ToString();
Ireturn;
L1
第四步,处理结果,VRP计算后最重要的结果就是生成的车辆分配情况、配送顺序与车
辆配送路径,将车辆行驶的全面信息以图文并茂的方式展示出来。
//GetMap'sSpatialReference(toprojectoutputgeometries
ESRLArcGlS.ADEWeb.DataSources.ArcGISServer.MapFunctionalitymf=(ESRl.ArcGIS.ADE
Web.DataSources.ArcGISServer.MapFunctionality)MapInstance.GetFunctionality("NA_MapReso
urcchcm");
SpatialReferencemapSpatiaIRcfercncc=mf.MapDcscription.SpaiialRcfercncc;
//OutputresultRoutesandStops
Utility.OutputRoutesAsGraphics(serv,ei,Context,vrpNAContext,RoutesGraphicsLayer,mapSpatia
IRefercnce);
Utility.OutputOrdersAsGraphics(seiTei-Context,vq)NAContext,PointsGraphicsI^iyer,mapSpatial
Reference);
//Createresultsnode
TaskResultNodeparentTaskResuIcNode=Utility.CreateTaskResultNode("VRPResults");
parcntTaskRcsultNodc.Expandcd=true;
//GettheRouteContextfromtheresultstousefordirections
INAVRPRcsukvrpRcsult=vipNAContcxt.ResultasINAVRPRcsult;
INAContextrouteNAContext=vrpResult.InternalRouteContext;
//Loopthroughtheresultingroutesandadditemsforeachroute(vehicle)
ISetrouteSet=senrerContext.CreateObject("esriSystem.Set")asISet;
IFeatureClassrouteRoutesFClass=routeNAContext.NAClasses.get_IteniByName("Routes")asI
FeatureClass;
introuteNamelndex=routeRoutesFClass.FindField("Name");
IFeacurcCursorroutcsRoutcFCursor=routeRoutesFClass.Search(null.false);
introuteNumber=0;
IFcaiurcrouteFcaturc=routcsRoutcFCursor.NcxtFcaturcO;
while(routeFeature!=null)
□□!
IstringroutcNanic=routeFeature.gct_Valuc(routcNaineIndcx).ToString();
由白Choosecolorforeachroute
routeTaskResultNode.Expanded=true;
parentlaskResultNode.Nodes.Add(routeTaskResultNode);
//AddStatistics
TaskResultNodevq^RouteStatisticsNode=Utility.GetVRPRouteStatisticsNode(serverContext,
vrpNAContext.routeName);
!vrpRouteStalisticsNode.Tex(CellStyleAttributes.Add("font-weight","bold");
routeTaskResultNode.Nodes.Add(vrpRouteStatisticsNode);
//AddDirections
I
I//Gc((hedirectionsforthespecifiedroute
IrouteSet.RemoveAII();
IrouteSet.Add(routeFeature);//GetDirections
//Generatethedirections
ITaskResultNodedirectionsTaskResultNode=Utility.GetDirectionsNode(false,routeNAContext
,routeSet);
directionsTaskResullNode.Te>aCellSlyleAllributes.Add("font-weighl","bold");
I
I//Addthedirectionstotheresultsnode
routeTaskResultNode.Nodes.Add(directionsTaskResultNode):
I
IroutcNumbcr++;
routeFeature=routesRouteFCursor.NextFeature();
L1
通过上述过程,完成了VRPTask的UI设计与业务逻辑程序,之后需要将应用重新生成
为dlL添加到ASP.Nci工具箱中,方便WebGIS应用调用该Task控件,我们在WebMapping
Application模板应用程序基础上添加VRPTask,运行后效果:
W3者WebhippingApplication
WebMappingApplication
VRPTaskl|RouteTaskl
Results
MapContents
ry]RouteTaskManagerl_RouteTaskl
Routes
“Stops
SV]VRPTaskManagerl_V^PTaskl
[7VRPRoutes
[/Orders
-iV]NA_MapResourceItem
ffiV]VehicleRoutingProblem
tti'—Stores
®_]DistributionCerters
®,Route
田/HwySt
®V]MajorSt
l±y]Streets
®0streets_nd
在/Lakes
®7]Parks
+7]Shoreline
/QInternet|鼎
数据源vehiclestable中包含三辆汽车的记录,在应用中勾选需要进行配送的商店,
比如选择15家商店,点击"GetDirections"执行VRP计算,生成结果如下所示:
6WebMappingApplication-WindowsInternetExplorer
▼,夕
£,http://1ocahost/ArcGISNATasksCSharp/NATasksWebAppCSharp/Defaultaspx1Al
Q独有WebMappingApplication
WebMappingApplication
VRPTaskl|RouteTaskl
ISVRPResults
STruck2
EiStatistics
OrderCount=9
TotalCost-$234.98
STotalTime=414min
ElDrivingDirections
GStartatWarehouse
Estimated
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 得力品牌分析报告
- 材料行业就业指导
- 主题教育阳光行动
- 安全生产培训管理指南
- 多酸论文多酸结构类型综述
- 电缆老化机理研究-深度研究
- 7.2 共建美好集体 课件(内嵌视频)2025-2026学年统编版道德与法治七年级上册
- 2025年江苏初二地理生物会考真题试卷+答案
- 2025年浙江衢州市初二地理生物会考真题试卷(+答案)
- 2026年广西壮族自治区来宾市中考英语考试真题及答案
- 2025年四川省党政领导干部政治理论水平考试(理论测试)历年参考题库含答案详解
- 证券投资基金销售业务信息管理平台管理规定全文
- 2026江苏南京市城市建设投资控股(集团)有限责任公司招聘78人笔试历年参考题库附带答案详解
- 杭州地铁科技有限公司社会招聘29人建设笔试备考试题及答案解析
- 中粮集团2026届春季校园招聘考试参考试题及答案解析
- 新课程理念下高中物理高效课堂的构建与实践探究
- DB42∕T 2512-2026 建筑工程三维模型定义数据标准
- 2026春季四川成都环境投资集团有限公司下属成都市兴蓉环境股份有限公司校园招聘47人考试备考试题及答案解析
- 广西建设工程质量检测和建筑材料试验收费项目及标准指导性意见
- 民非内部印章管理制度
- 危重患者早期活动与康复护理
评论
0/150
提交评论