المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : Solving vehicle routing problem in .NET (C#)



C# Programming
05-07-2009, 10:13 AM
I am developing an application in .NET to solve VRP, without using ArcGIS Server, but I can not find a complete sample code, I used other samples such as routesolver and get help from them, but I faced Exception in INASolver.Solve that shows I didn't load NAClasses correctly, I will be really thankfull if you could help me.Please!!!:(

I get COMExecption on the line : INASolver.Solve(...), details:Invalid input in NAClass

my code:


IAoInitialize pAoInitialize = new AoInitializeClass();
pAoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcView);
pAoInitialize.CheckOutExtension(esriLicenseExtensionCode.esriLicenseExtensionCodeNetwork);

IWorkspaceFactory ipWorkspaceFactory = new ShapefileWorkspaceFactoryClass();
m_pWorkspace = ipWorkspaceFactory.OpenFromFile(SHAPE_WORKSPACE, 0);

IFeatureWorkspace pFWorkspace = m_pWorkspace as IFeatureWorkspace;
IWorkspaceExtensionManager pWorkspaceExtensionManager = m_pWorkspace as IWorkspaceExtensionManager;

UID pUID = new UIDClass();
pUID.Value = "esriGeoDatabase.NetworkDatasetWorkspaceExtension";

IDatasetContainer2 pDatasetContainer2;
pDatasetContainer2 = pWorkspaceExtensionManager.FindExtension(pUID) as IDatasetContainer2;

m_pNetworkDataset = pDatasetContainer2.get_DatasetByName(esriDatasetType.esriDTNetworkDataset, NETWORK_DATASET) as INetworkDataset;
INALayer pNALayer = CreateVRPAnalysisLayer("Vehicle Routing Problem", m_pNetworkDataset);

String INPUT_DEPOTS = "DistributionCenters";
String INPUT_ORDERS = "Stores";
// String INPUT_ROUTES = "Routes";

INAContext pNAContext;
pNAContext = pNALayer.Context;
INAContextEdit vrpNAContextEdit = pNAContext as INAContextEdit;
vrpNAContextEdit.Bind(pNALayer.Context.NetworkDataset, null);

//Load Depots

m_pInputFClass = pFWorkspace.OpenFeatureClass(INPUT_DEPOTS);
ICursor InputDepotsCursor = m_pInputFClass.Search(new QueryFilterClass(), false) as ICursor;
LoadAnalysisLayer("Depots", pNAContext, InputDepotsCursor);

//Load Orders
m_pInputFClass = pFWorkspace.OpenFeatureClass(INPUT_ORDERS);
ICursor InputOrdersCursor = m_pInputFClass.Search(new QueryFilterClass(), false) as ICursor;
LoadAnalysisLayer("Orders", pNAContext, InputOrdersCursor);

//Load Routes
IMap vrpMap = axMapControl1.Map;
ITable routesInputTable = GetStandaloneTable("Vehicles", vrpMap).Table;
ICursor InputRoutesCursor = routesInputTable.Search(new QueryFilterClass(), true) as ICursor;
LoadAnalysisLayer("Routes", pNAContext, InputRoutesCursor);


//Solve
INASolver pSolver;
pSolver = pNAContext.Solver;
INAVRPSolver vrpSolver = pSolver as INAVRPSolver;
vrpSolver.GenerateInternalRouteContext = true; // Required for true-shape and directions
vrpSolver.DefaultDate = DateTime.Today; // Set the default date to be today

pSolver.Solve(pNAContext, new GPMessagesClass(), new CancelTrackerClass());

private void LoadAnalysisLayer(string ClassName, INAContext context, ICursor cursor)
{
INAClass pNAClass;
pNAClass = context.NAClasses.get_ItemByName(ClassName) as INAClass;
//pRoutesFC = pNAContext.NAClasses.get_ItemByName("Routes") as IFeatureClass;

//Load
INAClassFieldMap pNAClassFieldMap = new NAClassFieldMapClass();
pNAClassFieldMap.set_MappedField("Name", SHAPE_INPUT_NAME_FIELD);

INAClassLoader pNALoader = new NAClassLoaderClass();
pNALoader.Locator = context.Locator;
pNALoader.NAClass = pNAClass;
pNALoader.FieldMap = pNAClassFieldMap;

int rowsInCursor = 0;
int rowsLocated = 0;
pNALoader.Load(cursor, new CancelTrackerClass(), ref rowsInCursor, ref rowsLocated);
}