📄 pathfinder.cs
字号:
IPolyline pline = geometry as IPolyline;
geoCollection.AddGeometryCollection(pline as IGeometryCollection);
eidInfo = enumEIDInfo.Next();
}
return _polyLine;
}
set
{
_enumNetEID_Junctions = null;
_enumNetID_Edges = null;
_polyLine = null;
}
}
#endregion
#region 初始化
/// <summary>
/// 打开SDE网络工作空间
/// </summary>
/// <param name="featureDatasetName"></param>
private void OpenSdeNetwork(IPropertySet iPropertySet, string featureDatasetName)
{
//IPropertySet iPropertySet = new PropertySetClass();
//iPropertySet.SetProperty("Server", "10.21.106.123");
//iPropertySet.SetProperty("Instance", "5151/tcp");
////iPropertySet.SetProperty("Database", "");
//iPropertySet.SetProperty("user", "szgis");
//iPropertySet.SetProperty("password", "szgis");
//iPropertySet.SetProperty("version", "sde.DEFAULT");
IWorkspaceFactory workspaceFactory;
IWorkspace workspace;
IFeatureWorkspace featureWorkspace;
IFeatureDataset featureDataset;
//Clear every and make a preparation
CloseWorkspace();
workspaceFactory = new SdeWorkspaceFactoryClass();
//Get the workspace
workspace = workspaceFactory.Open(iPropertySet, 0);
featureWorkspace = workspace as IFeatureWorkspace;
try
{
featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
//Initialize network and map
Debug.Assert(InitializeNetworkAndMap(featureDataset) == true, "打开指定的数据集失败!");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
/// <summary>
/// 打开SDE网络工作空间
/// </summary>
private void OpenAccessNetwork(string fileName,string featureDatasetName)
{
IWorkspaceFactory workspaceFactory;
IWorkspace workspace;
IFeatureWorkspace featureWorkspace;
IFeatureDataset featureDataset;
//Clear every and make a preparation
CloseWorkspace();
workspaceFactory = new AccessWorkspaceFactoryClass();
//Get the workspace
workspace = workspaceFactory.OpenFromFile(fileName, 0);
featureWorkspace = workspace as IFeatureWorkspace;
try
{
featureDataset = featureWorkspace.OpenFeatureDataset(featureDatasetName);
//Initialize network and map
Debug.Assert(InitializeNetworkAndMap(featureDataset) == true, "打开指定的数据集失败!");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
/// <summary>
/// 初始化用于路径分析的网络和地图
/// </summary>
/// <param name="featureDataset"></param>
/// <returns></returns>
private bool InitializeNetworkAndMap(IFeatureDataset featureDataset)
{
INetworkCollection networkCollection;
INetwork network;
IFeatureClassContainer featureClassContainer;
IFeatureClass featureClass;
IGeoDataset geoDataset;
ILayer layer;
IFeatureLayer featureLayer;
IEnvelope envelope, maxEnvelope;
double width, height, searthTool;
//Get networks
networkCollection = featureDataset as INetworkCollection;
int count = networkCollection.GeometricNetworkCount;
Debug.Assert(count > 0, "No network found");
_geometricNetwork = networkCollection.get_GeometricNetwork(0);
if (_geometricNetwork == null)
return false; ;
network = _geometricNetwork.Network;
_netElements = network as INetElements;
//Add each featureClass as a Map layer
if (_map.LayerCount == 0 || _map == null)
{
if (_map == null)
_map = new MapClass();
featureClassContainer = _geometricNetwork as IFeatureClassContainer;
count = featureClassContainer.ClassCount;
Debug.Assert(count > 0);
for (int i = 0; i < count; i++)
{
featureClass = featureClassContainer.get_Class(i);
featureLayer = new FeatureLayerClass();
featureLayer.FeatureClass = featureClass;
_map.AddLayer(featureLayer);
}
}
count = _map.LayerCount;
maxEnvelope = new EnvelopeClass();
for (int i = 0; i < count; i++)
{
layer = _map.get_Layer(i);
featureLayer = layer as IFeatureLayer;
geoDataset = featureLayer as IGeoDataset;
envelope = geoDataset.Extent;
//merge with max dimensions
maxEnvelope.Union(envelope);
}
//设置PointToEID的条件,通过它可以找到鼠标点击处的附近指定范围的点或线对象
_pointToEID = new PointToEIDClass();
_pointToEID.SourceMap = _map;
_pointToEID.GeometricNetwork = _geometricNetwork;
//set snap tolerance
width = maxEnvelope.Width;
height = maxEnvelope.Height;
if (width > height)
searthTool = width / 100;
else
searthTool = height / 100;
_pointToEID.SnapTolerance = searthTool;
//设置EIDHelper
_eidHelper = new EIDHelperClass();
_eidHelper.GeometricNetwork = _geometricNetwork;
ISpatialReference spatialReference = _map.SpatialReference;
_eidHelper.OutputSpatialReference = spatialReference;
_eidHelper.ReturnGeometries = true;
_eidHelper.ReturnFeatures = true;
return true;
}
/// <summary>
/// 打开新工作空间前的清理工作
/// </summary>
private void CloseWorkspace()
{
//Clear everything
_enumNetEID_Junctions = null;
_enumNetID_Edges = null;
_geometricNetwork = null;
_pointToEID = null;
}
#endregion
#region 路径分析
/// <summary>
/// 根据之前设置好和条件进行路径分析
/// </summary>
public void GetOptimalPath()
{
if (junctionFlagList.Count < 2)
return;
INetwork network;
ITraceFlowSolverGEN traceFlowSolver;
INetSolver netSolver;
INetWeight netWeight;
INetSolverWeights netSolverWeights;
Debug.Assert(_map != null);
Debug.Assert(_geometricNetwork != null);
traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
netSolver = traceFlowSolver as INetSolver;
//设置不经过路口和道路条件
junctionFlagUnList.ForEach(delegate(IJunctionFlag jf)
{
INetFlag nf = jf as INetFlag;
_selSetBarriers.Add(nf.UserClassID, nf.UserID);
});
edgeFlagUnList.ForEach(delegate(IEdgeFlag ef)
{
INetFlag nf = ef as INetFlag;
_selSetBarriers.Add(nf.UserClassID, nf.UserID);
});
netSolver.SelectionSetBarriers = _selSetBarriers;
// 设置NetSolver和network属性
network = _geometricNetwork.Network;
netSolver.SourceNetwork = network;
IJunctionFlag[] _junctionFlagList;
//IEdgeFlag[] _edgeFlagList;
//设置经过路口和道路条件
_junctionFlagList = junctionFlagList.ToArray();
//_edgeFlagList = edgeFlagList.ToArray();
// 添加经过的路口和道路条件
traceFlowSolver.PutJunctionOrigins(ref _junctionFlagList);
//traceFlowSolver.PutEdgeOrigins(ref _edgeFlagList);
// 添加障碍条件
INetSchema netSchema = network as INetSchema;
netWeight = netSchema.get_Weight(0);
Debug.Assert(netWeight != null);
netSolverWeights = traceFlowSolver as INetSolverWeights;
netSolverWeights.FromToEdgeWeight = netWeight;
netSolverWeights.ToFromEdgeWeight = netWeight;
// initialize array for results to number of segments in result
//ReDim vaRes(intCount - 1)
int count = _junctionFlagList.Length - 1;
object[] segmentCost = new object[count];
traceFlowSolver.FindPath(esriFlowMethod.esriFMConnected, esriShortestPathObjFn.esriSPObjFnMinMax, out _enumNetEID_Junctions, out _enumNetID_Edges, count, ref segmentCost);
_polyLine = null;
}
/// <summary>
/// 根据点的序列获取相应的最佳路径
/// </summary>
/// <param name="pointsList">点的序列,应该为???什么格式的坐标</param>
public OptimalPath GetOptimalPath(IPoint[] pointsList)
{
INetwork network;
ITraceFlowSolverGEN traceFlowSolver;
INetSolver netSolver;
INetWeight netWeight;
INetSolverWeights netSolverWeights;
Debug.Assert(_map != null);
Debug.Assert(_geometricNetwork != null);
traceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
netSolver = traceFlowSolver as INetSolver;
List<IJunctionFlag> JFListTemp = new List<IJunctionFlag>();
for (int i = 0; i < pointsList.Length; i++)
{
int UserClassID, UserID, UserSubID;
int juncEID;
IPoint foundJunctionPoint;
this._pointToEID.GetNearestJunction(pointsList[i], out juncEID, out foundJunctionPoint);
Debug.Assert(juncEID > 0);
//获得UserClassID,UserID,UserSubID
this._netElements.QueryIDs(juncEID, esriElementType.esriETJunction, out UserClassID, out UserID, out UserSubID);
Debug.Assert(UserClassID > 0 && UserID > 0);
INetFlag netFlag = new JunctionFlagClass();
netFlag.UserClassID = UserClassID;
netFlag.UserID = UserID;
netFlag.UserSubID = UserSubID;
JFListTemp.Add(netFlag as IJunctionFlag);
}
// 设置NetSolver和network属性
network = _geometricNetwork.Network;
netSolver.SourceNetwork = network;
//设置经过路口条件
IJunctionFlag[] junctionFlagList;
junctionFlagList = JFListTemp.ToArray();
// 添加经过的路口条件
traceFlowSolver.PutJunctionOrigins(ref junctionFlagList);
//将分析的权值设为道路的长度
INetSchema netSchema = network as INetSchema;
netWeight = netSchema.get_Weight(0);
Debug.Assert(netWeight != null);
netSolverWeights = traceFlowSolver as INetSolverWeights;
netSolverWeights.FromToEdgeWeight = netWeight;
netSolverWeights.ToFromEdgeWeight = netWeight;
int count = junctionFlagList.Length - 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -