axMapControl1.ActiveView.Clear();
axMapControl1.ActiveView.Refresh();
//获取当前应用程序的目录的名称
//string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
//path = path.Remove(path.Length - 5, 5);
//string name = path + "NetworkAnalyst.gdb";
string path = @"E:/大学/ARCGIS二次开发/荆州市数据资料/"; //修改自己的文件名
string name = path + "荆州市.gdb"; //添加文件地理数据库
//打开工作空间
pFWorkspace = OpenWorkspace(name) as IFeatureWorkspace;
//打开网络数据集
networkDataset = OpenNetworkDataset(pFWorkspace as IWorkspace, "net_ND", "net"); //添加网络数据集以及要素集
//创建网络分析上下文,建立一种解决关系
m_NAContext = CreateSolverContext(networkDataset);
//打开数据集
inputFClass = pFWorkspace.OpenFeatureClass("stops"); 添加stops要素
//Test_ND_junctions图层
IFeatureLayer vertex = new FeatureLayerClass();
vertex.FeatureClass = pFWorkspace.OpenFeatureClass("net_ND_junctions"); //图层名称
vertex.Name = vertex.FeatureClass.AliasName;
axMapControl1.AddLayer(vertex, 0);
//street图层
IFeatureLayer road3 = new FeatureLayerClass();
road3.FeatureClass = pFWorkspace.OpenFeatureClass("netway");
road3.Name = road3.FeatureClass.AliasName;
axMapControl1.AddLayer(road3, 0);
//为Network Dataset生成一个图层,并将该图层添加到axMapCon1中
ILayer layer; //网络图层
INetworkLayer networkLayer = new NetworkLayerClass();
networkLayer.NetworkDataset = networkDataset;
layer = networkLayer as ILayer;
layer.Name = "Network Dataset";
axMapControl1.AddLayer(layer, 0);
//生成一个网络分析图层并添加到axMapControl1中
INALayer naLayer = m_NAContext.Solver.CreateLayer(m_NAContext);
ILayer layer1 = naLayer as ILayer;
layer1.Name = m_NAContext.Solver.DisplayName;
axMapControl1.AddLayer(layer1, 0);
m_ipActiveView = axMapControl1.ActiveView;
m_ipMap = m_ipActiveView.FocusMap;
pGC = m_ipMap as IGraphicsContainer;
//定义变量
INAContext m_NAContext; //网络分析上下文
IFeatureWorkspace pFWorkspace;
INetworkDataset networkDataset; //网络数据集
IFeatureClass inputFClass; //打开stops数据集
IFeatureDataset featureDataset;
bool networkanalasia = false; //判断是否点击netRoute按钮,进入添加旗点阶段
int clickedcount = 0; //mapcontrol上加点时显示点数
IActiveView m_ipActiveView;
IGraphicsContainer pGC;
IMap m_ipMap;
//打开工作空间
public IWorkspace OpenWorkspace(string strGDBName)
{
IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
return workspaceFactory.OpenFromFile(strGDBName, 0);
}
//打开网络数据集
public INetworkDataset OpenNetworkDataset(IWorkspace networkDatasetWorkspace,System.String networkDatasetName,System.String featureDatasetName)
{
if(networkDatasetWorkspace==null||networkDatasetName==""||featureDatasetName==null)
{
return null;
}
IDatasetContainer3 datasetContainer3 = null;
IFeatureWorkspace featureWorkspace = networkDatasetWorkspace as IFeatureWorkspace;
featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
IFeatureDatasetExtensionContainer featureDatasetExtensionContainer = featureDataset as IFeatureDatasetExtensionContainer;
IFeatureDatasetExtension featureDatasetExtension = featureDatasetExtensionContainer.FindExtension(esriDatasetType.esriDTNetworkDataset);
datasetContainer3 = featureDatasetExtension as IDatasetContainer3;
if (datasetContainer3 == null)
return null;
IDataset dataset = datasetContainer3.get_DatasetByName(esriDatasetType.esriDTNetworkDataset, networkDatasetName);
return dataset as INetworkDataset;
}
//创建网络分析上下文
public INAContext CreateSolverContext(INetworkDataset networkDataset)
{
//获取创建网络分析上下文所需的IDENetworkDataset类型参数
IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset);
INASolver naSolver = new NARouteSolver();
INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;
contextEdit.Bind(networkDataset, new GPMessagesClass());
return contextEdit as INAContext;
}
//得到创建网络分析上下文所需的IDENetworkDataset类型参数
public IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset)
{
//将网络数据集QI到DatasetComponent
IDatasetComponent dsComponent = networkDataset as IDatasetComponent;
return dsComponent.DataElement as IDENetworkDataset;
}
//清理已经存在的网络分析上下文于生成的路径,并进入到下一次添加标注点工作状态
private void NewRoute_Click(object sender, EventArgs e)
{
networkanalasia = true;
axMapControl1.CurrentTool = null;
ITable pTable = inputFClass as ITable;
pTable.DeleteSearchedRows(null);
//提取路径前,删除上一次路径Routes网络上下文
IFeatureClass routesFC = m_NAContext.NAClasses.get_ItemByName("Routes") as IFeatureClass;
ITable pTable1 = routesFC as ITable;
pTable1.DeleteSearchedRows(null);
//提取路径前,删除上一次路径Stops网络上下文
INAClass stopsNAClass = m_NAContext.NAClasses.get_ItemByName("Stops") as INAClass;
ITable pTable2 = routesFC as ITable;
pTable2.DeleteSearchedRows(null);
//提取路径前,删除上一次路径Barriers网络上下文
INAClass barriersNAClass = m_NAContext.NAClasses.get_ItemByName("Barriers") as INAClass;
ITable pTable3 = routesFC as ITable;
pTable3.DeleteSearchedRows(null);
pGC.DeleteAllElements();
clickedcount = 0;
axMapControl1.Refresh();
}
//生成最短路径
private void Solve_Click(object sender, EventArgs e)
{
IGPMessages gpMessages = new GPMessagesClass();
LoadNANetworkLocations("Stops", inputFClass, 80);
INASolver naSolver = m_NAContext.Solver;
naSolver.Solve(m_NAContext, gpMessages, null);
//解决完后,删除图层内容
ITable pTable_inputFClass = inputFClass as ITable;
pTable_inputFClass.DeleteSearchedRows(null);
axMapControl1.Refresh();
}
//根据点图层,在网络拓扑图层上确定用户要查找最优路径所用经历的点
private void LoadNANetworkLocations(string strNAClassName, IFeatureClass inputFC, double snapTolerance)
{
INamedSet classes = m_NAContext.NAClasses;
INAClass naClass = classes.get_ItemByName(strNAClassName) as INAClass;
//删除naClass中添加的项
naClass.DeleteAllRows();
//加载网络分析对象,设置容差值
INAClassLoader classLoader = new NAClassLoader();
classLoader.Locator = m_NAContext.Locator;
if (snapTolerance > 0)
classLoader.Locator.SnapTolerance = snapTolerance;
classLoader.NAClass = naClass;
//创建INAClassFiledMap,用于字段映射
INAClassFieldMap fieldMap = new NAClassFieldMap();
fieldMap.set_MappedField("ObjectID", "OBJECTID");
classLoader.FieldMap = fieldMap;
//加载网络分析类
int rowsIn = 0;
int rowsLocated = 0;
IFeatureCursor featureCursor = inputFC.Search(null, true);
classLoader.Load((ICursor)featureCursor, null, ref rowsIn, ref rowsLocated);
((INAContextEdit)m_NAContext).ContextChanged();
}
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (networkanalasia == true)
{
IPointCollection m_ipPoints = new MultipointClass(); //输入点集合
IPoint ipNew = axMapControl1.ActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
object o = Type.Missing;
m_ipPoints.AddPoint(ipNew, ref o, ref o);
CreateFeature(inputFClass, m_ipPoints); //获鼠标点击最近点
//把得到的最近点显示出来
ITextElement textlement = new TextElementClass();
IElement element = textlement as IElement;
ITextSymbol textSymbol = new TextSymbol();
textSymbol.Color = GetRGB(189, 190, 0);
textSymbol.Size = 30;
textlement.Symbol = textSymbol;
clickedcount++;
textlement.Text = clickedcount.ToString();
element.Geometry = m_ipActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(e.x, e.y);
pGC.AddElement(element, 0);
m_ipActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
}
}
private IRgbColor GetRGB(int r, int g, int b)
{
IRgbColor pColor = new RgbColorClass();
pColor.Red = r;
pColor.Green = g;
pColor.Blue = b;
return pColor;
}
//获取距离鼠标点击最近的点
public void CreateFeature(IFeatureClass featureClass, IPointCollection PointCollection)
{
//是否为点图层
if (featureClass.ShapeType != esriGeometryType.esriGeometryPoint)
{
return;
}
//创建点要素
for(int i=0;i<PointCollection.PointCount;i++)
{
IFeature feature = featureClass.CreateFeature();
feature.Shape = PointCollection.get_Point(i);
IRowSubtypes rowSubtypes = (IRowSubtypes)feature;
feature.Store();
}
}
在实现网络分析之前,一定要先在arcmap中创建要素集,网络要素集,可以现在arcmap实现网络分析,因为我第一次是分析的时候就是直接用代码写的,然后一直报错误,最后发现是我自己矢量化有问题。所以先在arcmap中实现网络分析比较好。在调试过程中,可能会遇到没有许可证的问题,这个问题只需要在License控件中勾选Network Analyst就可以了。