Ejemplo n.º 1
0
        public GraphTable(IGraphTableAdapter adapter)
        {
            _adapter = adapter;

            _table = new DataTable();
            _table.Columns.Add(new DataColumn("N1", typeof(int)));
            _table.Columns.Add(new DataColumn("N2", typeof(int)));
            _table.Columns.Add(new DataColumn("EID", typeof(int)));
            _table.Columns.Add(new DataColumn("LENGTH", typeof(double)));
            _table.Columns.Add(new DataColumn("GEOLEN", typeof(double)));

            _table.Columns.Add(new DataColumn("COST", typeof(double)));
            _table.Columns.Add(new DataColumn("PN", typeof(int)));
        }
Ejemplo n.º 2
0
        async public Task <IGraphEdge> GetGraphEdge(IPoint point, double tolerance)
        {
            if (point == null)
            {
                return(null);
            }
            SpatialFilter filter = new SpatialFilter();

            filter.Geometry = new Envelope(point.X - tolerance, point.Y - tolerance,
                                           point.X + tolerance, point.Y + tolerance);
            filter.AddField("FDB_SHAPE");
            filter.AddField("FDB_OID");

            using (IFeatureCursor cursor = await GetEdgeFeatures(filter))
            {
                IFeature feature, selected = null;
                double   selectedDist = double.MaxValue;
                int      selectedFcId = int.MinValue;
                IPoint   snappedPoint = null;
                while ((feature = await cursor.NextFeature()) != null)
                {
                    if (!(feature.Shape is IPolyline) ||
                        feature.FindField("NETWORK#FCID") == null)
                    {
                        continue;
                    }

                    int fcid = (int)feature["NETWORK#FCID"];

                    double dist, stat;
                    IPoint spoint = gView.Framework.SpatialAlgorithms.Algorithm.Point2PolylineDistance((IPolyline)feature.Shape, point, out dist, out stat);
                    if (spoint == null)
                    {
                        continue;
                    }

                    if (selected == null || dist <= selectedDist)
                    {
                        if (fcid != -1)
                        {
                            #region Do complex Edge exists
                            IFeatureClass complexEdgeFc = _edgeFcs[-1];
                            if (complexEdgeFc != null)
                            {
                                QueryFilter complexEdgeFilter = new QueryFilter();
                                complexEdgeFilter.WhereClause = "FCID=" + fcid + " AND OID=" + feature.OID;
                                complexEdgeFilter.AddField("FDB_OID");
                                using (IFeatureCursor complexEdgeCursor = await complexEdgeFc.GetFeatures(complexEdgeFilter))
                                {
                                    if (await complexEdgeCursor.NextFeature() != null)
                                    {
                                        continue;
                                    }
                                }
                            }
                            #endregion
                        }
                        selected     = feature;
                        selectedDist = dist;
                        selectedFcId = fcid;
                        snappedPoint = spoint;
                    }
                }
                if (selected == null)
                {
                    return(null);
                }

                int eid = -1;
                if (selectedFcId == -1)
                {
                    #region Complex Edge
                    object eidObj = await _fdb._conn.QuerySingleField("SELECT EID FROM " + _fdb.TableName("FC_" + _name + "_ComplexEdges") + " WHERE FDB_OID=" + selected.OID, "EID");

                    if (eidObj != null)
                    {
                        eid = (int)eidObj;
                    }
                    #endregion
                }
                else
                {
                    object eidObj = await _fdb._conn.QuerySingleField("SELECT EID FROM " + _fdb.TableName(_name + "_EdgeIndex") + " WHERE FCID=" + selectedFcId + " AND OID=" + selected.OID, "EID");

                    if (eidObj != null)
                    {
                        eid = (int)eidObj;
                    }
                }

                if (eid != -1)
                {
                    point.X = snappedPoint.X;
                    point.Y = snappedPoint.Y;

                    IGraphTableAdapter gt = this.GraphTableAdapter();
                    return(gt.QueryEdge(eid));
                }
                return(null);
            }
        }