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

  (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. Java模拟新浪微博登陆抓取数据

    前言:  兄弟们来了来了,最近有人在问如何模拟新浪微博登陆抓取数据,我听后默默地抽了一口老烟,暗暗的对自己说,老汉是时候该你出场了,所以今天有时间就整理整理,浅谈一二. 首先:  要想登陆新浪微博需要 ...

  2. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  3. 移动端地图技术分享-- 百度高德SDK

    http://blog.csdn.net/zkl99999/article/details/50961155

  4. c#访问数据库的两种方法以及事务的两种方法

    //2015/07/03 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  5. 内网穿透+VS2015自带IIS express实现本地调试(微信等需要将开发环境暴漏到外网的情况使用)

    今天一个兼职结束了,又要开始寻找新的兼职公司了 ,为了贴补家用啊,为了给儿子更好的生活加油! 抒情完毕进入正题,本篇文章要解决的问题是其实在开发微信支付,微信公众号等回调地址必须是外网可访问的80端口 ...

  6. JSP 学习二

    在基于昨天对JSP学习的基础上,今天我们来学习JSP的指令和JSP 对中文的处理. 一.JSP指令简介 JSP 指令是为JSP引擎而设计,它并不直接产生任何可见的输出,而只是告诉引擎如何处理JSP页面 ...

  7. BZOJ ac100题存档

    不知不觉AC100题了,放眼望去好像都是水题.在这里就做一个存档吧(特别感谢各位大神尤其是云神http://hi.baidu.com/greencloud和丽洁姐http://wjmzbmr.com/ ...

  8. 【译】C++日志(Logging in C++)

    声明:原创翻译,转载请注明出处!http://www.cnblogs.com/mewmicro/p/6432507.html 注:作者Petru Marginean,2007/09/05   日志记录 ...

  9. 理解javascript中参数的按值传递

    有人认为 JS 中参数传递:基本数据类型按值传递:引用类型按引用传递.呵呵 javascript中所有参数是按值传递的 但是当传入的参数是引用类型时,便带来了疑惑 引用类型值保存在内存中,而JS是不能 ...

  10. KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-yilianyun

    koahub-yilianyun 微信易联云打印机接口 koahub-yilianyun易联云打印机node接口 Installation $ npm install koahub-yilianyun ...