灾前灾后对比功能是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. C#中对DataTable进行全连接后group by,orderby

    var result = from temp2 in                             (                                 from u in u ...

  2. 为docker设置国内镜像

    docker的默认镜像(https://hub.docker.com/)地址,拉取镜像时是比较慢的,经常会超时,有时拉取几个小时.为了加快拉取的时间和速度,需要添加中国的镜像地址: 国内的加速地址: ...

  3. 【Android学习】实现卡片式ListView

    效果: 主要是设置xml文件 两种状态下的item card_background.xml <?xml version="1.0" encoding="utf-8& ...

  4. 最近的一些零碎知识点,jquery遍历

    1.使按钮无法点击 $(“#btn”).attr("disable",true); 2.返回上一个页面 history.back(-1); 3.$(this).siblings() ...

  5. HTML 5与CSS 3权威指南(第2版·上册) 中文pdf扫描版​

    HTML5与CSS3权威指南(第2版·上册)已经成为HTML 5与CSS 3图书领域的一个标杆,被读者誉为“系统学习HTML 5与CSS 3技术的最佳指导参考书之一”和“Web前端工程师案头必备图书之 ...

  6. SOA-WebService

    一.创建Web服务方法 在项目上右击选择新建项>>Web服务(ASMX),并命名,如MyWebService.asmx 二.注意事项 所有需要外界调用的方法上端均需增加特性[WebMeth ...

  7. linux命令笔记,零散记录<不完整,学习用>

    uname -a 输出系统架构 cp 源文件 目标文件 mv同理 tar –xvf file.tar // 解压 tar包 tar -zxvf file.tar.gz // 解压tar.gz tar ...

  8. JVM之类加载机制

    JVM之类加载机制 JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程. 类加载五部分 加载 加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这 ...

  9. 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)

    假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...

  10. Github 三种克隆模式

    1.我称为平常模式,用于项目的本地克隆使用.(无权限.无加密.ssh protocol) git clone http://github.com/username/exampleproject 2.我 ...