灾前灾后对比功能是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. 第十八课 Gazebo仿真器

    1.Gazebo概述 在Gazebo中的模拟效果是非常好的. 它的特性 Dynamics Simulation 直接控制物理引擎参数 Building Editor 无需代码即可在Gazebo中创建机 ...

  2. 运行monitor提示需要安装旧JAVA SE 6运行环境

    MAC系统下运行monitor命令 ➜ tools git:(master) ✗ monitor 提示如下: 若要打开Eclipse.app,您需要Java SE 6 runtime,您想现在安装一个 ...

  3. 对于网站,APP开发流程的理解

    • 明确产品目标用户,目标市场 • 明确将要开发的产品面世后是要解决什么样的问题 • 梳理产品有哪些功能点,功能点如何按照模块划分 • 站在用户角度思考用户怎样使用这款产品,以故事的情景讲述用户如何使 ...

  4. HTML <area> 标签区域map标签

    1.距形:(左上角顶点坐标为(x1,y1),右下角顶点坐标为(x2,y2)) <area shape="rect" coords="x1,y1,x2,y2" ...

  5. Canvas保存为图片

    public static void GenerateCanvas(string imgSaveName, int canvasWidth, int canvasHeight, string imgD ...

  6. 如何彻底删除TFS上的团队项目 For VS 2017

    参考 Visual Studio 2017 TFSDeleteProject.exe 位置 X:\Program Files (x86)\Microsoft Visual Studio\2017\En ...

  7. 一、认识Node.js

    1.什么是Note.js? 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个 Javascript 运行环境(runtime).它让 JavaScript 可 ...

  8. PHP的Composer 与 Packagist,简单入门

    [转]http://www.php.cn/manual/view/34000.html Composer 是一个 杰出 的依赖管理器.在 composer.json 文件中列出你项目所需的依赖包,加上 ...

  9. UML之类图详解

    原文链接:https://www.cnblogs.com/xsyblogs/p/3404202.html 我们通过一个示例来了解UML类图的基本语法结构.画UML类图其实有专业的工具,像常用的Visi ...

  10. WCF 客户端连接慢

    WCF客户端第一次连接超过1分钟,以后再连接就快了. 在 Config中加入 <basicHttpBinding> <binding name="BasicHttpBind ...