地图平移校正,当加载两幅空间参考一样的影像,其中一幅影像有点偏移,这时就以另一幅影像为基准将其进行平移校正,然后保存,再次加载就不会出现偏移了。

下面来介绍下实现的主要代码:

首先通过选中目录树中的要平移的图层,拖动图层进行平移校正,计算出图层平移的偏移量,然后修改栅格数据集的仿射变换参数的坐标即可,核心方法就是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之上,两幅图坐标系一致,但是却没有重合

平移保存之后,再次加载:

最新文章

  1. nginx配置
  2. 关于兼容性——百分比对于IE浏览器的影响
  3. SpringMVC从入门到精通之第四章
  4. [问题2014A05] 解答
  5. ORACLE fetch bulk collect into limit
  6. 百度之星A
  7. jquery自定义方法
  8. CKeditor3.6.2 配置与精简
  9. 数据库msqlserver的几种类型及解决MSSQLServer服务启动不了的问题
  10. 九道大型软件公司.net面试题!一定得看(附答案)
  11. linux下处理excel里copy的某列的字符串,去除行末空格并添加特殊字段
  12. web.config文件中配置数据库连接的两种方式
  13. 负载,性能测试工具-Gatling
  14. DDD领域驱动设计理论篇 - 学习笔记
  15. 虹软人脸识别ArcFace2.0 Android SDK使用教程
  16. NI_NUMERICHOST&quot; is not exported by the Socket module &quot;getaddrinfo&quot; is not expo
  17. [日常] Go语言圣经--接口约定习题2
  18. C语言short int
  19. [整] Android ListView 去除边缘阴影、选中色、拖动背景色等
  20. android 6.0之后动态获取权限

热门文章

  1. 再谈JQuery插件$.extend(), $.fn和$.fn.extend()
  2. Entity Framework快速入门--直接修改(简要介绍ObjectContext处理机制)
  3. python DDT读取excel测试数据
  4. python2.7响应数据中unicode转中文
  5. Spring源码研究:数据绑定
  6. 【单例模式】Singleton pattern
  7. screen工具
  8. 搜索引擎Hoot的源码阅读(提供源码)
  9. 【大数据系统架构师】0.3 MySQL数据库
  10. EF进阶篇(一)——概述