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))); }
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); } }