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

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

 private bool Proj2Geo(ISpatialReference pspr, double xProj, double yProj, ref double xGeo, ref double yGeo)
{
if (pspr is IGeographicCoordinateSystem)
return false;
IProjectedCoordinateSystem pcs = pspr as IProjectedCoordinateSystem;
ISpatialReference gspr = pcs.GeographicCoordinateSystem; IPoint pt = new PointClass();
pt.PutCoords(xProj, yProj);
pt.SpatialReference = pspr;
pt.Project(gspr);
xGeo = pt.X;
yGeo = pt.Y; return true;
} private bool Geo2Proj(ISpatialReference pspr, double xGeo, double yGeo, ref double xProj, ref double yProj)
{
if (pspr is IGeographicCoordinateSystem)
return false;
IProjectedCoordinateSystem pcs = pspr as IProjectedCoordinateSystem;
ISpatialReference gspr = pcs.GeographicCoordinateSystem; IPoint pt = new PointClass();
pt.PutCoords(xGeo, yGeo);
pt.SpatialReference = gspr;
pt.Project(pspr);
xProj = pt.X;
yProj = pt.Y; return true;
}

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

 public class GridInfo
{
public double XMin;
public double XMax;
public double YMin;
public double YMax;
public int rows;
public int cols; public void setGridInfo(double xMax, double xMin, double yMax, double yMin, int rowCount, int colCount)
{
XMax = xMax;
XMin = xMin;
YMax = yMax;
YMin = yMin;
rows = rowCount;
cols = colCount;
}
}

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

 private GridInfo setGridInfoByScale(int scale)
{
GridInfo gridInfo = new GridInfo();
double dxInSnd, dyInSnd;
switch (scale)
{
case :
dxInSnd = Degree.Degree2Second(0.03125);
dyInSnd = Degree.Minute2Second(1.25);
break;
case :
dxInSnd = Degree.Degree2Second(0.0625);
dyInSnd = Degree.Minute2Second(2.5);
break;
case :
dxInSnd = Degree.Minute2Second(7.5);
dyInSnd = Degree.Minute2Second();
break;
case :
dxInSnd = Degree.Minute2Second();
dyInSnd = Degree.Minute2Second();
break;
case :
dxInSnd = Degree.Minute2Second();
dyInSnd = Degree.Minute2Second();
break;
case :
dxInSnd = Degree.Degree2Second(1.5);
dyInSnd = Degree.Degree2Second();
break;
case :
dxInSnd = Degree.Degree2Second();
dyInSnd = Degree.Degree2Second();
break;
case :
dxInSnd = Degree.Degree2Second();
dyInSnd = Degree.Degree2Second();
break;
default:
dxInSnd = ;
dyInSnd = ;
break;
} if (dxInSnd == dyInSnd && dxInSnd == 0.0)
return null; double pXMin = 0.0, pXMax = 0.0, pYMin = 0.0, pYMax = 0.0;
double gXMin = 0.0, gXMax = 0.0, gYMin = 0.0, gYMax = 0.0;
if (envelope.SpatialReference is IProjectedCoordinateSystem)
{
Proj2Geo(envelope.SpatialReference, envelope.XMax, envelope.YMax, ref gXMax, ref gYMax);
Proj2Geo(envelope.SpatialReference, envelope.XMin, envelope.YMin, ref gXMin, ref gYMin);
}
else
{
gXMax = envelope.XMax; gXMin = envelope.XMin;
gYMax = envelope.YMax; gYMin = envelope.YMin;
}
int cols =Convert.ToInt32(Math.Round(Degree.Degree2Second( - gXMin) / dxInSnd)) + ;
gridInfo.XMin = - Degree.Second2Degree(cols * dxInSnd);
cols = Convert.ToInt32(Math.Round(Degree.Degree2Second( - gXMax) / dxInSnd));
gridInfo.XMax = - Degree.Second2Degree(cols * dxInSnd); int rows = Convert.ToInt32(Math.Round(Degree.Degree2Second(gYMin) / dyInSnd));
gridInfo.YMin =Degree.Second2Degree(rows * dyInSnd);
rows = Convert.ToInt32(Math.Round(Degree.Degree2Second(gYMax) / dyInSnd)) + ;
gridInfo.YMax =Degree.Second2Degree( rows * dyInSnd); gridInfo.rows = Convert.ToInt32(Math.Round(Degree.Degree2Second(gridInfo.YMax - gridInfo.YMin) / dyInSnd));
gridInfo.cols = Convert.ToInt32(Math.Round(Degree.Degree2Second(gridInfo.XMax - gridInfo.XMin) / dxInSnd)); if (envelope.SpatialReference is IProjectedCoordinateSystem)
{
Geo2Proj(envelope.SpatialReference, gridInfo.XMax, gridInfo.YMax, ref pXMax, ref pYMax);
Geo2Proj(envelope.SpatialReference, gridInfo.XMin, gridInfo.YMin, ref pXMin, ref pYMin);
gridInfo.XMax = pXMax; gridInfo.XMin = pXMin;
gridInfo.YMax = pYMax; gridInfo.YMin = pYMin;
} return gridInfo;
}

  (3)图幅命名类

 public class FrameName
{
private int scale;
/// <summary>
///
/// </summary>
/// <param name="Scale">分数比例尺的分母(比例尺为1:50000则参数为50000)</param>
public FrameName(int Scale)
{
scale = Scale;
} public String getFrameName(double longtitude, double latitude)
{
int baseRowCount=(int)(latitude / );
char baseChar = Convert.ToChar('A' + baseRowCount);
int baseNum = (int)(longtitude / ) + ; if (scale == )
return String.Format("{0}{1}", baseChar, baseNum); char scaleChar = 'E'; //1:50000比例尺的代码为E,其他以后补充
switch (scale)
{
case :
scaleChar='B';break;
case :
scaleChar = 'C';break;
case :
scaleChar = 'D';break;
case :
scaleChar='E';break;
case :
scaleChar = 'F';break;
case :
scaleChar = 'G';break;
case :
scaleChar = 'H';break;
} double dxInSnd, dyInSnd;
switch (scale)
{
case :
dxInSnd = 0.03125;
dyInSnd = 0.0208333333;
break;
case :
dxInSnd = 0.0625;
dyInSnd = 0.0416666667;
break;
case :
dxInSnd = 0.125;
dyInSnd = 0.0833333333;
break;
case :
dxInSnd = 0.25;
dyInSnd = 0.1666666667;
break;
case :
dxInSnd = 0.5;
dyInSnd = 0.3333333333;
break;
case :
dxInSnd = 1.5;
dyInSnd = ;
break;
case :
dxInSnd = ;
dyInSnd = ;
break;
default:
dxInSnd = ;
dyInSnd = ;
break;
} if (dxInSnd == dyInSnd && dxInSnd == 0.0)
return null; int row = (int)(((baseRowCount + ) * - latitude)/dyInSnd) + ;
//int row = 24-((int)(latitude / dyInSnd)) % 24;
int col = (int)((longtitude % ) /dxInSnd) + ; return String.Format("{0}{1}{2}{3}{4}", baseChar, baseNum, scaleChar, row.ToString().PadLeft(, ''), col.ToString().PadLeft(, ''));
} }

  (4)调用函数进行分割

 private void CreateFrame(GridInfo gridInfo, String outDir, int scale)
{
double xLength = (gridInfo.XMax - gridInfo.XMin) / gridInfo.cols;
double yLength = (gridInfo.YMax - gridInfo.YMin) / gridInfo.rows;
FrameName frameName = new FrameName(scale); for (int i = ; i < gridInfo.rows; i++)
{
double yMin = gridInfo.YMin + i * yLength;
double yMax = gridInfo.YMin + (i + ) * yLength;
for (int j = ; j < gridInfo.cols; j++)
{
double xMin = gridInfo.XMin + j * xLength;
double xMax = gridInfo.XMin + (j + ) * xLength;
String pszOutFile; if (envelope.SpatialReference is IProjectedCoordinateSystem)
{
double prjX = 0.0, prjY = 0.0;
Proj2Geo(envelope.SpatialReference, (xMax + xMin) / , (yMax + yMin) / , ref prjX, ref prjY);
pszOutFile = frameName.getFrameName(prjX,prjY);
}
else
pszOutFile = frameName.getFrameName((xMax + xMin) / , (yMax + yMin) / );
pszOutFile = outDir + "\\" + pszOutFile + ".tif";
CutUpdateImageByAOIGDAL(rasterLyr.FilePath, pszOutFile, xMin, xMax, yMin, yMax, "GTiff");
}
}
}

  通过这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. elasticsearch-5.2在windows下的安装方法

    elasticsearch-5.2.1安装方法 1. 安装java 下载安装java jdk 1.7 以上 配置java环境变量 右击[我的电脑]---[属性]-----[高级系统设置]---[环境变 ...

  2. 配置NFS服务与tftp服务

    在VMware在安装ubuntu的图解 链接:http://pan.baidu.com/s/1jIofvYu 密码:da72 图解里已经解压安装了VMware Tools,接下来必须要安装的就是NFS ...

  3. 微信小程序 网络请求之设置合法域名

    设置域名 登录微信公众号后台小程序中 设置→开发设置→服务器设置 必须设置域名,微信小程序才能进行网络通讯,不然会报错 如果设置好了合法域名,开发工具还提示不在合法域名列表中,因为在微信会有一段时间的 ...

  4. js拉起或下载app

    产品提了个需求,通过手机网页判断是否安装了自己公司app,如果安装了则拉起app,没有安装则跳转到下载页. 经过各种查阅资料尝试总结了一个还算可以的办法. 拉起app的原理就是js和原生统一好一个地址 ...

  5. 零基础HTML编码学习笔记

    任务目的 了解HTML的定义.概念.发展简史 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 任务描述:完成一个HTML页面代 ...

  6. JavaScript两个变量交换值(不使用临时变量)

    概要  本文主要描述,如何不使用中间值,将两个变量的值进行交换. 一.普通做法 var a = 1, b = 2, tmp; tmp = a; a = b; b = tmp;  普通的做法就是声明多一 ...

  7. lxd容器之GPU发现和加载

    lxd gpu设备发现: // /dev/nvidia[0-9]+ type nvidiaGpuCards struct { path string major int minor int id st ...

  8. 实战Tomcat配置SSL,使用openssl制作证书

    制作证书以及Tomcat配置 搭建openssl环境,下载openssl并设置环境变量方便命令行的使用: 修改openssl配置文件,设置dir目录,如设置dir=e:/temp/openssl_ca ...

  9. Java进程通讯

    管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 创建子进程Java有两种方式 //第一种 Runtime rt = Runtime.get ...

  10. Maven的声明周期(Lifecycle )和命令(Phase)

    生命周期(Lifecycle ) Maven有三套相互独立的生命周期(Lifecycle ): Clean Lifecycle:做一些清理工作: Default Lifecycle:构建的核心部分.编 ...