//查找最近某点最近的线 public static IFeature GetNearestFeature(IPoint pPoint) { try { double minDistince, Distiance; IFeature pFeatureNearst, pFeature; IProximityOperator pProximityOperator = pPoint as IProximityOperator; IFeatureLayer pFeatureLayer = CDataImport.ImportFeatureLayerFromControltext(@"C:\Users\Administrator\Desktop\突发环境事件应急资源调度系统\data\road.shp"); IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false); pFeature = pFeatureNearst = pFeatureCursor.NextFeature(); if (pFeature == null) { return(null); } minDistince = Distiance = pProximityOperator.ReturnDistance(pFeature.Shape as IGeometry); pFeature = pFeatureCursor.NextFeature(); while (pFeature != null) { Distiance = pProximityOperator.ReturnDistance(pFeature.Shape as IGeometry); if (minDistince > Distiance) { minDistince = Distiance; pFeatureNearst = pFeature; } pFeature = pFeatureCursor.NextFeature(); } System.GC.Collect(); System.GC.WaitForPendingFinalizers(); return(pFeatureNearst); } catch (Exception ex) { MessageBox.Show(ex.ToString(), "异常"); return(null); } }
private void InitializationRoadNetwork(IFeatureLayer DepotLayer, IFeatureLayer DestLayer, List <RoadNetwork> pRoadNetwork) { IFeature pFeaturePoint = null; IFeature pFeatureLine = null; int PointObjectIndex, LineStartIndex, LineEndIndex, LineWeightIndex, LineNameIndex, LineObjectIndex; string PointID, LineStartID, LineEndID, LineName, pLineID; double Length; Node pNode = null; //初始化路径网络的结点信息 IFeatureLayer pFeatureLayerPoint = CDataImport.ImportFeatureLayerFromControltext(@"C:\Users\Administrator\Desktop\突发环境事件应急资源调度系统\data\point.shp"); IFeatureClass pFeatureClassPoint = pFeatureLayerPoint.FeatureClass; IFeatureCursor pFeatureCursorPoint = pFeatureClassPoint.Search(null, false); pFeaturePoint = pFeatureCursorPoint.NextFeature(); try { while (pFeaturePoint != null) { PointObjectIndex = pFeaturePoint.Fields.FindField("OBJECTID"); PointID = Convert.ToString(pFeaturePoint.get_Value(PointObjectIndex)); pNode = new Node(PointID); NodeList.Add(pNode); pFeaturePoint = pFeatureCursorPoint.NextFeature(); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "异常"); } //初始化路径网络的路线信息 IFeatureLayer pFeatureLayerLine = CDataImport.ImportFeatureLayerFromControltext(@"C:\Users\Administrator\Desktop\突发环境事件应急资源调度系统\data\road.shp"); IFeatureClass pFeatureClassLine = pFeatureLayerLine.FeatureClass; IFeatureCursor pFeatureCursorLine = pFeatureClassLine.Search(null, false); pFeatureLine = pFeatureCursorLine.NextFeature(); try { while (pFeatureLine != null) { LineObjectIndex = pFeatureLine.Fields.FindField("OBJECTID"); LineStartIndex = pFeatureLine.Fields.FindField("StartNodeI"); LineEndIndex = pFeatureLine.Fields.FindField("EndNodeID"); LineWeightIndex = pFeatureLine.Fields.FindField("Minutes"); LineNameIndex = pFeatureLine.Fields.FindField("Name"); LineName = Convert.ToString(pFeatureLine.get_Value(LineNameIndex)); pLineID = Convert.ToString(pFeatureLine.get_Value(LineObjectIndex)); if (pRoadNetwork[Convert.ToInt32(pLineID) - 1].VehicleNumber != 0) { Length = (double)pFeatureLine.get_Value(LineWeightIndex) * pRoadNetwork[Convert.ToInt32(pLineID) - 1].VehicleNumber; } else { Length = (double)pFeatureLine.get_Value(LineWeightIndex); } for (int index = 0; index < 2; index++) { if (index == 0) { LineStartID = Convert.ToString(pFeatureLine.get_Value(LineStartIndex)); LineEndID = Convert.ToString(pFeatureLine.get_Value(LineEndIndex)); Edge pEdge = new Edge(); pEdge.StartNodeID = LineStartID; pEdge.EndNodeID = LineEndID; pEdge.Weight = Length; pEdge.name = LineName; pEdge.line = pFeatureLine.Shape as IPolyline; pEdge.pLineID = pLineID; NodeList[Convert.ToInt32(LineStartID) - 1].EdgeList.Add(pEdge); } else if (index == 1) { LineStartID = Convert.ToString(pFeatureLine.get_Value(LineEndIndex)); LineEndID = Convert.ToString(pFeatureLine.get_Value(LineStartIndex)); Edge pEdge = new Edge(); pEdge.StartNodeID = LineStartID; pEdge.EndNodeID = LineEndID; pEdge.Weight = Length; pEdge.name = LineName; pEdge.line = pFeatureLine.Shape as IPolyline; pEdge.pLineID = pLineID; NodeList[Convert.ToInt32(LineStartID) - 1].EdgeList.Add(pEdge); } } pFeatureLine = pFeatureCursorLine.NextFeature(); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "异常"); } //读取应急资源仓库信息 IFeature pFeatureDepot; IFeatureLayer pFeatureLayerDepot = DepotLayer; IFeatureClass pFeatureClassDepot = pFeatureLayerDepot.FeatureClass; int DepotFeatureCount = pFeatureClassDepot.FeatureCount(null); DepotName = new string[DepotFeatureCount]; DepotNodeID = new int[DepotFeatureCount]; int DepotCount = 0; IFeatureCursor pFeatureCursorDepot = pFeatureClassDepot.Search(null, false); pFeatureDepot = pFeatureCursorDepot.NextFeature(); int numbercount = 0; while (pFeatureDepot != null) { IPoint depotpoint = pFeatureDepot.Shape as IPoint; IPoint depotpointtemp = new PointClass(); IFeatureCursor pFeatureCursorpointTemp = pFeatureClassPoint.Search(null, false); IFeature pFeaturepointTemp = pFeatureCursorpointTemp.NextFeature(); while (pFeaturepointTemp != null) { depotpointtemp = pFeaturepointTemp.Shape as IPoint; if (depotpoint.X == depotpointtemp.X && depotpoint.Y == depotpointtemp.Y) { DepotNodeID[numbercount] = Convert.ToInt32(pFeaturepointTemp.get_Value(pFeaturepointTemp.Fields.FindField("OBJECTID"))); numbercount++; } pFeaturepointTemp = pFeatureCursorpointTemp.NextFeature(); } DepotName[DepotCount] = Convert.ToString(pFeatureDepot.get_Value(pFeatureDepot.Fields.FindField("FID"))); DepotCount++; IPoint pDepotpoint = pFeatureDepot.Shape as IPoint; object O = Type.Missing; DepotPoint.AddPoint(pDepotpoint, ref O, ref O); pFeatureDepot = pFeatureCursorDepot.NextFeature(); } //读取应急处置空间位置点数据 IFeature pFeatureDest; IFeatureLayer pFeatureLayerDest = DestLayer; IFeatureClass pFeatureClassDest = pFeatureLayerDest.FeatureClass; int DestFeatureCount = pFeatureClassDest.FeatureCount(null); DestName = new string[DestFeatureCount]; int DestCount = 0; IFeatureCursor pFeatureCursorDest = pFeatureClassDest.Search(null, false); pFeatureDest = pFeatureCursorDest.NextFeature(); while (pFeatureDest != null) { DestName[DestCount] = Convert.ToString(pFeatureDest.get_Value(pFeatureDest.Fields.FindField("FID"))); DestCount++; IPoint pDestpoint = pFeatureDest.Shape as IPoint; object O = Type.Missing; DestPoint.AddPoint(pDestpoint, ref O, ref O); pFeatureDest = pFeatureCursorDest.NextFeature(); } }
//获取应急资源调度路线 public List <VehicleRouteResult> GetVehicleRoad(Collection <RouteNode> routeNodes, IPoint Depotpoint, IPoint Deptpoint) { try { List <VehicleRouteResult> pVehicleRouteResultList = new List <VehicleRouteResult>(); IFeatureLayer pFeatureLayerPoint = CDataImport.ImportFeatureLayerFromControltext(@"C:\Users\Administrator\Desktop\突发环境事件应急资源调度系统\data\point.shp"); IFeatureClass pFeatureClassPoint = pFeatureLayerPoint.FeatureClass; object pObject = Type.Missing; for (int i = 0; i < routeNodes.Count; i++) { VehicleRouteResult vehiclerouteresult = new VehicleRouteResult(); if (i == routeNodes.Count - 1) { break; } int StartID = Convert.ToInt32(routeNodes[i].NodeID); string EndID = Convert.ToString(routeNodes[i + 1].NodeID); //当路线的起点是应急资源仓库时,添加应急资源仓库为起点 if (i == 0) { vehiclerouteresult.Startpoint = Depotpoint; } //当路线的终点是应急处置空间位置时,添加应急处置空间位置为终点 if (i == routeNodes.Count - 2) { vehiclerouteresult.Endpoint = Deptpoint; } //添加线的结束点 IQueryFilter pQueryFilterEndNodeID = new QueryFilterClass(); pQueryFilterEndNodeID.WhereClause = "OBJECTID=" + "'" + Convert.ToString(EndID) + "'"; IFeatureCursor pFeatureCursorEndNodeID = pFeatureClassPoint.Search(pQueryFilterEndNodeID, false); IFeature pFeatureEndNodeID = pFeatureCursorEndNodeID.NextFeature(); while (pFeatureEndNodeID != null) { vehiclerouteresult.Endpoint = pFeatureEndNodeID.Shape as IPoint; pFeatureEndNodeID = pFeatureCursorEndNodeID.NextFeature(); } //添加线的开始点 IQueryFilter pQueryFilterStartNodeID = new QueryFilterClass(); pQueryFilterStartNodeID.WhereClause = "OBJECTID=" + "'" + Convert.ToString(StartID) + "'"; IFeatureCursor pFeautreCursorStartNodeID = pFeatureClassPoint.Search(pQueryFilterStartNodeID, false); IFeature pFeatureStartNodeID = pFeautreCursorStartNodeID.NextFeature(); while (pFeatureStartNodeID != null) { vehiclerouteresult.Startpoint = pFeatureStartNodeID.Shape as IPoint; pFeatureStartNodeID = pFeautreCursorStartNodeID.NextFeature(); } //添加路线 Node pNode = NodeList[StartID - 1]; for (int j = 0; j < pNode.EdgeList.Count; j++) { if (pNode.EdgeList[j].EndNodeID == EndID) { vehiclerouteresult.pLine = pNode.EdgeList[j].line; vehiclerouteresult.pLineID = pNode.EdgeList[j].pLineID; vehiclerouteresult.StartpointID = Convert.ToString(StartID); vehiclerouteresult.EndpointID = Convert.ToString(EndID); break; } } pVehicleRouteResultList.Add(vehiclerouteresult); } return(pVehicleRouteResultList); } catch (Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.ToString(), "异常"); return(null); } }
private void InitializationRoadNetwork(List <RoadNetwork> pRoadNetwork) { IFeature pFeaturePoint = null; IFeature pFeatureLine = null; int PointObjectIndex, LineStartIndex, LineEndIndex, LineWeightIndex, LineNameIndex, LineObjectIndex; string PointID, LineStartID, LineEndID, LineName, pLineID; double Length; Node pNode = null; //初始化路径网络的结点信息 IFeatureLayer pFeatureLayerPoint = CDataImport.ImportFeatureLayerFromControltext(@"C:\Users\Administrator\Desktop\突发环境事件应急资源调度系统\data\point.shp"); IFeatureClass pFeatureClassPoint = pFeatureLayerPoint.FeatureClass; IFeatureCursor pFeatureCursorPoint = pFeatureClassPoint.Search(null, false); pFeaturePoint = pFeatureCursorPoint.NextFeature(); try { while (pFeaturePoint != null) { PointObjectIndex = pFeaturePoint.Fields.FindField("OBJECTID"); PointID = Convert.ToString(pFeaturePoint.get_Value(PointObjectIndex)); pNode = new Node(PointID); NodeList.Add(pNode); pFeaturePoint = pFeatureCursorPoint.NextFeature(); } } catch (Exception ex) { MessageBox.Show(ex.ToString(), "异常"); } //初始化路径网络的路线信息 IFeatureLayer pFeatureLayerLine = CDataImport.ImportFeatureLayerFromControltext(@"C:\Users\Administrator\Desktop\突发环境事件应急资源调度系统\data\road.shp"); IFeatureClass pFeatureClassLine = pFeatureLayerLine.FeatureClass; IFeatureCursor pFeatureCursorLine = pFeatureClassLine.Search(null, false); pFeatureLine = pFeatureCursorLine.NextFeature(); try { while (pFeatureLine != null) { LineObjectIndex = pFeatureLine.Fields.FindField("OBJECTID"); LineStartIndex = pFeatureLine.Fields.FindField("StartNodeI"); LineEndIndex = pFeatureLine.Fields.FindField("EndNodeID"); LineWeightIndex = pFeatureLine.Fields.FindField("Minutes"); LineNameIndex = pFeatureLine.Fields.FindField("Name"); LineName = Convert.ToString(pFeatureLine.get_Value(LineNameIndex)); pLineID = Convert.ToString(pFeatureLine.get_Value(LineObjectIndex)); if (pRoadNetwork[Convert.ToInt32(pLineID) - 1].VehicleNumber != 0) { Length = (Convert.ToDouble(pFeatureLine.get_Value(LineWeightIndex))) * pRoadNetwork[Convert.ToInt32(pLineID) - 1].VehicleNumber; } else { Length = Convert.ToDouble(pFeatureLine.get_Value(LineWeightIndex)); } for (int index = 0; index < 2; index++) { if (index == 0) { LineStartID = Convert.ToString(pFeatureLine.get_Value(LineStartIndex)); LineEndID = Convert.ToString(pFeatureLine.get_Value(LineEndIndex)); Edge pEdge = new Edge(); pEdge.StartNodeID = LineStartID; pEdge.EndNodeID = LineEndID; pEdge.Weight = Length; pEdge.name = LineName; pEdge.line = pFeatureLine.Shape as IPolyline; pEdge.pLineID = pLineID; NodeList[Convert.ToInt32(LineStartID) - 1].EdgeList.Add(pEdge); } else if (index == 1) { LineStartID = Convert.ToString(pFeatureLine.get_Value(LineEndIndex)); LineEndID = Convert.ToString(pFeatureLine.get_Value(LineStartIndex)); Edge pEdge = new Edge(); pEdge.StartNodeID = LineStartID; pEdge.EndNodeID = LineEndID; pEdge.Weight = Length; pEdge.name = LineName; pEdge.line = pFeatureLine.Shape as IPolyline; pEdge.pLineID = pLineID; NodeList[Convert.ToInt32(LineStartID) - 1].EdgeList.Add(pEdge); } } pFeatureLine = pFeatureCursorLine.NextFeature(); } } catch (Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.ToString(), "异常"); } }