在上篇实现了遥感影像的切割,本篇讲切割前的准备。主要分为以下几步:

  (1)将影像的投影坐标转换为地理坐标,以便于之后的图幅划分。AE坐标转换函数如下

  1. private bool Proj2Geo(ISpatialReference pspr, double xProj, double yProj, ref double xGeo, ref double yGeo)
  2. {
  3. if (pspr is IGeographicCoordinateSystem)
  4. return false;
  5. IProjectedCoordinateSystem pcs = pspr as IProjectedCoordinateSystem;
  6. ISpatialReference gspr = pcs.GeographicCoordinateSystem;
  7.  
  8. IPoint pt = new PointClass();
  9. pt.PutCoords(xProj, yProj);
  10. pt.SpatialReference = pspr;
  11. pt.Project(gspr);
  12. xGeo = pt.X;
  13. yGeo = pt.Y;
  14.  
  15. return true;
  16. }
  17.  
  18. private bool Geo2Proj(ISpatialReference pspr, double xGeo, double yGeo, ref double xProj, ref double yProj)
  19. {
  20. if (pspr is IGeographicCoordinateSystem)
  21. return false;
  22. IProjectedCoordinateSystem pcs = pspr as IProjectedCoordinateSystem;
  23. ISpatialReference gspr = pcs.GeographicCoordinateSystem;
  24.  
  25. IPoint pt = new PointClass();
  26. pt.PutCoords(xGeo, yGeo);
  27. pt.SpatialReference = gspr;
  28. pt.Project(pspr);
  29. xProj = pt.X;
  30. yProj = pt.Y;
  31.  
  32. return true;
  33. }

  (2)计算包含影像的标准图幅的四至,首先我定义了一个格网类

  1. public class GridInfo
  2. {
  3. public double XMin;
  4. public double XMax;
  5. public double YMin;
  6. public double YMax;
  7. public int rows;
  8. public int cols;
  9.  
  10. public void setGridInfo(double xMax, double xMin, double yMax, double yMin, int rowCount, int colCount)
  11. {
  12. XMax = xMax;
  13. XMin = xMin;
  14. YMax = yMax;
  15. YMin = yMin;
  16. rows = rowCount;
  17. cols = colCount;
  18. }
  19. }

根据比例尺计算格网的大小

  1. private GridInfo setGridInfoByScale(int scale)
  2. {
  3. GridInfo gridInfo = new GridInfo();
  4. double dxInSnd, dyInSnd;
  5. switch (scale)
  6. {
  7. case :
  8. dxInSnd = Degree.Degree2Second(0.03125);
  9. dyInSnd = Degree.Minute2Second(1.25);
  10. break;
  11. case :
  12. dxInSnd = Degree.Degree2Second(0.0625);
  13. dyInSnd = Degree.Minute2Second(2.5);
  14. break;
  15. case :
  16. dxInSnd = Degree.Minute2Second(7.5);
  17. dyInSnd = Degree.Minute2Second();
  18. break;
  19. case :
  20. dxInSnd = Degree.Minute2Second();
  21. dyInSnd = Degree.Minute2Second();
  22. break;
  23. case :
  24. dxInSnd = Degree.Minute2Second();
  25. dyInSnd = Degree.Minute2Second();
  26. break;
  27. case :
  28. dxInSnd = Degree.Degree2Second(1.5);
  29. dyInSnd = Degree.Degree2Second();
  30. break;
  31. case :
  32. dxInSnd = Degree.Degree2Second();
  33. dyInSnd = Degree.Degree2Second();
  34. break;
  35. case :
  36. dxInSnd = Degree.Degree2Second();
  37. dyInSnd = Degree.Degree2Second();
  38. break;
  39. default:
  40. dxInSnd = ;
  41. dyInSnd = ;
  42. break;
  43. }
  44.  
  45. if (dxInSnd == dyInSnd && dxInSnd == 0.0)
  46. return null;
  47.  
  48. double pXMin = 0.0, pXMax = 0.0, pYMin = 0.0, pYMax = 0.0;
  49. double gXMin = 0.0, gXMax = 0.0, gYMin = 0.0, gYMax = 0.0;
  50. if (envelope.SpatialReference is IProjectedCoordinateSystem)
  51. {
  52. Proj2Geo(envelope.SpatialReference, envelope.XMax, envelope.YMax, ref gXMax, ref gYMax);
  53. Proj2Geo(envelope.SpatialReference, envelope.XMin, envelope.YMin, ref gXMin, ref gYMin);
  54. }
  55. else
  56. {
  57. gXMax = envelope.XMax; gXMin = envelope.XMin;
  58. gYMax = envelope.YMax; gYMin = envelope.YMin;
  59. }
  60. int cols =Convert.ToInt32(Math.Round(Degree.Degree2Second( - gXMin) / dxInSnd)) + ;
  61. gridInfo.XMin = - Degree.Second2Degree(cols * dxInSnd);
  62. cols = Convert.ToInt32(Math.Round(Degree.Degree2Second( - gXMax) / dxInSnd));
  63. gridInfo.XMax = - Degree.Second2Degree(cols * dxInSnd);
  64.  
  65. int rows = Convert.ToInt32(Math.Round(Degree.Degree2Second(gYMin) / dyInSnd));
  66. gridInfo.YMin =Degree.Second2Degree(rows * dyInSnd);
  67. rows = Convert.ToInt32(Math.Round(Degree.Degree2Second(gYMax) / dyInSnd)) + ;
  68. gridInfo.YMax =Degree.Second2Degree( rows * dyInSnd);
  69.  
  70. gridInfo.rows = Convert.ToInt32(Math.Round(Degree.Degree2Second(gridInfo.YMax - gridInfo.YMin) / dyInSnd));
  71. gridInfo.cols = Convert.ToInt32(Math.Round(Degree.Degree2Second(gridInfo.XMax - gridInfo.XMin) / dxInSnd));
  72.  
  73. if (envelope.SpatialReference is IProjectedCoordinateSystem)
  74. {
  75. Geo2Proj(envelope.SpatialReference, gridInfo.XMax, gridInfo.YMax, ref pXMax, ref pYMax);
  76. Geo2Proj(envelope.SpatialReference, gridInfo.XMin, gridInfo.YMin, ref pXMin, ref pYMin);
  77. gridInfo.XMax = pXMax; gridInfo.XMin = pXMin;
  78. gridInfo.YMax = pYMax; gridInfo.YMin = pYMin;
  79. }
  80.  
  81. return gridInfo;
  82. }

  (3)图幅命名类

  1. public class FrameName
  2. {
  3. private int scale;
  4. /// <summary>
  5. ///
  6. /// </summary>
  7. /// <param name="Scale">分数比例尺的分母(比例尺为1:50000则参数为50000)</param>
  8. public FrameName(int Scale)
  9. {
  10. scale = Scale;
  11. }
  12.  
  13. public String getFrameName(double longtitude, double latitude)
  14. {
  15. int baseRowCount=(int)(latitude / );
  16. char baseChar = Convert.ToChar('A' + baseRowCount);
  17. int baseNum = (int)(longtitude / ) + ;
  18.  
  19. if (scale == )
  20. return String.Format("{0}{1}", baseChar, baseNum);
  21.  
  22. char scaleChar = 'E'; //1:50000比例尺的代码为E,其他以后补充
  23. switch (scale)
  24. {
  25. case :
  26. scaleChar='B';break;
  27. case :
  28. scaleChar = 'C';break;
  29. case :
  30. scaleChar = 'D';break;
  31. case :
  32. scaleChar='E';break;
  33. case :
  34. scaleChar = 'F';break;
  35. case :
  36. scaleChar = 'G';break;
  37. case :
  38. scaleChar = 'H';break;
  39. }
  40.  
  41. double dxInSnd, dyInSnd;
  42. switch (scale)
  43. {
  44. case :
  45. dxInSnd = 0.03125;
  46. dyInSnd = 0.0208333333;
  47. break;
  48. case :
  49. dxInSnd = 0.0625;
  50. dyInSnd = 0.0416666667;
  51. break;
  52. case :
  53. dxInSnd = 0.125;
  54. dyInSnd = 0.0833333333;
  55. break;
  56. case :
  57. dxInSnd = 0.25;
  58. dyInSnd = 0.1666666667;
  59. break;
  60. case :
  61. dxInSnd = 0.5;
  62. dyInSnd = 0.3333333333;
  63. break;
  64. case :
  65. dxInSnd = 1.5;
  66. dyInSnd = ;
  67. break;
  68. case :
  69. dxInSnd = ;
  70. dyInSnd = ;
  71. break;
  72. default:
  73. dxInSnd = ;
  74. dyInSnd = ;
  75. break;
  76. }
  77.  
  78. if (dxInSnd == dyInSnd && dxInSnd == 0.0)
  79. return null;
  80.  
  81. int row = (int)(((baseRowCount + ) * - latitude)/dyInSnd) + ;
  82. //int row = 24-((int)(latitude / dyInSnd)) % 24;
  83. int col = (int)((longtitude % ) /dxInSnd) + ;
  84.  
  85. return String.Format("{0}{1}{2}{3}{4}", baseChar, baseNum, scaleChar, row.ToString().PadLeft(, ''), col.ToString().PadLeft(, ''));
  86. }
  87.  
  88. }

  (4)调用函数进行分割

  1. private void CreateFrame(GridInfo gridInfo, String outDir, int scale)
  2. {
  3. double xLength = (gridInfo.XMax - gridInfo.XMin) / gridInfo.cols;
  4. double yLength = (gridInfo.YMax - gridInfo.YMin) / gridInfo.rows;
  5. FrameName frameName = new FrameName(scale);
  6.  
  7. for (int i = ; i < gridInfo.rows; i++)
  8. {
  9. double yMin = gridInfo.YMin + i * yLength;
  10. double yMax = gridInfo.YMin + (i + ) * yLength;
  11. for (int j = ; j < gridInfo.cols; j++)
  12. {
  13. double xMin = gridInfo.XMin + j * xLength;
  14. double xMax = gridInfo.XMin + (j + ) * xLength;
  15. String pszOutFile;
  16.  
  17. if (envelope.SpatialReference is IProjectedCoordinateSystem)
  18. {
  19. double prjX = 0.0, prjY = 0.0;
  20. Proj2Geo(envelope.SpatialReference, (xMax + xMin) / , (yMax + yMin) / , ref prjX, ref prjY);
  21. pszOutFile = frameName.getFrameName(prjX,prjY);
  22. }
  23. else
  24. pszOutFile = frameName.getFrameName((xMax + xMin) / , (yMax + yMin) / );
  25. pszOutFile = outDir + "\\" + pszOutFile + ".tif";
  26. CutUpdateImageByAOIGDAL(rasterLyr.FilePath, pszOutFile, xMin, xMax, yMin, yMax, "GTiff");
  27. }
  28. }
  29. }

  通过这4步,一个简易的图幅分割工具就做好了。

AE + GDAL实现影像按标准图幅分割(下)的更多相关文章

  1. AE + GDAL实现影像按标准图幅分割(上)

    最近有个项目,其中有个功能是要将遥感影像按标准图幅分割,一开始用AE的接口,慢的让人抓狂,就改用GDAL,速度提升很大.我主要通过http://blog.csdn.net/liminlu0314/学习 ...

  2. 【GIS】GDAL Python 影像裁剪

    # -*- coding: utf-8 -*- """ Created on Fri Nov 30 11:45:03 2018 @author: Administrato ...

  3. C#+GDAL读取影像(1)

    环境:VS2010,C#,GDAL1.7 读取影像: using System; using System.Collections.Generic; using System.ComponentMod ...

  4. GDAL读取影像并插值

    影像读取 并缩放 读取大影像某一部分,并缩放到指定大小,我们有时会用如下代码: #include "gdal.h" #include "gdal_priv.h" ...

  5. 利用GDAL实现影像的几何校正

    一.概述 遥感影像和地理坐标进行关联的方式一般有好几种,一种是直接给出了仿射变换系数,即6个參数,左上角地理坐标,纵横方向上的分辨率,以及旋转系数.在这样的情况下,求出某一像素点的地理坐标非常easy ...

  6. gdal 遥感影像水体数据提取

  7. [APUE]标准IO库(下)

    一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...

  8. python标准模块(下)

    Python 系统标准模块(shutil.logging.shelve.configparser.subprocess.xml.yaml.自定义模块) 目录: shutil logging模块 she ...

  9. 标准WPS框架下的空间信息处理服务部署方法

    笔者第一篇博客里面曾介绍过将专题图制作功能发布为WPS,但随着后面的研究,才发现那时候发布的不是真正WPS框架下的服务,而只是通过Servlet将其发布为可调用的网络服务,所以今天再具体介绍一下真正的 ...

随机推荐

  1. php解析

    vim /usr/local/apache/conf/httpd.conf     ##修改apache的网页配置文件  →  解析php文件 /usr/local/apache/bin/apache ...

  2. Java安装

    java特点:跨平台.简单.面向对像编译后解释再运行安装JDK 环境变量的配置:JAVA_HOME:JDK的根目录====C:\Program Files\Java\jdk1.7.0_25Path:J ...

  3. php上线教程----阿里云下设值二级域名并将项目上线

    在工作中,我们需要在一个主机地址下分配多个域名来上线多个项目,但是怎么设置一个二级域名并且完成上线项目的,接下来我们就以阿里云为例演示整个上线流程 首先登陆你的阿里云,找到你的域名 点击解析,进入解析 ...

  4. CentOS 6.5安装jdk1.8

    1.源码包准备: 首先到官网下载jdk-8u66-linux-x64.tar.gz, http://www.oracle.com/technetwork/java/javase/downloads/j ...

  5. IOS缓存管理之YYCache使用

    前言: 最近一直在致力于为公司app添加缓存功能,为了寻找一个最佳方案,这几天先做个技术预研,经过这两天的查找资料基本上确定了两个开源框架进行选择,这两个开源框架分别是:PINCache.YYCach ...

  6. MongoDB【第一篇】安装

    第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. MongoDB 版本 mongodb-linux-x86_64-rhel70-3.4.2 3. 设置 ...

  7. 利用jink调试程序,时间不准的解决办法

    前几天,做工程,遇到了利用jlink的SWD的模式调试程序,定时器延时不准的问题,上网搜了好多,终于找到了问题所在,感谢万能的网友.时间不对是因为Keil的设置问题. 以下是转自网友: 一.先说说仿真 ...

  8. Keepalived + HAProxy 搭建【第一篇】HAProxy 的安装与配置

    第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. 安装包 haproxy-1.7.2.tar.gz 第二步:安装 # tar zxvf haproxy ...

  9. Docker私有仓库--自签名方式

    为了能集中管理我们创建好的镜像,方便部署服务,我们会创建私有的Docker仓库.通读了一遍官方文档,Docker为了确保安全使用TLS,需要CA认证,认证时间长的要钱啊,免费过期时间太短,还是用自签名 ...

  10. 局域网里连接mysql服务器,其他人连接自己的mysql服务器

    应用场景:  自己在自己的机器上开发网站,同事也要和我一起开发,就两个人,我自己的机器当做服务器,让他直接连我的数据库,看我的项目就行了,并且用svn进行开发,相当不错 问题: 怎样在局域网里,其他人 ...