//! 通过点击获取需要分析的管线 public bool PickBrokePipe(IPoint _pMousePoint) { this.InitClick(); this.ipoint_0 = _pMousePoint; bool flag = false; double num = 2147483647.0; ArrayList arrayList = new ArrayList(); GetMapVisibleILayers(m_iApp.FocusMap, null, arrayList); for (int i = 0; i < arrayList.Count; i++) { IFeatureLayer featureLayer = arrayList[i] as IFeatureLayer; if (featureLayer != null && featureLayer.FeatureClass != null && featureLayer.Visible && m_Config.IsPipelineLayer(featureLayer.FeatureClass.AliasName, enumPipelineDataType.Line)) { IPipelineLayer pipeLayer = m_Config.GetPipelineLayer(featureLayer.FeatureClass.AliasName, enumPipelineDataType.Line); IFeatureDataset featureDataset = featureLayer.FeatureClass.FeatureDataset; IFeatureClassContainer featureClassContainer = featureDataset as IFeatureClassContainer; List <IBasicLayerInfo> basicInfos = pipeLayer.GetLayers(enumPipelineDataType.Junction); IFeatureClass featureClass = basicInfos.Count > 0 ? basicInfos[0].FeatureClass : null; if (featureClass != null && featureClass is INetworkClass) { IGeometricNetwork geometricNetwork = ((INetworkClass)featureClass).GeometricNetwork; IPointToEID pointToEIDClass = new PointToEID(); pointToEIDClass.SourceMap = (m_iApp.FocusMap); pointToEIDClass.GeometricNetwork = (geometricNetwork); pointToEIDClass.SnapTolerance = (m_iApp.ActiveView.Extent.Width / 200.0); int edgeID = 0; IPoint location = null; double percent = 0; pointToEIDClass.GetNearestEdge(this.ipoint_0, out edgeID, out location, out percent); if (location != null && num > percent) { num = percent; _pipeLayer = pipeLayer; this._nearestEdgeInfo.GeometricNetwork = geometricNetwork; this._nearestEdgeInfo.Percent = percent; this._nearestEdgeInfo.EdgeID = edgeID; this._nearestEdgeInfo.Location = location; flag = true; break; } } } } arrayList.Clear(); if (flag) { this.DrawBrokeEdge(); } return(flag); }
public static float GetPipeLineAlarmVerDistByFeatureClassName(IPipelineConfig config, string className1, string className2, string strBuryKind1, string strBuryKind2) { float single; string str; string str1; IBasicLayerInfo pipeLayer1 = config.GetBasicLayerInfo(className1); IBasicLayerInfo pipeLayer2 = config.GetBasicLayerInfo(className2); IPipelineLayer pipeline1 = config.GetPipelineLayer(pipeLayer1.FeatureClass); IPipelineLayer pipeline2 = config.GetPipelineLayer(pipeLayer2.FeatureClass); object pipeLineAlarmVerDist = CommonUtils.GetPipeLineAlarmVerDist(config, pipeline1.ClassCode, pipeline2.ClassCode, strBuryKind1, strBuryKind2); if (pipeLineAlarmVerDist != null) { single = (!Convert.IsDBNull(pipeLineAlarmVerDist) ? Convert.ToSingle(pipeLineAlarmVerDist) : 0f); } else { single = 0f; } return(single); }
public static float GetPipeLineAlarmHrzDistByFeatureClassName2(IPipelineConfig config, string strFeaClassName1, string strFeaClassName2, IFeature pFeature1, IFeature pFeature2) { float single; string str; string str1; IBasicLayerInfo pipeLayer1 = config.GetBasicLayerInfo(strFeaClassName1); IBasicLayerInfo pipeLayer2 = config.GetBasicLayerInfo(strFeaClassName2); IPipelineLayer pipeline1 = config.GetPipelineLayer(pipeLayer1.FeatureClass); IPipelineLayer pipeline2 = config.GetPipelineLayer(pipeLayer2.FeatureClass); object pipeLineAlarmHrzDist2 = CommonUtils.GetPipeLineAlarmHrzDist2(config, pipeline1.ClassCode, pipeline2.ClassCode, pFeature1, pFeature2, pipeLayer1, pipeLayer2); if (pipeLineAlarmHrzDist2 != null) { single = (!Convert.IsDBNull(pipeLineAlarmHrzDist2) ? Convert.ToSingle(pipeLineAlarmHrzDist2) : 0f); } else { single = 0f; } return(single); }
private void StartAnalysis(IFeature feature) { if (feature.FeatureType != esriFeatureType.esriFTSimpleJunction) { MessageService.Current.Warn("请选择管线点"); return; } if (!_pipelineConfig.IsPipelineLayer(feature.Class.AliasName, enumPipelineDataType.Point)) { MessageService.Current.Warn("请选择管线点"); return; } double snapDist = CommonUtils.ConvertPixelsToMapUnits(_context.ActiveView, _context.Config.SnapTolerance); IBasicLayerInfo lineConfig = _plugin.PipeConfig.GetBasicLayerInfo(feature.Class as IFeatureClass) as IBasicLayerInfo; if (this._startPoint == null && _startEid == 0) { //开始记录起始点 IPipelineLayer oldLayer = _pipelineConfig.GetPipelineLayer(feature.Class.AliasName, enumPipelineDataType.Point); if (oldLayer == null) { MessageService.Current.Warn("你选择的图层不是合法的管线图层!"); return; } List <IBasicLayerInfo> basicInfos = oldLayer.GetLayers(enumPipelineDataType.Junction); IFeatureClass featureClass = basicInfos.Count > 0 ? basicInfos[0].FeatureClass : null; if (featureClass == null) { MessageService.Current.Warn("管线图层没有构建网络图层!"); return; } INetworkClass networkClass = featureClass as INetworkClass; _geometricNetwork = networkClass.GeometricNetwork; IPointToEID pnToEid = new PointToEIDClass(); pnToEid.GeometricNetwork = _geometricNetwork; pnToEid.SnapTolerance = snapDist; pnToEid.SourceMap = _context.FocusMap; pnToEid.GetNearestJunction(feature.Shape as IPoint, out _startEid, out _startPoint); return; } IPipelineLayer newLayer = _pipelineConfig.GetPipelineLayer(feature.Class.AliasName, enumPipelineDataType.Point); if (newLayer == null) { MessageService.Current.Warn("你选择的图层不是合法的管线图层!"); return; } List <IBasicLayerInfo> basicInfos1 = newLayer.GetLayers(enumPipelineDataType.Junction); IFeatureClass featureClass2 = basicInfos1.Count > 0 ? basicInfos1[0].FeatureClass : null; if (featureClass2 == null) { MessageService.Current.Warn("第二个管线图层没有构建网络图层!"); return; } INetworkClass networkClass2 = featureClass2 as INetworkClass; if (networkClass2.GeometricNetwork != _geometricNetwork) { if (MessageService.Current.Ask("两个点位属于不同的网络图层,使用第二个网络图层作为分析图层吗?") == false) { return; } _geometricNetwork = networkClass2.GeometricNetwork; IPointToEID pnToEid = new PointToEIDClass(); pnToEid.GeometricNetwork = _geometricNetwork; pnToEid.SnapTolerance = snapDist; pnToEid.SourceMap = _context.FocusMap; pnToEid.GetNearestJunction(feature.Shape as IPoint, out _startEid, out _startPoint); return; } try { IPointToEID pntEid = new PointToEIDClass(); pntEid.GeometricNetwork = _geometricNetwork; pntEid.SourceMap = _context.FocusMap; pntEid.SnapTolerance = snapDist; pntEid.GetNearestJunction(feature.Shape as IPoint, out _endEid, out _endPoint); if (_endEid < 1) { MessageService.Current.Warn("未能找到第二个分析点!"); return; } if (_startEid == _endEid) { MessageService.Current.Warn("起点终点为同一个点!"); return; } INetElements netElements = _geometricNetwork.Network as INetElements; INetworkClass networkClass = feature.Class as INetworkClass; IJunctionFlag[] array = new JunctionFlag[2]; INetFlag netFlag = new JunctionFlag() as INetFlag; int userClassID; int userID; int userSubID; netElements.QueryIDs(_endEid, esriElementType.esriETJunction, out userClassID, out userID, out userSubID); netFlag.UserClassID = (userClassID); netFlag.UserID = (userID); netFlag.UserSubID = (userSubID); IJunctionFlag value = netFlag as IJunctionFlag; array.SetValue(value, 0); INetFlag netFlag2 = new JunctionFlag() as INetFlag; netElements.QueryIDs(_startEid, esriElementType.esriETJunction, out userClassID, out userID, out userSubID); netFlag2.UserClassID = (userClassID); netFlag2.UserID = (userID); netFlag2.UserSubID = (userSubID); value = (netFlag2 as IJunctionFlag); array.SetValue(value, 1); ITraceFlowSolverGEN traceFlowSolverGEN = new TraceFlowSolver() as ITraceFlowSolverGEN; INetSolver netSolver = traceFlowSolverGEN as INetSolver; netSolver.SourceNetwork = _geometricNetwork.Network; traceFlowSolverGEN.PutJunctionOrigins(ref array); object[] array2 = new object[1]; IEnumNetEID enumNetEID; IEnumNetEID enumNetEID2; traceFlowSolverGEN.FindPath((esriFlowMethod)2, (esriShortestPathObjFn)1, out enumNetEID, out enumNetEID2, 1, ref array2); if (this.ipolyline_0 == null) { this.ipolyline_0 = new Polyline() as IPolyline; } IGeometryCollection geometryCollection = this.ipolyline_0 as IGeometryCollection; geometryCollection.RemoveGeometries(0, geometryCollection.GeometryCount); if (enumNetEID2.Count <= 0) { this.ifeature_0 = null; MessageBox.Show("两点之间不存在路径可以连通!"); } else { ShowShortObjectForm showShortObjectForm = new ShowShortObjectForm(_context); showShortObjectForm.pApp = _context; ISpatialReference spatialReference = _context.FocusMap.SpatialReference; IEIDHelper eIDHelperClass = new EIDHelper(); eIDHelperClass.GeometricNetwork = (networkClass.GeometricNetwork); eIDHelperClass.OutputSpatialReference = (spatialReference); eIDHelperClass.ReturnGeometries = (true); eIDHelperClass.ReturnFeatures = (true); IEnumEIDInfo enumEIDInfo = eIDHelperClass.CreateEnumEIDInfo(enumNetEID2); int count = enumEIDInfo.Count; enumEIDInfo.Reset(); for (int i = 0; i < count; i++) { IEIDInfo iEIDInfo = enumEIDInfo.Next(); IGeometry geometry = iEIDInfo.Geometry; if (i == 0) { showShortObjectForm.AddPipeName(this.string_0); } showShortObjectForm.AddFeature(iEIDInfo.Feature); geometryCollection.AddGeometryCollection(geometry as IGeometryCollection); } showShortObjectForm.AddShortPath(this.ipolyline_0); showShortObjectForm.AddLenght(this.ipolyline_0.Length); this.ifeature_2 = feature; EsriUtils.ZoomToGeometry(this.ipolyline_0, _context.MapControl.Map, 1.3); FlashUtility.FlashGeometry(this.ipolyline_0, _context.MapControl); this.ifeature_0 = null; _startEid = 0; _startPoint = null; _geometricNetwork = null; showShortObjectForm.Show(); } } catch (Exception ex) { this.ifeature_0 = null; MessageBox.Show(ex.Message); } }
private void btnAnalysis_Click(object obj, EventArgs eventArgs) { if (cmbDepthType.SelectedIndex < 0) { MessageService.Current.Warn("请先选择埋深数据类型再进行分析!"); return; } this.gridView1.Columns.Clear(); //this.gridControl1.DataRowCount=0;//.Rows.Clear(); IQueryFilter queryFilter = null; bool isM = cmbDepthType.SelectedIndex > 0 ? true : false; if (chkRegionAnalysis.Checked) { ISpatialFilter spatialFilter = new SpatialFilterClass(); spatialFilter.Geometry = _context.ActiveView.Extent; spatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects; queryFilter = spatialFilter as IQueryFilter; } _table = null; foreach (CheckListFeatureLayerItem pclass in this.checkedListBox1.CheckedItems) { IFeatureLayer ifeatureLayer = pclass.m_pFeatureLayer; this.progressBar1.Visible = true; this.progressBar1.Maximum = ifeatureLayer.FeatureClass.FeatureCount(queryFilter); this.progressBar1.Step = 1; this.progressBar1.Value = 0; this.Text = "覆土分析 - 正在处理:" + ifeatureLayer.Name + "..."; IPipelineLayer pipelineLayer = _config.GetPipelineLayer(ifeatureLayer.FeatureClass); IBasicLayerInfo pipeLine = _config.GetBasicLayerInfo(ifeatureLayer.FeatureClass) as IBasicLayerInfo; string lineConfig_Kind = pipelineLayer.Code; string sDepthMethod = ""; string sDepPosition = ""; int num = ifeatureLayer.FeatureClass.Fields.FindField( pipeLine.GetFieldName(PipeConfigWordHelper.LineWords.MSFS)); //基本上没有使用,因为所在位置没有数据 int num2 = ifeatureLayer.FeatureClass.Fields.FindField( pipeLine.GetFieldName(PipeConfigWordHelper.LineWords.SZWZ)); IFeatureCursor featureCursor = ifeatureLayer.Search(queryFilter, false); int qdmsIdx = featureCursor.FindField(pipeLine.GetFieldName(PipeConfigWordHelper.LineWords.QDMS)); int zdmsIdx = featureCursor.FindField(pipeLine.GetFieldName(PipeConfigWordHelper.LineWords.ZDMS)); BuildTable(featureCursor); IFeature feature = featureCursor.NextFeature(); while (feature != null) { this.progressBar1.Value = this.progressBar1.Value + 1; if (feature.Shape == null || feature.Shape.GeometryType != esriGeometryType.esriGeometryPolyline) { feature = featureCursor.NextFeature(); } else { if (num != -1) { sDepthMethod = feature.get_Value(num).ToString(); } if (num2 != -1) { sDepPosition = feature.get_Value(num2).ToString(); } double ruleMS = this.m_RuleMs.GetRuleMS(lineConfig_Kind, sDepthMethod, sDepPosition); if (isM) { IPoint point = ((IPointCollection)feature.Shape).get_Point(0); IPoint point2 = ((IPointCollection)feature.Shape).get_Point(1); if (point.M < ruleMS || point2.M < ruleMS) { this.FillFeatureValue(pipeLine, lineConfig_Kind, feature, ruleMS, point.M, point2.M); } } else { double qdms = qdmsIdx >= 0 ? Convert.ToDouble(feature.Value[qdmsIdx]) : 0; double zdms = qdmsIdx >= 0 ? Convert.ToDouble(feature.Value[zdmsIdx]) : 0; if (qdms < ruleMS || zdms < ruleMS) { this.FillFeatureValue(pipeLine, lineConfig_Kind, feature, ruleMS, qdms, zdms); } } feature = featureCursor.NextFeature(); } } Marshal.ReleaseComObject(featureCursor); this.progressBar1.Visible = false; this.gridControl1.DataSource = _table; } this.Text = "覆土分析--记录数:" + _table.Rows.Count.ToString(); }
public void GetBaseLine(IPoint point) { string str; string str1; string str2; this.timer_0.Stop(); this.dataGridView1.Rows.Clear(); IMap map = this.m_app.FocusMap; IFeature feature = ((IEnumFeature)map.FeatureSelection).Next(); if (feature == null ? true : feature.FeatureType != esriFeatureType.esriFTSimpleEdge) { this.m_commonDistAls.m_pBaseLine = null; this.btAnalyse.Enabled = false; this.m_app.FocusMap.ClearSelection(); this.m_app.ActiveView.Refresh(); //this.tbPipeWidthOrHeight.Text = ""; return; } IFeatureLayer pLayer = CommonUtils.GetLayerByFeatureClassName(m_app.FocusMap, ((IDataset)feature.Class).Name) as IFeatureLayer; IPipelineLayer pipeLayer = m_config.GetPipelineLayer(feature.Class as IFeatureClass); IBasicLayerInfo pipeLine = m_config.GetBasicLayerInfo(feature.Class as IFeatureClass); if (pipeLine == null) { this.m_commonDistAls.m_pBaseLine = null; this.btAnalyse.Enabled = false; this.m_app.FocusMap.ClearSelection(); this.m_app.ActiveView.Refresh(); return; } List <IBasicLayerInfo> basicInfos = pipeLayer.GetLayers(enumPipelineDataType.Junction); IFeatureClass junFeatureClass = basicInfos.Count > 0 ? basicInfos[0].FeatureClass : null; //需要重新获取边信息 IGeometricNetwork geometricNetwork = ((INetworkClass)junFeatureClass).GeometricNetwork; IFeatureClassContainer featureDataset = geometricNetwork.FeatureDataset as IFeatureClassContainer; IPointToEID pointToEIDClass = new PointToEID(); pointToEIDClass.SourceMap = (m_app.FocusMap); pointToEIDClass.GeometricNetwork = (geometricNetwork); pointToEIDClass.SnapTolerance = (m_app.ActiveView.Extent.Width / 200.0); int edgeID = 0; IPoint location = null; double percent = 0; pointToEIDClass.GetNearestEdge(point, out edgeID, out location, out percent); if (edgeID == 0) { return; } int userClassID; int userID; int userSubID; INetElements network = geometricNetwork.Network as INetElements; network.QueryIDs(edgeID, esriElementType.esriETEdge, out userClassID, out userID, out userSubID); IFeatureClass lineClass = featureDataset.ClassByID[userClassID] as IFeatureClass; IFeature lineFeature = lineClass.GetFeature(userID); IGeometry shape = lineFeature.Shape; if (shape.GeometryType == esriGeometryType.esriGeometryPolyline) { this.ipolyline_0 = CommonUtils.GetPolylineDeepCopy((IPolyline)shape); this.m_commonDistAls.m_pFeature = feature; this.m_commonDistAls.m_pBaseLine = this.ipolyline_0; this.m_commonDistAls.m_strLayerName = feature.Class.AliasName; //int num = feature.Fields.FindField("埋设方式"); int num = lineFeature.Fields.FindField(pipeLine.GetFieldName(PipeConfigWordHelper.LineWords.MSFS)); str = (num == -1 ? "" : this.GetDBObjectValue(lineFeature.get_Value(num))); this.m_commonDistAls.m_strBuryKind = str; int num1 = lineFeature.Fields.FindField(pipeLine.GetFieldName(PipeConfigWordHelper.LineWords.GJ)); str1 = (num1 == -1 ? "" : this.GetDBObjectValue(lineFeature.get_Value(num1))); num1 = feature.Fields.FindField(pipeLine.GetFieldName(PipeConfigWordHelper.LineWords.DMCC)); str2 = (num1 == -1 ? "" : lineFeature.get_Value(num1).ToString()); string str3 = ""; if (str1 != "") { str3 = str1; } if (str2 != "") { str3 = str2; } this.m_commonDistAls.m_dDiameter = this.m_commonDistAls.GetDiameterFromString(str3.Trim()); IEdgeFeature edgeFeature = (IEdgeFeature)lineFeature; this.m_commonDistAls.m_nBaseLineFromID = edgeFeature.FromJunctionEID; this.m_commonDistAls.m_nBaseLineToID = edgeFeature.ToJunctionEID; this.btAnalyse.Enabled = this.m_commonDistAls.m_pBaseLine != null; this.chitAnalyse_0.PipeLayer_Class = lineFeature.Class as IFeatureClass; this.chitAnalyse_0.BaseLine_OID = lineFeature.OID; _baseLayerInfo = pipeLine; } else { MessageBox.Show("所选择的管线多于一条,或者不是管线!"); } }