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

【在前灾后功能界面图】

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

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

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

       /// <summary>
/// mapControl_left地图放大事件
/// </summary>
/// <param name="sender">事件触发器</param>
/// <param name="e">事件参数</param>
private void toolStripButton_zoomInLeft_Click(object sender, EventArgs e)
{
ITool tool = new PIE.Controls.MapZoomInTool();
(tool as ICommand).OnCreate(mapControl_left);
mapControl_left.CurrentTool = tool;
}
 

二、使两个控件的显示范围保持一致

使两个控件的显示范围保持一致主要是当灾前地图的范围发生变化的时候,灾后地图的范围跟着变化。

而实现灾前灾后对比功能,主要发生在灾前地图和灾后地图控件相应响应事件中,即mapControl_left和mapControl_right的OnExtentUpdated事件。当灾前地图mapControl_left范围发生变化时,会触发OnExtentUpdated事件,那么灾后地图的范围跟着变化。

          /// <summary>
/// mapControl_left范围变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="sizeChanged"></param>
/// <param name="newEnvelope"></param>
void mapControl_left_OnExtentUpdated(object sender, bool sizeChanged, IEnvelope newEnvelope)
{
if (mapControl_left.GetLayer() != null && mapControl_right.GetLayer() != null && m_Lock == false)
{
m_Lock = true;
mapControl_right.Extent = mapControl_left.Extent;
mapControl_right.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
m_Lock = false;
}
}
 

三、如何在状态栏中显示地图坐标及屏幕坐标

在状态栏中显示地图坐标及屏幕坐标主要是当鼠标在地图控件中移动时,在状态栏中显示鼠标所在位置的地图坐标及屏幕坐标。首先,添加一个statusStrip,在statusStrip上添加一个StatusLabel。

而实现在状态栏中显示地图坐标及屏幕坐标功能,主要发生在灾前地图和灾后地图控件相应响应事件中,即mapControl_left和mapControl_right的MouseMove事件。当鼠标在地图控件中移动时,会触发MouseMove事件,那么状态栏中显示鼠标所在位置的地图坐标及屏幕坐标。

          /// <summary>
/// mapControl_left鼠标移动事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mapControl_left_MouseMove(object sender, MouseEventArgs e)
{
toolStripStatusLabel_Coo.Text = "地图坐标:" + Math.Round(mapControl_left.FocusMap.ToMapPoint(e.Location).X, ) + "," + Math.Round(mapControl_left.FocusMap.ToMapPoint(e.Location).Y, ) + " 屏幕坐标:" + e.X + "," + e.Y;
}
 

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

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

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

         /// <summary>
/// UserControl_Disaster加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UserControl_Disaster_Load(object sender, EventArgs e)
{
mapControl_left.OnExtentUpdated += mapControl_left_OnExtentUpdated;
mapControl_right.OnExtentUpdated += mapControl_right_OnExtentUpdated;
DrawTwoElement();
mapControl_left.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
mapControl_right.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
toolStripStatusLabel_Coo.Alignment = ToolStripItemAlignment.Right;
}

而控件中已经存在元素时,当灾前地图mapControl_left或灾后地图mapControl_right范围发生变化时,只需修改元素的位置即可。实现修改元素的位置功能,主要发生在灾前地图和灾后地图控件相应响应事件中,即mapControl_left和mapControl_right的OnExtentUpdated事件。

         /// <summary>
/// mapControl_left范围变化事件
/// </summary>
/// <param name="sender"></param>
/// <param name="sizeChanged"></param>
/// <param name="newEnvelope"></param>
void mapControl_left_OnExtentUpdated(object sender, bool sizeChanged, IEnvelope newEnvelope)
{
if (mapControl_left.GetLayer() != null && mapControl_right.GetLayer() != null && m_Lock == false)
{
DrawTwoElement();
}
} /// <summary>
/// 绘制两个mapcontrol中元素函数
/// </summary>
private void DrawTwoElement()
{
DrawElement(mapControl_left,m_LeftCaption);
DrawElement(mapControl_right, m_RightCaption);
}
/// <summary>
/// 绘制一个mapcontrol中元素函数
/// </summary>
private void DrawElement(MapControl mapcontrol, String Caption)
{
if (mapcontrol == null||Caption==null) return;
double xCoordinate = mapcontrol.Extent.XMax;
double yCoordinate = mapcontrol.Extent.YMax; IPoint point = new PIE.Geometry.Point();
point.PutCoords(xCoordinate, yCoordinate);
(point as IGeometry).SpatialReference = mapcontrol.FocusMap.SpatialReference; if (mapcontrol.ActiveView.GraphicsContainer.ElementCount == )
{
ITextSymbol textSymbol = new TextSymbol();
textSymbol.Size = ;
textSymbol.Color = System.Drawing.Color.Red;
textSymbol.Angle = 0.6;
textSymbol.Font = new System.Drawing.Font("Times New Roman", , FontStyle.Bold);
textSymbol.Alignment = TextAlignmentType.AlignRight; ITextElement textElement = new TextElement();
textElement.Geometry = point as IGeometry;
textElement.Symbol = textSymbol;
textElement.Text = Caption;
textElement.Name = "caption";
mapcontrol.ActiveView.GraphicsContainer.AddElement(textElement);
}
else
{
IList<IElement> list = mapcontrol.ActiveView.GraphicsContainer.GetAllElements();
foreach(Element element in list)
{
if(element.Name=="caption")
{
ITextElement textElement = element as ITextElement;
textElement.Geometry = point as IGeometry;
}
}
}
}

代码路径:

项目名称

百度云盘地址下/PIE示例程序/13.小工具集锦/灾前灾后对比/ PIE.Disaster

数据路径

百度云盘地址下/PIE示例数据/栅格数据/06.灾前灾后数据

视频路径

百度云盘地址下/PIE视频教程/13.小工具集锦/灾前灾后对比.avi

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

  1. PIE SDK 文章目录索引

    1.PIE SDK介绍 1.1.  PIE软件介绍 1.2.  PIE SDK介绍 1.3.  PIE支持项目介绍 1.4.  PIE.NET-SDK插件式二次开发介绍 1.5.  PIE.NET-S ...

  2. PIE SDK栅格图层渲染变化事件监听

    1. 功能简介 通过PIE SDK加载图层后,会默认的赋值给数据一个渲染.当用户重新给数据赋值Render或改变数据显示效果时,会触发渲染变化事件. 所谓的事件监听是在事件触发时,将执行用户指定的函数 ...

  3. PIE SDK影像坏线修复

    1.算法功能简介 坏条带的由来:2003年5月31日,Landsat-7ETM+机载扫描行校正器(SLC) 故障,导致此后获取的影像出现了数据条带丢失,严重影响了Landsat ETM遥感影像的使用. ...

  4. PIE SDK Command&&Tool工具命令一览表

    PIE SDK Command&&Tool工具命令一览表 编号 模板 名称(中文) Command&Tool 程序集 备注 1 数据管理 加载栅格数据 PIE.Controls ...

  5. PIE SDK地图范围设置

    1.功能简介 地图范围设置主要就是对图层的地图浏览控制,例如地图的放大.缩小.漫游.全图显示.1:1视图.比例尺等功能,能更好的与地图有一个互动的地图浏览体验.PIE SDK对地图范围设置主要利用IC ...

  6. PIE SDK矢量数据的修改

    1.功能简介 目前PIE SDK支持矢量数据的修改或删除,下面对矢量数据的投影转换功能进行介绍. 2.功能实现说明 2.1. 矢量数据的修改 2.2. 实现思路及原理说明 第一步 获取需要修改的矢量数 ...

  7. PIE SDK元素位置和显示样式的修改

    1功能简介 在数据的处理中会出现根据需求进行元素的位置和显示样式的修改,使元素的形状,空间位置得到改变,下面将介绍基于PIE SDK的元素位置和显示样式的修改. 2功能实现说明 2.1.1 实现思路及 ...

  8. PIE SDK分类合并

    1. 算法功能简介 分类合并功能是将分类文件中所设置的对应类别进行合并. PIE SDK支持算法功能的执行,下面对分类合并算法功能进行介绍. 2. 算法功能实现说明 2.1. 实现步骤 第一步 算法参 ...

  9. PIE SDK缨帽变换

    1.算法功能简介 缨帽变换是根据多光谱遥感中土壤.植被等信息在多维光谱空间中信息分布结构对图像做的经验性线性正交变换. PIE 支持对 Landsat MSS. Landsat 5 TM.Landsa ...

随机推荐

  1. hdu 4286 (list的reverse时间复杂度为n)

    list 的翻转reverse源码: // 将链表倒置 // 其算法核心是历遍链表, 每次取出一个结点, 并插入到链表起始点 // 历遍完成后链表满足倒置 template <class T, ...

  2. 20145218PC平台逆向破解

    20145218PC平台逆向破解 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同 ...

  3. webapi put 请求405问题

    put 请求的时候  浏览器会像服务器发送两个请求 如何没做任何配置第一个options请求是会报错的 这是需要配置路由给options作响应 这时options请求就通过了,然后你们会看到你的put ...

  4. C#winform拖动无边框窗体

    private bool isMouseLeftKeyDown = false; private Point mousePointToClient = new Point();//相对于本窗体鼠标位置 ...

  5. asp.net core 外部认证多站点模式实现

    PS:之前因为需要扩展了微信和QQ的认证,使得网站是可以使用QQ和微信直接登录.github 传送门 .然后有小伙伴问,能否让这个配置信息(appid, appsecret)按需改变,而不是在 Con ...

  6. 将以太坊封装为 ERC20

    将以太坊封装为 ERC20 TOKEN 很多 DAPP 都是在处理 ERC20接口的 token, 其实很容易将以太坊封装为 ERC20,这样就可以统一处理, 至少我目前在做的雷电网络就是这么处理的. ...

  7. C# 继承(4)

    接上章: class NameList { public NameList() => Console.WriteLine("这个是NameList的构造函数"); publi ...

  8. linux联网配置(更新)

    重启网络配置:service network restart: 常见问题: linux 虚拟机ifconfig 显示eth1 文件ifcfg-eth0中device为eth0的问题   为什么eth0 ...

  9. apache2.4配置

    首先修改httpd.conf配置文件. vim conf/httpd.conf 添加: Listen 1234 然后把   # Virtual hosts   #Include conf/extra/ ...

  10. 蓝牙4.0BLE抓包(三) – 扫描请求和扫描响应

    版权声明:本文为博主原创文章,转载请注明作者和出处.    作者:强光手电[艾克姆科技-无线事业部] 1. 扫描请求和扫描响应 广播包含扫描请求SCAN_REQ和扫描响应SCAN_RSP. 扫描请求: ...