LianTong.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. private static readonly string NetworkDatasetName = "BuildNetworkDataset";
  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. MapControl.GeometrySelectChanged += MapControl_GeometrySelectChanged;
  43. if (ComsStatic.Datasource.Datasets.Contains(NetworkDatasetName))
  44. ComsStatic.Datasource.Datasets.Delete(NetworkDatasetName);
  45. //NetworkBuilder.BuildNetwork(ComsStatic.dvJSLK, ComsStatic.dvJSJDPT, "objectid", "qsdh", "zddh", "bsm", ComsStatic.Datasource, NetworkDatasetName);
  46. //NetworkBuilder.BuildNetwork(ComsStatic.dvJSLK, new string[] { "qsdh", "zddh" }, ComsStatic.Datasource, NetworkDatasetName);
  47. NetworkBuilder.BuildNetwork(ComsStatic.dvJSLK, ComsStatic.dvJSJDPT, "objectid", "qsdh", "zddh", "bsm", ComsStatic.Datasource, NetworkDatasetName);
  48. }
  49. private void AnalystToolStripButton_Click(object sender, EventArgs e)
  50. {
  51. if (startEdgeID == 0 || endEdgeID == 0) { Sunny.UI.UIMessageTip.ShowError("请选择两根需要分析的管线", 2000); return; }
  52. DatasetVector dv = ComsStatic.Datasource.Datasets[NetworkDatasetName] as DatasetVector;
  53. FacilityAnalystSetting analystSetting = new FacilityAnalystSetting();
  54. analystSetting.NetworkDataset = dv;
  55. analystSetting.NodeIDField = "SmNodeID";
  56. analystSetting.EdgeIDField = "objectid";//objectid SmEdgeID
  57. analystSetting.FNodeIDField = "SmFNode";
  58. analystSetting.TNodeIDField = "SmTNode";
  59. analystSetting.DirectionField = "lx";
  60. analystSetting.Tolerance = 0.001;
  61. WeightFieldInfo info = new WeightFieldInfo();
  62. info.Name = "length";
  63. info.FTWeightField = "SmLength";
  64. info.TFWeightField = "SmLength";
  65. WeightFieldInfos infos = new WeightFieldInfos();
  66. infos.Add(info);
  67. analystSetting.WeightFieldInfos = infos;
  68. FacilityAnalyst m_facilityAnalyst = new FacilityAnalyst();
  69. m_facilityAnalyst.AnalystSetting = analystSetting;
  70. m_facilityAnalyst.Load();
  71. FacilityAnalystResult resultEdges = m_facilityAnalyst.FindPathFromEdges(startEdgeID, endEdgeID, "length", true);
  72. if (resultEdges is null) { Sunny.UI.UIMessageTip.ShowWarning("选择的管线不连通"); return; }
  73. DataSet ds = new DataSet();
  74. Recordset rdJSLK = ComsStatic.dvJSLK.Query(string.Format("objectid in ({0})", string.Join(",", resultEdges.Edges)), CursorType.Static);
  75. DataTable dtJSLK = ComsStatic.RecordsetToDataTable(rdJSLK, string.Format("经过{0}根管线", rdJSLK.RecordCount));
  76. ds.Tables.Add(dtJSLK);
  77. //Recordset rdJSJDPT = dv.ChildDataset.Query(resultEdges.Nodes, "SmNodeID", CursorType.Static);
  78. //DataTable dtJSJDPT = ComsStatic.RecordsetToDataTable(rdJSJDPT, string.Format("经过{0}个节点", rdJSJDPT.RecordCount));
  79. //ds.Tables.Add(dtJSJDPT);
  80. AnalystResultTabControl from = new AnalystResultTabControl(ds, "连通性分析结果");
  81. from.ShowDialog();
  82. m_facilityAnalyst.Dispose();
  83. this.CloseToolBar();
  84. }
  85. private void ReSelect_Click(object sender, EventArgs e)
  86. {
  87. startEdgeID = 0; endEdgeID = 0;
  88. MapControl.Map.TrackingLayer.Clear();
  89. MapControl.Map.Refresh();
  90. }
  91. private void MapControl_GeometrySelectChanged(object sender, SuperMap.UI.GeometrySelectChangedEventArgs e)
  92. {
  93. Selection[] _selection = MapControl.Map.FindSelection(true);
  94. if (_selection.Length != 1 || _selection[0].Count != 1)
  95. {
  96. Sunny.UI.UIMessageTip.ShowError("请选择一根需要分析的管线"); return;
  97. }
  98. if (startEdgeID == 0)
  99. startEdgeID = ComsStatic.StringToInt(_selection[0].ToRecordset().GetFieldValue("objectid"));
  100. else
  101. endEdgeID = ComsStatic.StringToInt(_selection[0].ToRecordset().GetFieldValue("objectid"));
  102. MapControl.Map.TrackingLayer.Clear();
  103. Recordset rd = ComsStatic.dvJSLK.Query(string.Format("objectid in ({0},{1})", startEdgeID, endEdgeID), CursorType.Static);
  104. GeoStyle style = new GeoStyle { LineWidth = 1.2, LineColor = Color.Red };
  105. Geometry geo;
  106. rd.MoveFirst();
  107. while (!rd.IsEOF)
  108. {
  109. geo = rd.GetGeometry(); geo.Style = style;
  110. MapControl.Map.TrackingLayer.Add(geo, "GeoRectangle");
  111. rd.MoveNext();
  112. }
  113. MapControl.Map.Refresh();
  114. }
  115. public override void AfterClose()
  116. {
  117. if (ComsStatic.Datasource.Datasets.Contains(NetworkDatasetName))
  118. ComsStatic.Datasource.Datasets.Delete(NetworkDatasetName);
  119. MapControl.GeometrySelectChanged -= MapControl_GeometrySelectChanged;
  120. base.AfterClose();
  121. }
  122. private void InitializeComponent()
  123. {
  124. this.SuspendLayout();
  125. //
  126. // ToolsConditions
  127. //
  128. this.Name = "ToolsConditions";
  129. this.ResumeLayout(false);
  130. }
  131. }
  132. }