using SuperMap.Analyst.NetworkAnalyst; using SuperMap.Data; using SuperMap.Mapping; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Windows.Forms; using WWPipeLine.MapBasic; using WWPipeLine.MapBasic.Conditions; namespace WWPipeLine.MapTools.Conditions.AnalystToolBar { public class LianTong : BasicToolBar { List _selectSMID = new List(); public LianTong() : base() { this.ConditionPanelName = "连通分析"; var analystToolStripButton = new ToolStripButton() { DisplayStyle = ToolStripItemDisplayStyle.ImageAndText, Text = "分析", Name = "Analyst", AutoToolTip = false }; var reSelect = new ToolStripButton() { DisplayStyle = ToolStripItemDisplayStyle.ImageAndText, Text = "重新选择", Name = "reSelect", AutoToolTip = false }; base.ToolStrip.Items.Add(reSelect); base.ToolStrip.Items.Add(analystToolStripButton); analystToolStripButton.Click += AnalystToolStripButton_Click; reSelect.Click += ReSelect_Click; } private void AnalystToolStripButton_Click(object sender, EventArgs e) { if (_selectSMID.Count != 2) { Sunny.UI.UIMessageTip.ShowError("请选择两根需要分析的管线", 2000); return; } Int32[] ids = _selectSMID.ToArray(); //////DatasetVector m_pipeNet = //NetworkBuilder.BuildNetwork(dvJSLK_cp, dvJSJDPT_cp, "smid", "smid", "smid", "smid", DatasourceMapControl, DatasourceMapControl.Datasets.GetAvailableDatasetName("BuildNetworkDataset")); //设施网络分析环境设置类。该类用于提供设施网络分析时所需要的所有参数信息。设施网络分析环境设置类的各个参数的设置直接影响分析的结果。 FacilityAnalystSetting analystSetting = new FacilityAnalystSetting(); //analystSetting.NetworkDataset = DatasourceMapControl.Datasets["WaterNet"] as DatasetVector; analystSetting.NetworkDataset = ComsStatic.dvNetwork; analystSetting.NodeIDField = "SmID";// SmNodeID 设置网络数据集中标识结点 ID 的字段。 analystSetting.EdgeIDField = "SmEdgeID";//SmID 设置网络数据集中标识弧段 ID 的字段。 analystSetting.FNodeIDField = "SmFNode";//SmFNode 设置网络数据集中标识弧段起始结点 ID 的字段。 analystSetting.TNodeIDField = "SmTNode";//SmTNode 设置网络数据集中标识弧段终止结点 ID 的字段。 analystSetting.DirectionField = "lx";//Direction 设置流向字段。 不指定默认流向均为0 analystSetting.Tolerance = 0.001;//设置点到弧段的距离容限。 //权值字段信息类型,存储了网络分析中权值字段的相关信息,包括正向权值字段与反向权值字段。 WeightFieldInfo info = new WeightFieldInfo(); info.Name = "length";//length 设置权值字段信息的名称。 info.FTWeightField = "SmLength"; // "SmLength";//设置正向阻力字段或字段表达式。 info.TFWeightField = "SmLength"; //"SmLength";//设置反向阻力字段或字段表达式。 WeightFieldInfos infos = new WeightFieldInfos(); infos.Add(info); analystSetting.WeightFieldInfos = infos; //设施网络分析类。它是网络分析功能类之一,主要用于进行各类连通性分析和追踪分析。 FacilityAnalyst m_facilityAnalyst = new FacilityAnalyst(); m_facilityAnalyst.AnalystSetting = analystSetting; m_facilityAnalyst.Load(); FacilityAnalystResult resultEdges = m_facilityAnalyst.FindPathFromEdges(ids[0], ids[1], "length", true); if (resultEdges is null) { Sunny.UI.UIMessageTip.ShowWarning("选择的管线不连通", 5000); return; } Recordset rdJSLK = dvJSLK_cp.Query(resultEdges.Edges, CursorType.Static); DataTable dtJSLK = MapBasic.ComsStatic.RecordsetToDataTable(rdJSLK, string.Format("经过{0}根管线", rdJSLK.RecordCount)); DataSet ds = new DataSet(); ds.Tables.Add(dtJSLK); AnalystResultTabControl from = new AnalystResultTabControl(ds, "连通性分析结果"); from.ShowDialog(); this.CloseToolBar(); } private void ReSelect_Click(object sender, EventArgs e) { _selectSMID.Clear(); base.AfterClose(); } protected override void OnLoad(EventArgs e) { MapControl.GeometrySelectChanged += MapControl_GeometrySelectChanged; } private void MapControl_GeometrySelectChanged(object sender, SuperMap.UI.GeometrySelectChangedEventArgs e) { Selection[] _selection = base.MapControl.Map.FindSelection(true); if (_selection.Length != 1 || _selection[0].Count != 1) { Sunny.UI.UIMessageTip.ShowError("请选择一根需要分析的管线", 2000); return; } if (_selectSMID.Count == 2) { _selectSMID.RemoveAt(1); } _selectSMID.Add(Int32.Parse(_selection[0][0].ToString())); MapControl.Map.TrackingLayer.Clear(); Recordset rd = dvJSLK_cp.Query(_selectSMID.ToArray(), CursorType.Static); GeoStyle style = new GeoStyle { LineWidth = 2, LineColor = Color.Red }; Geometry geo; rd.MoveFirst(); while (!rd.IsEOF) { geo = rd.GetGeometry(); geo.Style = style; MapControl.Map.TrackingLayer.Add(geo, "GeoRectangle"); rd.MoveNext(); } MapControl.Map.Refresh(); } public override void AfterClose() { MapControl.GeometrySelectChanged -= MapControl_GeometrySelectChanged; base.AfterClose(); } private void InitializeComponent() { this.SuspendLayout(); // // ToolsConditions // this.Name = "ToolsConditions"; this.ResumeLayout(false); } } }