LianTong.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using SuperMap.Analyst.NetworkAnalyst;
  2. using SuperMap.Data;
  3. using SuperMap.Mapping;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Drawing;
  8. using System.Windows.Forms;
  9. using WWPipeLine.MapBasic;
  10. using WWPipeLine.MapBasic.Conditions;
  11. namespace WWPipeLine.MapTools.Conditions.AnalystToolBar
  12. {
  13. public class LianTong : BasicToolBar
  14. {
  15. List<Int32> _selectSMID = new List<Int32>();
  16. public LianTong() : base()
  17. {
  18. this.ConditionPanelName = "连通分析";
  19. var analystToolStripButton = new ToolStripButton()
  20. {
  21. DisplayStyle = ToolStripItemDisplayStyle.ImageAndText,
  22. Text = "分析",
  23. Name = "Analyst",
  24. AutoToolTip = false
  25. };
  26. var reSelect = new ToolStripButton()
  27. {
  28. DisplayStyle = ToolStripItemDisplayStyle.ImageAndText,
  29. Text = "重新选择",
  30. Name = "reSelect",
  31. AutoToolTip = false
  32. };
  33. base.ToolStrip.Items.Add(reSelect);
  34. base.ToolStrip.Items.Add(analystToolStripButton);
  35. analystToolStripButton.Click += AnalystToolStripButton_Click;
  36. reSelect.Click += ReSelect_Click;
  37. }
  38. private void AnalystToolStripButton_Click(object sender, EventArgs e)
  39. {
  40. if (_selectSMID.Count != 2) { Sunny.UI.UIMessageTip.ShowError("请选择两根需要分析的管线", 2000); return; }
  41. Int32[] ids = _selectSMID.ToArray();
  42. //////DatasetVector m_pipeNet =
  43. //NetworkBuilder.BuildNetwork(dvJSLK_cp, dvJSJDPT_cp, "smid", "smid", "smid", "smid", DatasourceMapControl, DatasourceMapControl.Datasets.GetAvailableDatasetName("BuildNetworkDataset"));
  44. //设施网络分析环境设置类。该类用于提供设施网络分析时所需要的所有参数信息。设施网络分析环境设置类的各个参数的设置直接影响分析的结果。
  45. FacilityAnalystSetting analystSetting = new FacilityAnalystSetting();
  46. //analystSetting.NetworkDataset = DatasourceMapControl.Datasets["WaterNet"] as DatasetVector;
  47. analystSetting.NetworkDataset = ComsStatic.dvNetwork;
  48. analystSetting.NodeIDField = "SmID";// SmNodeID 设置网络数据集中标识结点 ID 的字段。
  49. analystSetting.EdgeIDField = "SmEdgeID";//SmID 设置网络数据集中标识弧段 ID 的字段。
  50. analystSetting.FNodeIDField = "SmFNode";//SmFNode 设置网络数据集中标识弧段起始结点 ID 的字段。
  51. analystSetting.TNodeIDField = "SmTNode";//SmTNode 设置网络数据集中标识弧段终止结点 ID 的字段。
  52. analystSetting.DirectionField = "lx";//Direction 设置流向字段。 不指定默认流向均为0
  53. analystSetting.Tolerance = 0.001;//设置点到弧段的距离容限。
  54. //权值字段信息类型,存储了网络分析中权值字段的相关信息,包括正向权值字段与反向权值字段。
  55. WeightFieldInfo info = new WeightFieldInfo();
  56. info.Name = "length";//length 设置权值字段信息的名称。
  57. info.FTWeightField = "SmLength"; // "SmLength";//设置正向阻力字段或字段表达式。
  58. info.TFWeightField = "SmLength"; //"SmLength";//设置反向阻力字段或字段表达式。
  59. WeightFieldInfos infos = new WeightFieldInfos();
  60. infos.Add(info);
  61. analystSetting.WeightFieldInfos = infos;
  62. //设施网络分析类。它是网络分析功能类之一,主要用于进行各类连通性分析和追踪分析。
  63. FacilityAnalyst m_facilityAnalyst = new FacilityAnalyst();
  64. m_facilityAnalyst.AnalystSetting = analystSetting;
  65. m_facilityAnalyst.Load();
  66. FacilityAnalystResult resultEdges = m_facilityAnalyst.FindPathFromEdges(ids[0], ids[1], "length", true);
  67. if (resultEdges is null) { Sunny.UI.UIMessageTip.ShowWarning("选择的管线不连通", 5000); return; }
  68. Recordset rdJSLK = dvJSLK_cp.Query(resultEdges.Edges, CursorType.Static);
  69. DataTable dtJSLK = MapBasic.ComsStatic.RecordsetToDataTable(rdJSLK, string.Format("经过{0}根管线", rdJSLK.RecordCount));
  70. DataSet ds = new DataSet(); ds.Tables.Add(dtJSLK);
  71. AnalystResultTabControl from = new AnalystResultTabControl(ds, "连通性分析结果");
  72. from.ShowDialog();
  73. this.CloseToolBar();
  74. }
  75. private void ReSelect_Click(object sender, EventArgs e)
  76. {
  77. _selectSMID.Clear();
  78. base.AfterClose();
  79. }
  80. protected override void OnLoad(EventArgs e)
  81. {
  82. MapControl.GeometrySelectChanged += MapControl_GeometrySelectChanged;
  83. }
  84. private void MapControl_GeometrySelectChanged(object sender, SuperMap.UI.GeometrySelectChangedEventArgs e)
  85. {
  86. Selection[] _selection = base.MapControl.Map.FindSelection(true);
  87. if (_selection.Length != 1 || _selection[0].Count != 1)
  88. {
  89. Sunny.UI.UIMessageTip.ShowError("请选择一根需要分析的管线", 2000);
  90. return;
  91. }
  92. if (_selectSMID.Count == 2)
  93. {
  94. _selectSMID.RemoveAt(1);
  95. }
  96. _selectSMID.Add(Int32.Parse(_selection[0][0].ToString()));
  97. MapControl.Map.TrackingLayer.Clear();
  98. Recordset rd = dvJSLK_cp.Query(_selectSMID.ToArray(), CursorType.Static);
  99. GeoStyle style = new GeoStyle { LineWidth = 2, LineColor = Color.Red };
  100. Geometry geo;
  101. rd.MoveFirst();
  102. while (!rd.IsEOF)
  103. {
  104. geo = rd.GetGeometry(); geo.Style = style;
  105. MapControl.Map.TrackingLayer.Add(geo, "GeoRectangle");
  106. rd.MoveNext();
  107. }
  108. MapControl.Map.Refresh();
  109. }
  110. public override void AfterClose()
  111. {
  112. MapControl.GeometrySelectChanged -= MapControl_GeometrySelectChanged;
  113. base.AfterClose();
  114. }
  115. private void InitializeComponent()
  116. {
  117. this.SuspendLayout();
  118. //
  119. // ToolsConditions
  120. //
  121. this.Name = "ToolsConditions";
  122. this.ResumeLayout(false);
  123. }
  124. }
  125. }