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将其发布为可调用的网络服务,所以今天再具体介绍一下真正的 ...
随机推荐
- php解析
vim /usr/local/apache/conf/httpd.conf ##修改apache的网页配置文件 → 解析php文件 /usr/local/apache/bin/apache ...
- Java安装
java特点:跨平台.简单.面向对像编译后解释再运行安装JDK 环境变量的配置:JAVA_HOME:JDK的根目录====C:\Program Files\Java\jdk1.7.0_25Path:J ...
- php上线教程----阿里云下设值二级域名并将项目上线
在工作中,我们需要在一个主机地址下分配多个域名来上线多个项目,但是怎么设置一个二级域名并且完成上线项目的,接下来我们就以阿里云为例演示整个上线流程 首先登陆你的阿里云,找到你的域名 点击解析,进入解析 ...
- CentOS 6.5安装jdk1.8
1.源码包准备: 首先到官网下载jdk-8u66-linux-x64.tar.gz, http://www.oracle.com/technetwork/java/javase/downloads/j ...
- IOS缓存管理之YYCache使用
前言: 最近一直在致力于为公司app添加缓存功能,为了寻找一个最佳方案,这几天先做个技术预研,经过这两天的查找资料基本上确定了两个开源框架进行选择,这两个开源框架分别是:PINCache.YYCach ...
- MongoDB【第一篇】安装
第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. MongoDB 版本 mongodb-linux-x86_64-rhel70-3.4.2 3. 设置 ...
- 利用jink调试程序,时间不准的解决办法
前几天,做工程,遇到了利用jlink的SWD的模式调试程序,定时器延时不准的问题,上网搜了好多,终于找到了问题所在,感谢万能的网友.时间不对是因为Keil的设置问题. 以下是转自网友: 一.先说说仿真 ...
- Keepalived + HAProxy 搭建【第一篇】HAProxy 的安装与配置
第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. 安装包 haproxy-1.7.2.tar.gz 第二步:安装 # tar zxvf haproxy ...
- Docker私有仓库--自签名方式
为了能集中管理我们创建好的镜像,方便部署服务,我们会创建私有的Docker仓库.通读了一遍官方文档,Docker为了确保安全使用TLS,需要CA认证,认证时间长的要钱啊,免费过期时间太短,还是用自签名 ...
- 局域网里连接mysql服务器,其他人连接自己的mysql服务器
应用场景: 自己在自己的机器上开发网站,同事也要和我一起开发,就两个人,我自己的机器当做服务器,让他直接连我的数据库,看我的项目就行了,并且用svn进行开发,相当不错 问题: 怎样在局域网里,其他人 ...