AE + GDAL实现影像按标准图幅分割(下)
在上篇实现了遥感影像的切割,本篇讲切割前的准备。主要分为以下几步:
(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实现影像按标准图幅分割(下)的更多相关文章
- AE + GDAL实现影像按标准图幅分割(上)
最近有个项目,其中有个功能是要将遥感影像按标准图幅分割,一开始用AE的接口,慢的让人抓狂,就改用GDAL,速度提升很大.我主要通过http://blog.csdn.net/liminlu0314/学习 ...
- 【GIS】GDAL Python 影像裁剪
# -*- coding: utf-8 -*- """ Created on Fri Nov 30 11:45:03 2018 @author: Administrato ...
- C#+GDAL读取影像(1)
环境:VS2010,C#,GDAL1.7 读取影像: using System; using System.Collections.Generic; using System.ComponentMod ...
- GDAL读取影像并插值
影像读取 并缩放 读取大影像某一部分,并缩放到指定大小,我们有时会用如下代码: #include "gdal.h" #include "gdal_priv.h" ...
- 利用GDAL实现影像的几何校正
一.概述 遥感影像和地理坐标进行关联的方式一般有好几种,一种是直接给出了仿射变换系数,即6个參数,左上角地理坐标,纵横方向上的分辨率,以及旋转系数.在这样的情况下,求出某一像素点的地理坐标非常easy ...
- gdal 遥感影像水体数据提取
- [APUE]标准IO库(下)
一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中 ...
- python标准模块(下)
Python 系统标准模块(shutil.logging.shelve.configparser.subprocess.xml.yaml.自定义模块) 目录: shutil logging模块 she ...
- 标准WPS框架下的空间信息处理服务部署方法
笔者第一篇博客里面曾介绍过将专题图制作功能发布为WPS,但随着后面的研究,才发现那时候发布的不是真正WPS框架下的服务,而只是通过Servlet将其发布为可调用的网络服务,所以今天再具体介绍一下真正的 ...
随机推荐
- tomcat启动异常、和web.xml缺少配置异常
错误如下: 14-Feb-2017 10:50:00.665 SEVERE [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.Sta ...
- 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)
最近在使用之前自己编写的批处理给.NET Core项目打包时出问题了,发现之前的脚本根本不适用了,折腾了半天,总算解决了.因此在这里分享下经验,并且奉上整理好的脚本. Nuget包这里就不多介绍了,需 ...
- esri-leaflet部分瓦片缺失问题及解决办法
esri-leaflet加载TileLayer的时候,有时候由于数据的原因,造成部分瓦片缺失的问题,网页加载TileLayer的时候,当地图范围正好拖动到缺失的范围的时候,会一直请求 http://d ...
- Xcode插件包Alcatraz
安装命令 curl -fsSL https://raw.github.com/alcatraz/Alcatraz/master/Scripts/install.sh | sh 终于可以了 这个其实 ...
- 表单界面的兼容PC手机端解决方案
就当写一篇随笔吧~上星期还在做加盟模块(兼容微信端),这星期已经加班做快递扫码模块(react+node),所以我感觉只有弹药备足了才能稍微轻松些应对各种需求.实话说在同个部门的大佬面前差距确实大,如 ...
- wikioi 3132 高精度乘法(FFT)
第一次学FFT,先膜拜一下法法塔大神ORZ 关于FFT的话,有一篇博文特别赞http://z55250825.blog.163.com/blog/static/15023080920143127465 ...
- HTTP基础知识(一)
一.了解web及网络基础 1.通过发送请求获取服务器资源的web浏览器等的都可称为客户端(client) 2.HTTP:HyperText Transfer Protocol,超文本传输协议:所有的W ...
- Python求解数组重新组合求最小值(优酷)
题目描述:题目:含有n个元素的整型数组,将这个n个元素重新组合,求出最小的数,如(321,3,32,) 最小数为321323 题目分析: 将数组中所有元素填充到个数相等,填充的数字为最后一位的数字,如 ...
- 超出区域文字显示为省略号或者剪切效果——CSS的生僻操作
每门语言总有那么一些不太常用,却又不可或缺的语法操作.下面说一下,在HTML文件中,如何设置用 "省略号" 和 "剪切" 代替大量文字的效果. 以下是HTML的 ...
- JavaScript的for循环中嵌套一个点击事件为何点击一次弹出多个相同的值
先看下面一段代码: for(var i=0; i<10; i++) { $('#ul').bind('click', function() { alert(i) }) } 对于这段代码,当点击I ...