PIE SDK地图平移校正
地图平移校正,当加载两幅空间参考一样的影像,其中一幅影像有点偏移,这时就以另一幅影像为基准将其进行平移校正,然后保存,再次加载就不会出现偏移了。
下面来介绍下实现的主要代码:
首先通过选中目录树中的要平移的图层,拖动图层进行平移校正,计算出图层平移的偏移量,然后修改栅格数据集的仿射变换参数的坐标即可,核心方法就是PIE SDK的SetOffset 和GetOffset方法;
平移校正的过程主要涉及到鼠标的MouseDown、MouseUp和MouseMove事件。
当鼠标按下,记录鼠标的坐标,为开始坐标点m_StartPoint,鼠标移动就记录鼠标移动的坐标,为结束坐标点m_EndPoint,两个坐标去差值就是图层当前偏移的距离,然后设置图层的偏移量SetOffset()就可以移动图层。要注意的是当移动一次的时候再在上一次移动的基础上进行移动,需要设置开始坐标点的坐标为鼠标按下的点加上地图上一次偏移的距离的和,具体过程如代码所示。
/// <summary>
/// 图层平移校正按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tbn_PanConrrection_Click(object sender, EventArgs e)
{
//选中图层 根据目录树选中的图层为平移图层
IHookHelper hookHelper = new HookHelper();
hookHelper.Hook = mapControlMain;
IPmdContents pmdContents = hookHelper.GetContent();
PIETOCNodeTag tag = pmdContents.CustomerProperty as PIETOCNodeTag;
if (tag == null) return;
if (tag.Layer == null) return;
m_SelectedLayer = tag.Layer;
m_IsPan = true;
}
/// <summary>
/// 保存平移校正结果按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_SavePan_Click(object sender, EventArgs e)
{
if (m_IsPan != true) return;
double offsetX = ;
double offsetY = ;
m_SelectedLayer.GetOffset(ref offsetX, ref offsetY);//获取偏移量 string filePath = m_SelectedLayer.DataSourcePath;
IRasterDataset RasterDataset = DatasetFactory.OpenRasterDataset(filePath, OpenMode.Update);
double[] geoTrans = RasterDataset.GetGeoTransform(); geoTrans[] = geoTrans[] - offsetX;
geoTrans[] = geoTrans[] - offsetY;
RasterDataset.SetGeoTransform(geoTrans);
(RasterDataset as IDisposable).Dispose();//将平移校正后的结果进行保存
MessageBox.Show("保存成功");
m_IsPan = false;
}/// <summary>
/// 还原按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tbn_CancelPan_Click(object sender, EventArgs e)
{
if (m_SelectedLayer == null) return;
m_SelectedLayer.SetOffset(, );
mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
}
一、鼠标按下事件,触发MouseDown事件,记录开始坐标
/// <summary>
/// 鼠标按下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mapControlMain_MouseDown(object sender, MouseEventArgs e)
{
if (m_IsPan == false || m_SelectedLayer == null) return;
mapControlMain.CurrentTool = null;//防止点击平移等其他按钮冲突问题
m_StartPoint = mapControlMain.ActiveView.DisplayTransformation.ToMapPoint(e.X, e.Y);
double offsetX = ;
double offsetY = ;
m_SelectedLayer.GetOffset(ref offsetX, ref offsetY);//获取偏移量
m_StartPoint.PutCoords(m_StartPoint.X + offsetX, m_StartPoint.Y + offsetY);//在上一次移动的基础上继续平移
}
二、当鼠标在地图上移动时会触发MouseMove事件,计算平移量,设置图层平移
/// <summary>
/// 鼠标移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mapControlMain_MouseMove(object sender, MouseEventArgs e)
{
if (m_IsPan == false) return;
if (m_StartPoint == null || m_SelectedLayer == null) return;
m_EndPoint = mapControlMain.ActiveView.DisplayTransformation.ToMapPoint(e.X, e.Y); double offsetX = ;
double offsetY = ;
//计算偏移量
offsetX = m_StartPoint.X - m_EndPoint.X;
offsetY = m_StartPoint.Y - m_EndPoint.Y; m_SelectedLayer.SetOffset(offsetX, offsetY);//设置图层平移
mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);
}
三、最后鼠标弹起时,将开始点的坐标设置为空。
/// <summary>
/// 鼠标弹起事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void mapControlMain_MouseUp(object sender, MouseEventArgs e)
{
m_StartPoint = null;
}
代码路径:
项目名称 |
百度云盘地址下/PIE示例程序/13.小工具集锦/地图平移校正/ MapPanCorrectionDemo |
数据路径 |
百度云盘地址下/PIE示例数据/栅格数据/04.World/World.tif |
视频路径 |
百度云盘地址下/PIE视频教程/13.小工具集锦/地图平移校正.avi |
注意:
在地图初始化的时候,图层树控件需要手动绑定地图控件:
tocControlMain.SetBuddyControl(mapControlMain as PIE.Carto.IPmdContents);
效果图:
加载时,China.tif在World.tif之上,两幅图坐标系一致,但是却没有重合
平移保存之后,再次加载:
PIE SDK地图平移校正的更多相关文章
- PIE SDK地图放大镜
放大镜,在地图的浏览过程中在主地图和次地图中起到很好的辅助作用, 要实现放大镜功能主要就是通过两个mapControl控件,主地图控件是mapControlMain,放大镜控件是UserControl ...
- PIE SDK地图范围设置
1.功能简介 地图范围设置主要就是对图层的地图浏览控制,例如地图的放大.缩小.漫游.全图显示.1:1视图.比例尺等功能,能更好的与地图有一个互动的地图浏览体验.PIE SDK对地图范围设置主要利用IC ...
- PIE SDK地图图层渲染方案管理
1. 功能简介 在数据种类较多.渲染规则复杂的情况下,逐个设置其渲染方式是一件繁琐的工作.PIE SDK提供了一种省力省心的办法, PIE SDK提供栅格和矢量数据渲染方案的打开与保存.能够将配色方案 ...
- PIE SDK地图鹰眼图
鹰眼图,是GIS的一个基本功能,在鹰眼图上可以像从空中俯视一样查看地图框中所显示的地图在整个图中的位置,是对全局地图的一种概述表达,能够起到很好的空间提示和导航的作用.网上有很多Arcengine 二 ...
- PIE SDK地图图层控制
1. 功能简介 地图图层控制就是图层的相关操作,如地图图层数据的添加.删除.移动和拖拽等功能. 2. 功能实现说明 2.1. 实现思路及原理说明 第一步 图层添加是调用AddLayer方法将图层添加到 ...
- PIE SDK地图范围设置和图层事件监听
1. 功能简介 地图范围设置的监听就是通过IMapControlEvents接口对地图的视图范围更新或者地图的分辨率发生变化进行监听,然后做出相应的操作. 图层事件的监听就是通过IActiveView ...
- PIE SDK地图显示范围截图
1.1. 功能简介 地图显示范围截图是将当前地图显示的范围进行输出.输出的 格式是png.bmp,主要思路就是通过IActiveView接口下的Output()方法进行输出 1.2. 功能实现说明 2 ...
- PIE SDK地图鼠标事件监听
1.功能简介 地图鼠标事件包含鼠标的按下MouseDown(),弹起MouseUp(),移动MouseMove()等事件,通过这些事件可以对地图进行动态的操作,接下来以地图状态栏的信息为例具体介绍如何 ...
- PIE SDK正射校正
1. 算法功能简介 正射校正是对影像空间和几何畸变进行校正生成多中心投影平面正射图像的处理过程.它除了能纠正一般系统因素产生的几何畸变外,还可以消除地形引起的几何畸变 PIE支持算法功能的执行,下面对 ...
随机推荐
- JUnit 两日游
从一个简单的Junit demo到一个用户名与密码的验证 学习Junit,首先肯定是要环境的搭建与配置. 第一步,安装JDK,配置环境变量 第二步,安装eclipse.OS X环境下,eclipse并 ...
- MySQL性能调优与架构设计——第2章 MySQL架构组成
第2章 MySQL架构组成 前言 麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成, ...
- 日期多选插件Kalendae.js
在项目中要实现日期多选的功能,于是在网上找到Kalendae.js,此文主要记录本人对于Kalendae.js的一些用法,以便以后查阅,希望对读者也有所帮助 主要内容如下: Kalendaejs一句话 ...
- MongoDB整理笔记の索引
MongoDB 提供了多样性的索引支持,索引信息被保存在system.indexes 中,且默认总是为_id创建索引,它的索引使用基本和MySQL 等关系型数据库一样.其实可以这样说说,索引是凌驾于数 ...
- 操作文件方法简单总结(File,Directory,StreamReader,StreamWrite ) - Zery-zhang
一 基本介绍 操作文档,文件夹,需要用到的类 1 Directory (静态类) : 用于创建.移动和删除等操作通过 目录 和子 目录 DirectoryInfo (非静态): 2 File ...
- 【大数据之数据仓库】安装部署GreenPlum集群
本篇将向大家介绍如何快捷的安装部署GreenPlum测试集群,大家可以跟着我一块儿实践一把^_^ 1.主机资源 申请2台网易云主机,操作系统必须是RedHat或者CentOS,配置尽量高一点.如果是s ...
- c++多线程基础2(命名空间 this_thread)
整理自:zh.cppreference.com/w/cpp/thread std::this_thread::yield: 定义于头文件 <thread> 函数原型:void yield( ...
- luoguP3302 [SDOI2013]森林
https://www.luogu.org/problemnew/show/P3302 看到查询第 k 小,而且是一颗树,可以联想到在树上的主席树,a 和 b 路径中第 k 小可以通过在 a, b, ...
- 洛谷P2510 [HAOI2008]下落的圆盘(计算几何)
题面 传送门 题解 对于每个圆,我们单独计算它被覆盖的周长是多少 只有相交的情况需要考虑,我们需要知道相交的那段圆弧的角度,发现其中一个交点和两个圆的圆心可以构成一个三角形且三边都已经知道了,那么我们 ...
- 数据解析之xpath
一.环境安装 下载lxml pip install lxml 二.使用 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取 ...