災前災後對比功能是GIS軟件中經常使用的功能之一,指利用多時相獲取的覆蓋同一地表區域的遙感影像及其它輔助數據來肯定和分析地表變化。它利用計算機圖像處理系統,對不一樣時段目標或現象狀態的變化進行識別、分析;它能肯定必定時間間隔內地物或現象的變化,並提供地物的空間分佈及其變化的定性與定量信息。如今呢,具體介紹下基於咱們PIE SDK是如何實現這基本工具災前災後對比功能的基本實現。函數
【在前災後功能界面圖】 工具
要實現災前災後對比功能主要就是經過兩個mapControl控件,災前地圖控件是mapControl_left,災後地圖控件是mapControl_right,實現關鍵點有四點:一、如何給兩個控件添加經常使用控件;二、如何使兩個控件的顯示範圍保持一致;三、如何在狀態欄中顯示地圖座標及屏幕座標;四、如何給兩個控件右上角添加元素。spa
添加兩個toolStrip,分別在toolStrip上添加六個button,分別給六個button添加單擊事件(本文以放大控件爲例)。 code
1 /// <summary> 2 /// mapControl_left地圖放大事件 3 /// </summary> 4 /// <param name="sender">事件觸發器</param> 5 /// <param name="e">事件參數</param> 6 private void toolStripButton_zoomInLeft_Click(object sender, EventArgs e) 7 { 8 ITool tool = new PIE.Controls.MapZoomInTool(); 9 (tool as ICommand).OnCreate(mapControl_left); 10 mapControl_left.CurrentTool = tool; 11 }
使兩個控件的顯示範圍保持一致主要是當災前地圖的範圍發生變化的時候,災後地圖的範圍跟着變化。視頻
而實現災前災後對比功能,主要發生在災前地圖和災後地圖控件相應響應事件中,即mapControl_left和mapControl_right的OnExtentUpdated事件。當災前地圖mapControl_left範圍發生變化時,會觸發OnExtentUpdated事件,那麼災後地圖的範圍跟着變化。 blog
1 /// <summary> 2 /// mapControl_left範圍變化事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="sizeChanged"></param> 6 /// <param name="newEnvelope"></param> 7 void mapControl_left_OnExtentUpdated(object sender, bool sizeChanged, IEnvelope newEnvelope) 8 { 9 if (mapControl_left.GetLayer(0) != null && mapControl_right.GetLayer(0) != null && m_Lock == false) 10 { 11 m_Lock = true; 12 mapControl_right.Extent = mapControl_left.Extent; 13 mapControl_right.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 14 m_Lock = false; 15 } 16 }
在狀態欄中顯示地圖座標及屏幕座標主要是當鼠標在地圖控件中移動時,在狀態欄中顯示鼠標所在位置的地圖座標及屏幕座標。首先,添加一個statusStrip,在statusStrip上添加一個StatusLabel。教程
而實如今狀態欄中顯示地圖座標及屏幕座標功能,主要發生在災前地圖和災後地圖控件相應響應事件中,即mapControl_left和mapControl_right的MouseMove事件。當鼠標在地圖控件中移動時,會觸發MouseMove事件,那麼狀態欄中顯示鼠標所在位置的地圖座標及屏幕座標。事件
1 /// <summary> 2 /// mapControl_left鼠標移動事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void mapControl_left_MouseMove(object sender, MouseEventArgs e) 7 { 8 toolStripStatusLabel_Coo.Text = "地圖座標:" + Math.Round(mapControl_left.FocusMap.ToMapPoint(e.Location).X, 4) + "," + Math.Round(mapControl_left.FocusMap.ToMapPoint(e.Location).Y, 4) + " 屏幕座標:" + e.X + "," + e.Y; 9 }
如何給兩個控件右上角添加元素主要是在兩個地圖控件右上角始終顯示元素。ip
首先,當窗體加載(即控件中沒有元素)時,要在控件中繪製元素。ci
1 /// <summary> 2 /// UserControl_Disaster加載事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void UserControl_Disaster_Load(object sender, EventArgs e) 7 { 8 mapControl_left.OnExtentUpdated += mapControl_left_OnExtentUpdated; 9 mapControl_right.OnExtentUpdated += mapControl_right_OnExtentUpdated; 10 DrawTwoElement(); 11 mapControl_left.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 12 mapControl_right.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll); 13 toolStripStatusLabel_Coo.Alignment = ToolStripItemAlignment.Right; 14 }
而控件中已經存在元素時,當災前地圖mapControl_left或災後地圖mapControl_right範圍發生變化時,只需修改元素的位置便可。實現修改元素的位置功能,主要發生在災前地圖和災後地圖控件相應響應事件中,即mapControl_left和mapControl_right的OnExtentUpdated事件。
1 /// <summary> 2 /// mapControl_left範圍變化事件 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="sizeChanged"></param> 6 /// <param name="newEnvelope"></param> 7 void mapControl_left_OnExtentUpdated(object sender, bool sizeChanged, IEnvelope newEnvelope) 8 { 9 if (mapControl_left.GetLayer(0) != null && mapControl_right.GetLayer(0) != null && m_Lock == false) 10 { 11 DrawTwoElement(); 12 } 13 } 14 15 /// <summary> 16 /// 繪製兩個mapcontrol中元素函數 17 /// </summary> 18 private void DrawTwoElement() 19 { 20 DrawElement(mapControl_left,m_LeftCaption); 21 DrawElement(mapControl_right, m_RightCaption); 22 } 23 /// <summary> 24 /// 繪製一個mapcontrol中元素函數 25 /// </summary> 26 private void DrawElement(MapControl mapcontrol, String Caption) 27 { 28 if (mapcontrol == null||Caption==null) return; 29 double xCoordinate = mapcontrol.Extent.XMax; 30 double yCoordinate = mapcontrol.Extent.YMax; 31 32 IPoint point = new PIE.Geometry.Point(); 33 point.PutCoords(xCoordinate, yCoordinate); 34 (point as IGeometry).SpatialReference = mapcontrol.FocusMap.SpatialReference; 35 36 if (mapcontrol.ActiveView.GraphicsContainer.ElementCount == 0) 37 { 38 ITextSymbol textSymbol = new TextSymbol(); 39 textSymbol.Size = 36; 40 textSymbol.Color = System.Drawing.Color.Red; 41 textSymbol.Angle = 0.6; 42 textSymbol.Font = new System.Drawing.Font("Times New Roman", 100, FontStyle.Bold); 43 textSymbol.Alignment = TextAlignmentType.AlignRight; 44 45 ITextElement textElement = new TextElement(); 46 textElement.Geometry = point as IGeometry; 47 textElement.Symbol = textSymbol; 48 textElement.Text = Caption; 49 textElement.Name = "caption"; 50 mapcontrol.ActiveView.GraphicsContainer.AddElement(textElement); 51 } 52 else 53 { 54 IList<IElement> list = mapcontrol.ActiveView.GraphicsContainer.GetAllElements(); 55 foreach(Element element in list) 56 { 57 if(element.Name=="caption") 58 { 59 ITextElement textElement = element as ITextElement; 60 textElement.Geometry = point as IGeometry; 61 } 62 } 63 } 64 }
代碼路徑:
項目名稱 |
百度雲盤地址下/PIE示例程序/13.小工具集錦/災前災後對比/ PIE.Disaster |
數據路徑 |
百度雲盤地址下/PIE示例數據/柵格數據/06.災前災後數據 |
視頻路徑 |
百度雲盤地址下/PIE視頻教程/13.小工具集錦/災前災後對比.avi |