LianTong.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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. private int startEdgeID = 0;
  16. private int endEdgeID = 0;
  17. DatasetVector dv = null;
  18. public LianTong() : base()
  19. {
  20. this.ConditionPanelName = "连通分析";
  21. var analystToolStripButton = new ToolStripButton()
  22. {
  23. DisplayStyle = ToolStripItemDisplayStyle.ImageAndText,
  24. Text = "开始分析",
  25. Name = "Analyst",
  26. AutoToolTip = false
  27. };
  28. var reSelect = new ToolStripButton()
  29. {
  30. DisplayStyle = ToolStripItemDisplayStyle.ImageAndText,
  31. Text = "重新选择",
  32. Name = "reSelect",
  33. AutoToolTip = false
  34. };
  35. base.ToolStrip.Items.Add(reSelect);
  36. base.ToolStrip.Items.Add(analystToolStripButton);
  37. analystToolStripButton.Click += AnalystToolStripButton_Click;
  38. reSelect.Click += ReSelect_Click;
  39. }
  40. protected override void OnLoad(EventArgs e)
  41. {
  42. ComsStatic.SetLayersIsSelectableFalse(ComsStatic.gsGuanXian.Name, true);
  43. MapControl.GeometrySelectChanged += MapControl_GeometrySelectChanged;
  44. string dviName = ComsStatic.DatasourceMemory.Datasets.GetAvailableDatasetName("LianTongNetwork");
  45. dv = NetworkBuilder.BuildNetwork(ComsStatic.gsGuanXian, ComsStatic.gsGuanDian, "objectid", "qsdh", "zddh", "bsm", ComsStatic.DatasourceMemory, dviName);
  46. }
  47. private void AnalystToolStripButton_Click(object sender, EventArgs e)
  48. {
  49. if (startEdgeID == 0 || endEdgeID == 0) { Sunny.UI.UIMessageTip.ShowError("请选择两根需要分析的管线", 2000, false); return; }
  50. FacilityAnalystSetting analystSetting = new FacilityAnalystSetting();
  51. analystSetting.NetworkDataset = dv;
  52. analystSetting.NodeIDField = "SmNodeID";
  53. analystSetting.EdgeIDField = "objectid";//objectid SmEdgeID
  54. analystSetting.FNodeIDField = "SmFNode";
  55. analystSetting.TNodeIDField = "SmTNode";
  56. analystSetting.DirectionField = "lx";
  57. analystSetting.Tolerance = 0.001;
  58. WeightFieldInfo info = new WeightFieldInfo();
  59. info.Name = "length";
  60. info.FTWeightField = "SmLength";
  61. info.TFWeightField = "SmLength";
  62. WeightFieldInfos infos = new WeightFieldInfos();
  63. infos.Add(info);
  64. analystSetting.WeightFieldInfos = infos;
  65. FacilityAnalyst m_facilityAnalyst = new FacilityAnalyst();
  66. m_facilityAnalyst.AnalystSetting = analystSetting;
  67. m_facilityAnalyst.Load();
  68. FacilityAnalystResult resultEdges = m_facilityAnalyst.FindPathFromEdges(startEdgeID, endEdgeID, "length", true);
  69. if (resultEdges is null) { Sunny.UI.UIMessageTip.ShowWarning("选择的管线不连通"); return; }
  70. DataSet ds = new DataSet();
  71. Recordset rdJSLK = ComsStatic.gsGuanXian.Query(string.Format(" enabled=1 and objectid in ({0})", string.Join(",", resultEdges.Edges)), CursorType.Static);
  72. DataTable dtJSLK = ComsStatic.RecordsetToDataTable(rdJSLK, true, string.Format("经过{0}根管线", rdJSLK.RecordCount));
  73. ds.Tables.Add(dtJSLK);
  74. Recordset rdJSJDPT = dv.ChildDataset.Query(resultEdges.Nodes, "SmNodeID", CursorType.Static);
  75. DataTable dtJSJDPT = ComsStatic.RecordsetToDataTable(rdJSJDPT,true, string.Format("经过{0}个节点", rdJSJDPT.RecordCount));
  76. ds.Tables.Add(dtJSJDPT);
  77. AnalystResultTabControl from = new AnalystResultTabControl(ds, "连通性分析结果");
  78. from.ShowDialog();
  79. m_facilityAnalyst.Dispose();
  80. this.CloseToolBar();
  81. }
  82. private void ReSelect_Click(object sender, EventArgs e)
  83. {
  84. startEdgeID = 0; endEdgeID = 0;
  85. MapControl.Map.TrackingLayer.Clear();
  86. MapControl.Map.RefreshTrackingLayer();
  87. }
  88. private void MapControl_GeometrySelectChanged(object sender, SuperMap.UI.GeometrySelectChangedEventArgs e)
  89. {
  90. Selection[] _selection = MapControl.Map.FindSelection(true);
  91. if (_selection.Length != 1 || _selection[0].Count != 1)
  92. {
  93. Sunny.UI.UIMessageTip.ShowError("请选择一根需要分析的管线"); return;
  94. }
  95. if (startEdgeID == 0)
  96. startEdgeID = ComsStatic.StringToInt(_selection[0].ToRecordset().GetFieldValue("objectid"));
  97. else
  98. endEdgeID = ComsStatic.StringToInt(_selection[0].ToRecordset().GetFieldValue("objectid"));
  99. MapControl.Map.TrackingLayer.Clear();
  100. Recordset rd = ComsStatic.gsGuanXian.Query(string.Format("objectid in ({0},{1})", startEdgeID, endEdgeID), CursorType.Static);
  101. GeoStyle style = new GeoStyle { LineWidth = 1.2, LineColor = Color.Red };
  102. Geometry geo;
  103. rd.MoveFirst();
  104. while (!rd.IsEOF)
  105. {
  106. geo = rd.GetGeometry(); geo.Style = style;
  107. MapControl.Map.TrackingLayer.Add(geo, "GeoRectangle");
  108. rd.MoveNext();
  109. }
  110. MapControl.Map.RefreshTrackingLayer();
  111. }
  112. public override void AfterClose()
  113. {
  114. MapControl.GeometrySelectChanged -= MapControl_GeometrySelectChanged;
  115. base.AfterClose();
  116. }
  117. private void InitializeComponent()
  118. {
  119. this.SuspendLayout();
  120. //
  121. // ToolsConditions
  122. //
  123. this.Name = "ToolsConditions";
  124. this.ResumeLayout(false);
  125. }
  126. }
  127. }