在現實生活中gis者開發的時候難免需要用到網絡分析的功能,爲了更好節省時間,加快開發的效率。故在此共享當時AE開發所用的網絡分析的源碼。願對你有所幫助。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Catalog;
using ESRI.ArcGIS.CatalogUI;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.NetworkAnalysis;
using ESRI.ArcGIS.NetworkAnalyst;
using ESRI.ArcGIS.Display;
using System.IO;
namespace exp
{
public partial class network : Form
{
private INAContext m_NAContext;//網絡分析上下文
private INetworkDataset networkDataset;//網絡數據集
private IFeatureWorkspace pFWorkspace;
private IFeatureClass inputFClass;//打開stops數據集
private IFeatureDataset featureDataset;
private bool networkanalasia = false;//判斷是否點擊新路線按鈕,進入添加起點階段
private int clickedcount = 0;//mapcontrol加點顯示點數
private IActiveView m_ipActiveView;
private IGraphicsContainer PGC;
private IMap m_ipMap;
public network()
{
InitializeComponent();
}
private void initialize()
{
axMapControl1.ActiveView.Clear();
axMapControl1.ActiveView.Refresh();
//獲取當前應用程序的目錄名稱
string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
int t;
for (t = 0; t < path.Length; t++)
{
if (path.Substring(t, 14) == "NetworkAnalasis")
{
break;
}
}
//根據目錄名稱獲取數據存取路徑
string name = path.Substring(0, t - 1) + "\\TestData\\Test.gdb";
//打開工作空間
pFWorkspace = OpenWorkspace(name) as IFeatureWorkspace;
//打開網絡數據集
networkDataset = OpenNetworkDataset(pFWorkspace as IWorkspace, "street_ND", "test");
//創建網絡分析上下文,建立一種解決關係
m_NAContext = CreateSolverContext(networkDataset);
//打開數據集
inputFClass = pFWorkspace.OpenFeatureClass("stops");
//TEST_ND_JUNCTIONS圖層
IFeatureLayer vertex = new FeatureLayerClass();
vertex.FeatureClass = pFWorkspace.OpenFeatureClass("Test_ND_Junctions");
vertex.Name = vertex.FeatureClass.AliasName;
axMapControl1.AddLayer(vertex,0);
//street圖層
IFeatureLayer road3;
road3 = new FeatureLayerClass();
road3.FeatureClass = pFWorkspace.OpenFeatureClass("street");
road3.Name = road3.FeatureClass.AliasName;
axMapControl1.AddLayer(road3, 0);
//爲networkdataset生成一個圖層,並將該圖層添加到axmapcontrol中
ILayer pLayer;//網絡圖層
INetworkLayer pNetworkLayer;
pNetworkLayer = new NetworkLayerClass();
pNetworkLayer.NetworkDataset = networkDataset;
pLayer = pNetworkLayer as ILayer;
pLayer.Name = "Network Dataset";
axMapControl1.AddLayer(pLayer, 0);
//生成一個網絡分析圖層並添加到axmaptrol1中
ILayer layer1;
INALayer nalayer = m_NAContext.Solver.CreateLayer(m_NAContext);
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;
}
//打開工作空間
public IWorkspace OpenWorkspace(string strGDBName)
{
IWorkspaceFactory workspaceFactory;
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 = featureDatasetExtensionContainer 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;
naSolver = new NARouteSolver();
INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;
contextEdit.Bind(networkDataset, new GPMessagesClass());
return contextEdit as INAContext;
return contextEdit as INAContext;
}
//得到創建網絡分析上下文所需的IDENETWORKDATASET類型參數
public IDENetworkDataset GetDENetworkDataset(INetworkDataset networkDataset)
{
//將網絡分析數據集QI添加到DATASETCOMPOENT
IDatasetComponent dstComponent;
dstComponent = networkDataset as IDatasetComponent;
//獲得數據元素
return dstComponent.DataElement as IDENetworkDataset;
}
private void axMapControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnMouseDownEvent e)
{
if (networkanalasia == true)
{
IPointCollection m_ipPoints;//輸入點集合
IPoint ipNew;
m_ipPoints = new MultipointClass();
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);//或者用鼠標點擊最近點
//把最近的點顯示出來
IElement element;
ITextElement textelement = new TextElementClass();
element = textelement as IElement;
ITextSymbol textSymbol = new TextSymbol();
textelement.Symbol = textSymbol;
clickedcount++;
textelement.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);
}
}
//獲取距離鼠標點擊最近的點
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();
}
}
private void axMapControl1_OnDoubleClick(object sender, ESRI.ArcGIS.Controls.IMapControlEvents2_OnDoubleClickEvent e)
{
}
private void toolStripSplitButton1_ButtonClick(object sender, EventArgs e)
{
networkanalasia = true;
axMapControl1.CurrentTool = null;
ITable pTable = inputFClass as ITable;
pTable.DeleteSearchedRows(null);
//提取路徑前,刪除上一次路徑route網絡上下文
IFeatureClass routesFC;
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=stopsNAClass as ITable;
ptable2.DeleteSearchedRows(null);
//提取路徑前,刪除上一次barries網絡上下文
INAClass barriesNAClass = m_NAContext.NAClasses.get_ItemByName("Barriers") as INAClass;
ITable pTable3 = barriesNAClass as ITable;
pTable3.DeleteSearchedRows(null);
//提取路徑前,刪除上次路徑polyline
IFeatureClass getroute = pFWorkspace.OpenFeatureClass("get_route");
ITable ptable_polyline = getroute as ITable;
ptable_polyline.DeleteSearchedRows(null);
PGC.DeleteAllElements();
clickedcount = 0;
axMapControl1.Refresh();
}
private void toolStripSplitButton2_ButtonClick(object sender, EventArgs e)
{
IGPMessages gpMessages = new GPMessagesClass();
loadNANetworkLocations("Stops", inputFClass, 80);
INASolver naSlover = m_NAContext.Solver;
naSlover.Solve(m_NAContext, gpMessages, null);
//解決完後,刪除圖層內容
ITable pTable_inputFClass = inputFClass as ITable;
pTable_inputFClass.DeleteSearchedRows(null);
axMapControl1.Refresh();
}
public void loadNANetworkLocations(string strNAClassName,IFeatureClass inputFC,double snapTolerance)
{
INAClass naClass;
INamedSet classes;
classes =m_NAContext.NAClasses;
naClass=classes.get_ItemByName(strNAClassName) as INAClass;
//刪除naClasses中添加的項
naClass.DeleteAllRows();
//加載網絡分析對象,設置容差值
INAClassLoader classLoader=new NAClassLoader();
classLoader.Locator=m_NAContext.Locator;
if (snapTolerance>0)classLoader.Locator.SnapTolerance=snapTolerance;
classLoader.NAClass=naClass;
//創建INAclassFieldMap,用於字段映射
INAClassFieldMap fieldMap;
fieldMap=new NAClassFieldMap();
//加載網絡分析類
int rowsln=0;
int rowsLocated=0;
IFeatureCursor featureCursor=inputFC.Search(null,true);
classLoader.Load((ICursor)featureCursor,null,ref rowsln,ref rowsLocated);
((INAContextEdit)m_NAContext).ContextChanged();
}
}
}
說明:源碼來源於某本書,但是我不太記得某本書的名字了。代碼是自己手打的,如果有錯誤請進行糾正。