arc-gis网络分析代码
备份~~
const string MEMORY_WORKSPACE = "WorkSpace_Data";
const string LAYER_NAME = "Deports Layer";
public static INALayer CreateRouteLayer(string mxdFileName, List<VO.Stop> stops)
{
INetworkDataset networkDataset = GetNetworkDataSet(mxdFileName);
IFieldsEdit fieldEditor = new FieldsClass();
//Create Layer in memory
IFeatureLayer featureLayer = CreateLayerInMomeoy(MEMORY_WORKSPACE, LAYER_NAME, esriGeometryType.esriGeometryPoint, fieldEditor);
IFeatureClass featureClass = featureLayer.FeatureClass;
//insert deport points into memory layer
IWorkspaceEdit workspaceEdit = ((IDataset)featureClass).Workspace as IWorkspaceEdit;
workspaceEdit.StartEditing(false);
workspaceEdit.StartEditOperation();
IFeatureBuffer featureBuffer = featureClass.CreateFeatureBuffer();
IFeatureCursor featureCursor = featureClass.Insert(true);
foreach (XmlRoute.VO.Stop stop in stops)
{
IPoint point = new PointClass();
point.X = stop.X;
point.Y = stop.Y;
featureBuffer.Shape = point;
featureCursor.InsertFeature(featureBuffer);
System.Diagnostics.Debug.WriteLine(stop.X.ToString() + "," + stop.Y.ToString());
}
featureCursor.Flush();
workspaceEdit.StopEditOperation();
workspaceEdit.StopEditing(true);
System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);
//Solve
INAContext naContext = null;
IGPMessages gpMessage = null;
naContext = CreateSolverContext(networkDataset);
LoadNANetworkLocations(ref naContext,"Stops", featureClass, 1000);
SetSolverSettings(ref naContext,XmlRoute.Properties.Settings.Default.LengthField, false);
gpMessage = (IGPMessages)(new GPMessagesClass());
if (naContext.Solver.Solve(naContext, gpMessage, null))
{
}
INALayer naLayer = naContext.Solver.CreateLayer(naContext);
return naLayer;
}
private static INetworkDataset GetNetworkDataSet(string mxdFileName)
{
//Open the mxd file and get the network dataset
IMapDocument pMapDocument = new MapDocumentClass();
pMapDocument.Open(mxdFileName, "");
INetworkDataset networkDataset = null;
//iterate all the maps
for (int cMap = 0; cMap < pMapDocument.MapCount; cMap++)
{
for (int cLayer = 0; cLayer < pMapDocument.get_Map(cMap).LayerCount; cLayer++)
{
ILayer pLayer = pMapDocument.get_Map(cMap).get_Layer(cLayer);
//NA Layer
if (pLayer is INALayer)
{
INALayer pNALayer = pLayer as INALayer;
networkDataset = pNALayer.Context.NetworkDataset;
break;
}
//Composite Layer
if (pLayer is IGroupLayer)
{
ICompositeLayer pCompositeLayer = pLayer as ICompositeLayer;
for (int cContainLayer = 0; cContainLayer < pCompositeLayer.Count; cContainLayer++)
{
if (pCompositeLayer.get_Layer(cContainLayer) is INALayer)
{
INALayer pNALayer = pCompositeLayer.get_Layer(cContainLayer) as INALayer;
networkDataset = pNALayer.Context.NetworkDataset;
break;
}
}
}
}
}
//Close the MXD Document
pMapDocument.Close();
////judge get the net work data set or not
if (networkDataset == null)
{
Exception ex = new Exception();
ex.Data.Add(0, "无法打开网络数据集!");
throw ex;
}
return networkDataset;
}
public static IFeatureLayer CreateLayerInMomeoy(string wsName, string layerName, esriGeometryType shapeType, IFieldsEdit allFields)
{
IWorkspaceName workspaceName = null;
IWorkspaceFactory workspaceFactory = null;
IFeatureWorkspace workspace = null;
IFeatureClass featureClass = null;
IFeatureLayer featureLayer = null;
IFieldEdit fieldEdit = null;
IGeometryDefEdit geometryDefEdit = null;
ISpatialReference spatialRef = null;
//Add Shapes Fields
fieldEdit = new FieldClass();
fieldEdit.Name_2 = "Shape";
fieldEdit.Type_2 = esriFieldType.esriFieldTypeGeometry;
fieldEdit.IsNullable_2 = true;
fieldEdit.Required_2 = true;
geometryDefEdit = new GeometryDefClass();
geometryDefEdit.GeometryType_2 = shapeType;
spatialRef = new UnknownCoordinateSystemClass();
spatialRef.SetDomain(-180, 180, -180, 180);
geometryDefEdit.SpatialReference_2 = spatialRef;
fieldEdit.GeometryDef_2 = geometryDefEdit;
allFields.AddField(fieldEdit);
//Create memory layer
workspaceFactory = new InMemoryWorkspaceFactoryClass();
workspaceName = workspaceFactory.Create("", wsName, null, 0);
workspace = ((IName)workspaceName).Open() as IFeatureWorkspace;
featureClass = workspace.CreateFeatureClass(layerName, allFields, null, null, esriFeatureType.esriFTSimple, "Shape", "");
featureLayer = new FeatureLayerClass();
featureLayer.Name = layerName;
featureLayer.FeatureClass = featureClass;
return featureLayer;
}
public static void SetSolverSettings(ref INAContext naContext, string metersName, bool oneWay)
{
INASolver naSolver = naContext.Solver;
INARouteSolver naRouteSolver = (INARouteSolver)naSolver;
INASolverSettings solverSettings = null;
IStringArray restrictions = null;
INAAgent naAgent = null;
naRouteSolver.OutputLines = esriNAOutputLineType.esriNAOutputLineTrueShapeWithMeasure;
naRouteSolver.CreateTraversalResult = true;
naRouteSolver.UseTimeWindows = false;
naRouteSolver.FindBestSequence = false;
naRouteSolver.PreserveFirstStop = true;
naRouteSolver.PreserveLastStop = true;
solverSettings = (INASolverSettings)naSolver;
solverSettings.ImpedanceAttributeName = metersName;
IStringArray accumulateAttributeNames = solverSettings.AccumulateAttributeNames;
accumulateAttributeNames.Add(metersName);
solverSettings.AccumulateAttributeNames = accumulateAttributeNames;
solverSettings.IgnoreInvalidLocations = true;
restrictions = solverSettings.RestrictionAttributeNames;
restrictions.RemoveAll();
if (oneWay)
restrictions.Add("OneWay");
solverSettings.RestrictionAttributeNames = restrictions;
solverSettings.RestrictUTurns = esriNetworkForwardStarBacktrack.esriNFSBNoBacktrack;
solverSettings.UseHierarchy = false;
naSolver.UpdateContext(naContext, GetDENetworkDataset(naContext.NetworkDataset), null);
naAgent = (INAAgent)naContext.Agents.get_ItemByName("StreetDirectionsAgent");
naAgent.OnContextUpdated();
}
public static INAContext CreateSolverContext(INetworkDataset networkDataset)
{
IDENetworkDataset deNetworkDataset = null;
INASolver naSolver = null;
INAContextEdit naContextEdit = null;
IGPMessages gpMsg = null;
deNetworkDataset = GetDENetworkDataset(networkDataset);
naSolver = new NARouteSolver();
naContextEdit = (INAContextEdit)(naSolver.CreateContext(deNetworkDataset, "Route"));
gpMsg = new GPMessagesClass();
naContextEdit.Bind(networkDataset, gpMsg);
return (INAContext)naContextEdit;
}
public static IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset)
{
IDatasetComponent datasetComponent = null;
datasetComponent = (IDatasetComponent)networkDataset;
///Get the Data Element
IDENetworkDataset dataset = null;
dataset = (IDENetworkDataset)datasetComponent.DataElement;
return dataset;
}
public static void LoadNANetworkLocations(ref INAContext naContext, string naClassName, IFeatureClass inputFeatureClass, double snapTolerance)
{
INamedSet naClasses = null;
INAClass naClass = null;
INAClassLoader naLoader = null;
INAClassFieldMap fieldMap = null;
int rowsIn = 0;
int rowsLocated = 0;
naClasses = naContext.NAClasses;
naClass = (INAClass)(naClasses.get_ItemByName(naClassName));
naClass.DeleteAllRows();
naLoader = new NAClassLoaderClass();
naLoader.Locator = naContext.Locator;
if (snapTolerance > 0)
{
naLoader.Locator.SnapTolerance = snapTolerance;
}
naLoader.NAClass = naClass;
fieldMap = new NAClassFieldMapClass();
fieldMap.CreateMapping(naClass.ClassDefinition, inputFeatureClass.Fields);
naLoader.FieldMap = fieldMap;
naLoader.Load((ICursor)(inputFeatureClass.Search(null, true)), null, ref rowsIn, ref rowsLocated);
System.Diagnostics.Debug.WriteLine(rowsIn.ToString() + "," + rowsLocated.ToString());
}
}