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);
}