PIE SDK灾前灾后对比

灾前灾后对比功能是GIS软件中常用的功能之一,指利用多时相获取的覆盖同一地表区域的遥感影像及其它辅助数据来确定和分析地表变化。它利用计算机图像处理系统,对不同时段目标或现象状态的变化进行识别、分析;它能确定一定时间间隔内地物或现象的变化,并提供地物的空间分布及其变化的定性与定量信息。现在呢,具体介绍下基于我们PIE SDK是如何实现这基本工具灾前灾后对比功能的基本实现。

【在前灾后功能界面图】

要实现灾前灾后对比功能主要就是通过两个mapControl控件,灾前地图控件是mapControl_left,灾后地图控件是mapControl_right,实现关键点有四点:1、如何给两个控件添加常用控件;2、如何使两个控件的显示范围保持一致;3、如何在状态栏中显示地图坐标及屏幕坐标;4、如何给两个控件右上角添加元素。

一、如何给两个控件添加常用控件

添加两个toolStrip,分别在toolStrip上添加六个button,分别给六个button添加单击事件(本文以放大控件为例)。

 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事件,那么灾后地图的范围跟着变化。

 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         }

四、如何给两个控件右上角添加元素

如何给两个控件右上角添加元素主要是在两个地图控件右上角始终显示元素。

首先,当窗体加载(即控件中没有元素)时,要在控件中绘制元素。

 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         }

原文地址:https://www.cnblogs.com/PIESat/p/10271741.html

时间: 2024-08-05 03:00:36

PIE SDK灾前灾后对比的相关文章

PIE SDK图层渲染变化事件监听

1. 功能简介 通过PIE SDK加载图层后,会默认的赋值给数据一个渲染.当用户重新给数据赋值Render或改变数据显示效果时,会触发渲染变化事件. 所谓的事件监听是在事件触发时,将执行用户指定的函数或方法,已实现特定的功能. 2. 功能实现说明 2.1 实现思路及原理说明 第一步 栅格图层接口转换至ILayerEvents 第二步 OnRenderChanged进行事件绑定,以达到监听目的. 2.2  核心接口与方法 接口/类 方法 说明 Carto. ILayerEvents OnRende

PIE SDK Command&amp;&amp;Tool工具命令一览表

PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls.RasterCommand PIE.Controls.dll 2 加载矢量数据 PIE.Controls.VectorCommand 3 加载科学数据集数据 PIE.Controls.ScientificDatasetCommand 4 加载环境数据 PIE.Controls.LoadHJDataComma

PIE SDK傅里叶变换

1.算法功能简介 傅里叶变换能把遥感图像从空域变换到只包含不同频域信息的频域中.原图像上的灰度突变部位(如物体边缘).图像结构复杂的区域.图像细节及干扰噪声等,经傅里叶变换后,其信息大多集中在高频区:而原图像上灰度变化平缓的部位,如植被比较一致的平原.沙漠和海面等,经傅里叶变换后,大多集中在频率域中的低频区.在频率域平面中,低频区位于中心部位,而高频区位于低频区的外围,即边缘部位. 傅里叶变换是可逆的,即对图像进行傅里叶变换后得到的频率函数再做反向傅里叶变换,又可以得到原来的图像.从纯粹的数学意

PIE SDK组件式开发综合运用示例

1. 功能概述 关于PIE SDK的功能开发,在我们的博客上已经分门别类的进行了展示,点击PIESat博客就可以访问,为了初学者入门,本章节将对从PIE SDK组件式二次开发如何搭建界面.如何综合开发进行详细的讲解. 2. 功能实现 2.1.界面搭建 最终的界面如下图所示: 图1最终结果图 2.1.1 新建项目 选择“Window窗体应用程序”,设置程序的名称和保存路径即可.(新建完成后可以将程序的窗体名称右键重命名为“FormMain”,,将窗体界面的属性的Text设置名称为“PIE应用程序”

PIE SDK 监督分类对话框类(SupervisedClassificaitonDialog)使用经验

最近研究遥感,用到分类算法,PIE SDK正好提供了一些方法可供调用,他们的官方博客上也有相应的示例代码(可参考:https://www.cnblogs.com/PIESat/p/10725270.html).但是,我在开发手册中发现了监督分类对话框类(SupervisedClassificaitonDialog),欣喜若狂!心想有这个类的话,不仅有直观的界面展示,而且也会省去很多开发过程.不幸的是,直接调用这个类显示参数设置对话框界面(如下图),设置好参数,点击OK,并没有出现我想要的分类结果

PIE SDK 基于Dot net bar实现比例尺控件

最近在搭建主界面的过程中,为了界面美观大方,使用了Dot net bar.但是,在Dot net bar的状态栏中放置PIE SDK自带的比例尺控件,运行主界面程序后,比例尺控件始终不显示比例尺信息,得不到想要的效果.如果使用Windows Form自带的状态栏,则能够正常显示比例尺信息.我猜想,可能是PIE SDK自带的比例尺控件与Dot net bar不兼容.我参考了官方博客(https://www.cnblogs.com/PIESat/p/10272779.html),利用Dot net

STL——前闭后开区间表示法和function call 操作符

前开后闭开区间表示法[) 任何一个STL算法,都需要获得由一对迭代器(泛型指针)所标示的区间,用以表示操作范围,这一对迭代器所标示的是个所谓的前闭后开区间,以[first,last)表示,也就是说,整个实际范围从first开始,直到last-1.迭代器last所指的是“最后一个元素的下一位置”.这种off by one(偏移一格,或说pass the end)的标示法,带来了很多方便,例如下面两个STL算法的循环设计,就显得干净利落: template<class InputIterator,c

前闭后开区间表示法

 任何一个STL算法,都需要获得由一对迭代器(泛型指针)所标识的区间,用以表示操作范围.这一对迭代器所标示的是个所谓的前闭后开区间,以[first,last)表示.也就是说,整个实际范围从first开始,知道last-1.迭代器last所指的是"最后一个元素的下一位置".这种偏移一格的标示法,带来了许多方便,例如下面两个STL算法的循环设计,就显得干净利落: template <class InputIterator,classT> InputIterator find

main函数执行前、后再执行的代码

一.main结束 不代表整个进程结束  (1)全局对象的构造函数会在main 函数之前执行,          全局对象的析构函数会在main函数之后执行:          用atexit注册的函数也会在main之后执行.  (2)一些全局变量.全局对象和静态变量.对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后,还要去执行一些诸如释放空间.释放资源使用权等操作  (3)进程启动后,要执行一些初始化代码(如设置环境变量等),然后跳转到main执行.全局对象的构造也在ma