灾前灾后对比功能是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. .NET读取服务器或本地文件

    //把本地文件信息读入数据流中                    FileStream stream = new FileStream(path, FileMode.Open, FileAcces ...

  2. MongoDB整理笔记のCRUD

    添加 下面我们来建立一个test 的集合并写入一些数据.建立两个对象j 和t , 并保存到集合中去.在例子里 “>” 来表示是 shell 输入提示符    > j = { name : ...

  3. Delphi XE7 GPS控件android下的新变化

    Delphi XE7 GPS控件的Android新变化 GPS控件的Accuracy可以起作用了,Accuracy>0时:      1--100:ACCURACY_HIGH  101--500 ...

  4. Fragment基本介绍

    1.生命周期 onCreateView() :创建视图 onActivityCreate():activity创建完成的时候调用 onDestoryView():销毁视图 onDetach():与ac ...

  5. 注册 asp.net IIS

    C:\Windows\Microsoft.NET\Framework64\v4.0.30319/aspnet_regiis.exe -i

  6. c# enum遍历

    public enum Suit { Spades, Hearts, Clubs, Diamonds } //遍历valueforeach (Suit suit in (Suit[]) Enum.Ge ...

  7. CentOS目录与文件操作

    pwd:查看当前目录 touch:创建文件 touch a.c ls:查看当前目录下文件,也可以ls /tmp查看tmp下的文件 rm:删除文件 rm a.c,也可以rm a.c -rf 强制删除 c ...

  8. 如何优雅地使用win10的Linux子系统

    转自: http://blog.csdn.net/u010053050/article/details/52388663 http://www.rehack.cn/techshare/devtools ...

  9. Java高质量代码之 — 泛型与反射

    在Java5后推出了泛型,使我们在编译期间操作集合或类时更加的安全,更方便代码的阅读,而让身为编译性语言的Java提供动态性的反射技术,更是在框架开发中大行其道,从而让Java活起来,下面看一下在使用 ...

  10. 深度学习之 TensorFlow(三):TensorFlow 源代码解析

    分析一下 TensorFlow 的文件结构.这里的源代码版本是 TensorFlow1.7.0 . 目录结构如下: 其中的核心目录是 tensorflow 目录,最重要的源代码保存在这里,目录结构如下 ...