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); } }
public SqlFDBNetworkFeatureclass(SqlFDB fdb, IDataset dataset, string name, GeometryDef geomDef) { _fdb = fdb; _fcid = _fdb.FeatureClassID(_fdb.DatasetID(dataset.DatasetName), name); _dataset = dataset; _geomDef = (geomDef != null) ? geomDef : new GeometryDef(); if (_geomDef != null && _geomDef.SpatialReference == null && dataset is IFeatureDataset) { _geomDef.SpatialReference = ((IFeatureDataset)dataset).SpatialReference; } _fields = new Fields(); _name = _aliasname = name; IDatasetElement element = _dataset[_name + "_Nodes"]; if (element != null) { _nodeFc = element.Class as IFeatureClass; } element = _dataset[_name + "_ComplexEdges"]; if (element != null && element.Class is IFeatureClass) { _edgeFcs.Add(-1, (IFeatureClass)element.Class); } DataTable tab = _fdb.Select("FCID", "FDB_NetworkClasses", "NetworkId=" + _fcid); if (tab != null && tab.Rows.Count > 0) { StringBuilder where = new StringBuilder(); where.Append("GeometryType=" + ((int)geometryType.Polyline).ToString() + " AND ID in("); for (int i = 0; i < tab.Rows.Count; i++) { if (i > 0) { where.Append(","); } where.Append(tab.Rows[i]["FCID"].ToString()); } where.Append(")"); tab = _fdb.Select("ID,Name", "FDB_FeatureClasses", where.ToString()); if (tab != null) { foreach (DataRow row in tab.Rows) { element = _dataset[row["Name"].ToString()]; if (element != null && element.Class is IFeatureClass) { _edgeFcs.Add((int)row["ID"], element.Class as IFeatureClass); } } } } _weights = _fdb.GraphWeights(name); Dictionary <Guid, string> weightTableNames = null; Dictionary <Guid, GraphWeightDataType> weightDataTypes = null; if (_weights != null && _weights.Count > 0) { weightTableNames = new Dictionary <Guid, string>(); weightDataTypes = new Dictionary <Guid, GraphWeightDataType>(); foreach (IGraphWeight weight in _weights) { if (weight == null) { continue; } weightTableNames.Add(weight.Guid, _fdb.TableName(_name + "_Weights_" + weight.Guid.ToString("N").ToLower())); weightDataTypes.Add(weight.Guid, weight.DataType); } } _pageManager = new NetworkObjectSerializer.PageManager( System.Data.SqlClient.SqlClientFactory.Instance, _fdb.ConnectionString, _name, _fdb.TableName("FC_" + _name), _fdb.TableName(_name + "_Edges"), _fdb.TableName("FC_" + name + "_Nodes"), weightTableNames, weightDataTypes, _fdb ); }