コード例 #1
0
        //查找最近某点最近的线
        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);
            }
        }
コード例 #2
0
        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();
            }
        }
コード例 #3
0
        //获取应急资源调度路线
        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);
            }
        }
コード例 #4
0
        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(), "异常");
            }
        }