1、利用网络数据集求解最短路径分析的代码:
原始程序如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.NetworkAnalyst;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Display;
namespace test_shortestpath
{
e)
public partial class Form1 : Form
{
public Form1()
{
}
InitializeComponent();
Intialize();
private void toolStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs
{
}
private void Form1_Load(object sender, EventArgs e)
{
}
private INAContext m_NAContext;
private INetworkDataset networkdataset;
private IFeatureClass inputFClass;
private IFeatureWorkspace pFWorkspace;
private IFeatureDataset featuredataset;
private bool networkanalasia = false;
private int clickedcount = 0;
private IActiveView m_ipactiveview;
private IGraphicsContainer pGC;
private IMap m_ipmap;
private void Intialize()
{
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, 17) == "test-shorestpaths")
break;
string name = path.Substring(0, t - 1) + "\\test-analysis\\shortpath.gdb";*/
string name = "E:\\AGtranning\\test-analysis\\shortpath.gdb";
pFWorkspace = openworkspace(name) as IFeatureWorkspace;
networkdataset = opennetworkdataset(pFWorkspace as IWorkspace, "Test_ND",
"Test");
m_NAContext = creatsolvercontext(networkdataset);
inputFClass = pFWorkspace.OpenFeatureClass("stops");
IFeatureLayer vertex = new FeatureLayerClass();
vertex.FeatureClass = pFWorkspace.OpenFeatureClass("Test_ND_Junctions");
vertex.Name = vertex.FeatureClass.AliasName;
axMapControl1.AddLayer(vertex, 0);
IFeatureLayer road3;
road3= new FeatureLayerClass();
road3.FeatureClass = pFWorkspace.OpenFeatureClass("street");
road3.Name = road3.FeatureClass.AliasName;
axMapControl1.AddLayer(road3, 0);
axMapControl1.Refresh();
ILayer layer;
INetworkLayer networklayer;
networklayer = new NetworkLayerClass();
networklayer.NetworkDataset = networkdataset;
layer = networklayer as ILayer;
layer.Name = "Network Dataset";
axMapControl1.AddLayer(layer, 0);
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 = new FileGDBWorkspaceFactoryClass();
IWorkspace workspace = workspacefactory.OpenFromFile(strGDBName,0);
return workspace;
public INetworkDataset opennetworkdataset(IWorkspace networkdatasetworkspace,
System.String networkdatasetname, System.String featuredatasetname)
{
== null)
/*if (networkdataset == null || networkdatasetname == "" || featuredatasetname
{
}*/
return null;
IDatasetContainer3 datasetcontainer3 = null;
ESRI.ArcGIS.Geodatabase.IFeatureWorkspace featureWorkspace =
networkdatasetworkspace as ESRI.ArcGIS.Geodatabase.IFeatureWorkspace; // Dynamic Cast
featuredataset = featureWorkspace.OpenFeatureDataset(featuredatasetname);
ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtensionContainer
featureDatasetExtensionContainer = featuredataset as
ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtensionContainer; // Dynamic Cast
ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtension featureDatasetExtension =
featureDatasetExtensionContainer.FindExtension(ESRI.ArcGIS.Geodatabase.esriDatasetType.
esriDTNetworkDataset);
datasetcontainer3 = featureDatasetExtension as
ESRI.ArcGIS.Geodatabase.IDatasetContainer3; // Dynamic Cast
/*
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;
ESRI.ArcGIS.Geodatabase.IDataset dataset =
datasetcontainer3.get_DatasetByName(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetwo
rkDataset, networkdatasetname);
return dataset as ESRI.ArcGIS.Geodatabase.INetworkDataset; // Dynamic Cast
/*
IDataset dataset =
datasetcontainer3.get_DatasetByName(esriDatasetType.esriDTNetworkDataset,
networkdatasetname);
return dataset as INetworkDataset;*/
}
public INAContext creatsolvercontext(INetworkDataset networkdataset)
{
IDENetworkDataset dends = getdenetworkdataset(networkdataset);
INASolver nasolver = new NARouteSolver();
INAContextEdit contextedit = nasolver.CreateContext(dends, nasolver.Name) as
INAContextEdit;
IGPMessages igpmessage = new GPMessagesClass();
contextedit.Bind(networkdataset,igpmessage);
return contextedit as INAContext;
}
public IDENetworkDataset getdenetworkdataset(INetworkDataset networkdataset)
{
}
IDatasetComponent dscomponent;
dscomponent = networkdataset as IDatasetComponent;
return dscomponent.DataElement as IDENetworkDataset;
private void button1_Click(object sender, EventArgs e)
{
networkanalasia = true;
axMapControl1.CurrentTool = null;
/*ITable pTable = inputFClass as ITable;
pTable.DeleteSearchedRows(null);*/
IFeatureClass routesFC;
routesFC = m_NAContext.NAClasses.get_ItemByName("Routes") as IFeatureClass;
ITable pTable1 = routesFC as ITable;
pTable1.DeleteSearchedRows(null);
INAClass stopsNAClass = m_NAContext.NAClasses.get_ItemByName("Stops") as
ITable pTable2 = stopsNAClass as ITable;
pTable2.DeleteSearchedRows(null);
INAClass barriersNAClass = m_NAContext.NAClasses.get_ItemByName("Barriers")
INAClass;
as INAClass;
ITable pTable3 = barriersNAClass as ITable;
pTable3.DeleteSearchedRows(null);
IFeatureClass getroute = pFWorkspace.OpenFeatureClass("get_route");
ITable pTable4 = getroute as ITable;
pTable4.DeleteSearchedRows(null);
pGC.DeleteAllElements();
clickedcount = 0;
axMapControl1.Refresh();
}
private void axMapConture1_OnMouseDown(object sender,
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 TextSymbolClass();
textSymbol.Color = getrgb(189, 190, 0);
textSymbol.Size = 30;
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);
}
}
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();
private void button2_Click(object sender, EventArgs e)
{
}
IGPMessages gpMessages = new GPMessagesClass();
LoadNANetworkLoactions("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();
public void LoadNANetworkLoactions(string strNAClassName, IFeatureClass inputFC,
double snapTolerance)
{
INAClass naClass;
INamedSet classes;
classes = m_NAContext.NAClasses;
naClass = classes.get_ItemByName(strNAClassName) as INAClass;
naClass.DeleteAllRows();
INAClassLoader classLoader = new NAClassLoader();
classLoader.Locator = m_NAContext.Locator;
if (snapTolerance > 0)
{
}
classLoader.Locator.SnapTolerance = snapTolerance;
classLoader.NAClass = naClass;
INAClassFieldMap fieldmap;
fieldmap = new NAClassFieldMap();
fieldmap.set_MappedField("FID", "FID");
classLoader.FieldMap = fieldmap;
int rowsln = 0;
int rowsloadted = 0;
IFeatureCursor featurecursor = inputFC.Search(null, true);
classLoader.Load((ICursor)featurecursor, null, ref rowsln, ref rowsloadted);
((INAContextEdit)m_NAContext).ContextChanged();
}
}
}
2、Arcgis engine 在进行最短路径分析时候,代码不存在任何问题,但是在运
行后出现如下问题:
AE10.1 软件也没有任何问题,并且权限都有。
解决方案:
重新调整 licence 空间属性中的设置就行。