ArcGISServer开发系列物流配送_第1页
ArcGISServer开发系列物流配送_第2页
ArcGISServer开发系列物流配送_第3页
ArcGISServer开发系列物流配送_第4页
ArcGISServer开发系列物流配送_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论