AE + GDAL实现影像按标准图幅分割(上)
最近有个项目,其中有个功能是要将遥感影像按标准图幅分割,一开始用AE的接口,慢的让人抓狂,就改用GDAL,速度提升很大。我主要通过http://blog.csdn.net/liminlu0314/学习GDAL。本篇主要记录GDAL实现分割的代码,下篇用AE写个demo。
int CutImageByGDAL(const char* pszInFile,const char* pszOutFile,double XMin,double XMax,double YMin,double YMax,const char* pszFormat="GTiff")
{
int iSrcXOffset=,iSrcYOffset=;
int iDstXOffset=,iDstYOffset=;
int ivXSize=,ivYSize=;
int xSize=,ySize=; //结果影像的大小
double fSrcXMin=XMin,fSrcYMax=YMax; GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");
GDALDataset * pSrcDS = (GDALDataset*) GDALOpen(pszInFile, GA_ReadOnly);
if (pSrcDS == NULL)
{
return -;
//return "未能打开影像文件";
}
try
{
int iBandCount = pSrcDS->GetRasterCount();
const char* pszWkt = pSrcDS->GetProjectionRef(); //影像的坐标系
GDALDataType dT = pSrcDS->GetRasterBand()->GetRasterDataType(); //影像的数据类型 double adfGeoTransform[] = {};
double newGeoTransform[] = {};
//获取影像的坐标转换参数
pSrcDS->GetGeoTransform(adfGeoTransform);
//结果影像的坐标转换参数
memcpy(newGeoTransform, adfGeoTransform, sizeof(double)*);
newGeoTransform[]=XMin;
newGeoTransform[]=YMax; //地理坐标转换为影像上的像素坐标
Projection2ImageRowCol(adfGeoTransform,XMin,YMax,iSrcXOffset,iSrcYOffset);
Projection2ImageRowCol(adfGeoTransform,XMax,YMin,xSize,ySize);
xSize=xSize-iSrcXOffset;
ySize=ySize-iSrcYOffset;
ivXSize=xSize;
ivYSize=ySize; GDALDataset* pDstDS;
GDALDriver *pDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
if (pDriver == NULL)
{
GDALClose((GDALDatasetH) pSrcDS);
return -;
//return "未能创建影像文件驱动";
}
//GDALDataset*
pDstDS = pDriver->Create(pszOutFile, xSize, ySize, iBandCount, dT, NULL);
if (pDstDS == NULL)
{
GDALClose((GDALDatasetH) pSrcDS);
return -;
//return "未能创建影像文件";
}
pDstDS->SetGeoTransform(newGeoTransform);
//设置影像坐标系
pDstDS->SetProjection(pszWkt); //边界处理
//判断切割范围,使其不超过原始影像范围
//如果切割范围超过原始影像,会导致结果影像像素值全是NoData
if(XMin<adfGeoTransform[])
fSrcXMin=adfGeoTransform[];
if(YMax>adfGeoTransform[])
fSrcYMax=adfGeoTransform[]; Projection2ImageRowCol(adfGeoTransform,fSrcXMin,fSrcYMax,iSrcXOffset,iSrcYOffset);
Projection2ImageRowCol(newGeoTransform,fSrcXMin,fSrcYMax,iDstXOffset,iDstYOffset); if(iSrcXOffset+xSize>pSrcDS->GetRasterXSize())
ivXSize=pSrcDS->GetRasterXSize()-iSrcXOffset;
if(iDstXOffset+ivXSize>pDstDS->GetRasterXSize())
ivXSize=pDstDS->GetRasterXSize()-iDstXOffset; if(iSrcYOffset+ySize>pSrcDS->GetRasterYSize())
ivYSize=pSrcDS->GetRasterYSize()-iSrcYOffset;
if(iDstYOffset+ivYSize>pDstDS->GetRasterYSize())
ivYSize=pDstDS->GetRasterYSize()-iDstYOffset; void * pMemData;
switch(dT)
{
case GDT_Byte:
pMemData=new char[xSize*ySize*iBandCount];
break;
case GDT_UInt16:
case GDT_Int16:
case GDT_CInt16:
pMemData=new int[xSize*ySize*iBandCount];
break;
case GDT_UInt32:
case GDT_Int32:
case GDT_Float32:
case GDT_CInt32:
case GDT_CFloat32:
pMemData=new float[xSize*ySize*iBandCount];
break;
case GDT_Unknown:
case GDT_Float64:
case GDT_CFloat64:
pMemData=new double[xSize*ySize*iBandCount];
break;
}
pSrcDS->RasterIO(GF_Read,iSrcXOffset,iSrcYOffset,ivXSize,ivYSize,pMemData,ivXSize,ivYSize,dT,iBandCount,,,,);
pDstDS->RasterIO(GF_Write,iDstXOffset,iDstYOffset,ivXSize,ivYSize,pMemData,ivXSize,ivYSize,dT,iBandCount,,,,); GDALClose((GDALDatasetH) pSrcDS);
GDALClose((GDALDatasetH) pDstDS);
free(pMemData); return ;
//return "完成";
}
catch(const char* excep)
{
if(pSrcDS!=NULL)
GDALClose((GDALDatasetH) pSrcDS);
return ;
}
}
Projection2ImageRowCol是把地理坐标转换为影像像素坐标的函数,实现如下
bool Projection2ImageRowCol(double *adfGeoTransform, double dProjX, double dProjY, int &iCol, int &iRow)
{
try
{
double dTemp = adfGeoTransform[]*adfGeoTransform[] - adfGeoTransform[]*adfGeoTransform[];
double dCol = 0.0, dRow = 0.0;
dCol = (adfGeoTransform[]*(dProjX - adfGeoTransform[]) -
adfGeoTransform[]*(dProjY - adfGeoTransform[])) / dTemp +0.5;
dRow = (adfGeoTransform[]*(dProjY - adfGeoTransform[]) -
adfGeoTransform[]*(dProjX - adfGeoTransform[])) / dTemp +0.5; iCol = static_cast<int>(dCol);
iRow = static_cast<int>(dRow);
return true;
}
catch(...)
{
return false;
}
}
AE + GDAL实现影像按标准图幅分割(上)的更多相关文章
- AE + GDAL实现影像按标准图幅分割(下)
在上篇实现了遥感影像的切割,本篇讲切割前的准备.主要分为以下几步: (1)将影像的投影坐标转换为地理坐标,以便于之后的图幅划分.AE坐标转换函数如下 private bool Proj2Geo(ISp ...
- GodSon Easyui 结合Pluplaod插件的文件分割上传
自己整理了一个文件分割上传的实例,提供研究学习使用. 在线查看效果 下载该资源pluplaod文件分割上传Demo.zip 简介: 首先,进入页面会看到下面的效果: 点击一个按钮,出现如图 ...
- android下大文件分割上传
由于android自身的原因,对大文件(如影视频文件)的操作很容易造成OOM,即:Dalvik堆内存溢出,利用文件分割将大文件分割为小文件可以解决问题. 文件分割后分多次请求服务. //文件分割上传 ...
- PHP + JS 实现大文件分割上传
服务器上传文件会有一定的限制.避免内存消耗过大影响性能,在 php.ini 配置文件中,有几个影响参数: upload_max_filesize = 2M //PHP最大能接受的文件大小 post_m ...
- Html5 突破微信限制实现大文件分割上传
先来前端代码 <!DOCTYPE html> <html> <head> <meta name="viewport" content=&q ...
- formdata方式上传文件,支持大文件分割上传
1.upload.html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/html"> <h ...
- 自动网络搜索(NAS)在语义分割上的应用(二)
前言: 本文将介绍如何基于ProxylessNAS搜索semantic segmentation模型,最终搜索得到的模型结构可在CPU上达到36 fps的测试结果,展示自动网络搜索(NAS)在语义分割 ...
- 自动网络搜索(NAS)在语义分割上的应用(一)
[摘要]本文简单介绍了NAS的发展现况和在语义分割中的应用,并且详细解读了两篇流行的work:DARTS和Auto-DeepLab. 自动网络搜索 多数神经网络结构都是基于一些成熟的backbone, ...
- 检验实时3D像素流送平台好坏的七个标准!(上)
将交互式3D像素流送技术作为有价值的企业工具之后,就该寻找像素流送服务供应商了.问题在于交互式3D像素流送是一种新兴技术,因此很难知道要问供应商的正确问题.在开始使用之前,这里有7个问题,您应该从候选 ...
随机推荐
- (C#)xml的简单理解创建和读取
xml知识点清理:一.文档规则 1.区分大小写. 2.属性值必须加引号(单引号.双引号都可以),一般情况下建议使用使用双引号. 3.所有标记必须有结束符号. 4.所有空标记必须关闭. 5.必须有且仅有 ...
- phpcmsV9静态页面替换动态步骤
1.先在www目录下找到 phpcms + install_package + phpcms + templates在templates 文件夹里创建个自己的文件夹我弄得是 ceshi 文件夹,在 c ...
- [学习心得][Introduction to ASP.NET Core 1.0]3-2 ASP.NET Core and MVC Pattern
We need SMART Models, THIN Controllers, and DUMB Views. VeryBeginning 要使用MVC,要先将MVC服务加到程序中去 Nuget包里添 ...
- ldd获得可执行程序的所有库并输出到指定目录
#!/bin/bash ########################################################################## #ldd可以查看程序的库依 ...
- 整理 - .Net系统预定义的委托们
大部分情况下,我们可以使用系统预定义的委托类型,而不需要自己再来手动定义. 以下委托都位于System命名空间下. 传入参数.返回值的类型,大都被声明为泛型. 1.Action系列 有0-16个参数, ...
- bash之重定向
标准输入 stdin:代码为0,使用< 或 <& ...
- C#中函数的功能和类型
函数 就是方法是独立完成某项功能的一个个体 函数的的三个好处:1.提高代码的重用性.2.提高功能开发的效率,3.提高代码的可维护性(主要功能). 函数也分为 固定功能函数(这类函数具有可封闭 ...
- 依赖ConstraintLayout报错,Could not find *****,Failed to resolve:*****
ConstraintLayout 约束布局,AndroidStudio2.2中新增功能之一,可以先去看看这篇文章 Android新特性介绍,ConstraintLayout完全解析,2.3版本的And ...
- hadoop2.7.2完全分布式环境搭建
1.先使用groupadd hadoop 建立hadoop用户组 2.新建用户,useradd -d /usr/hadoop -g hadoop -m hadoop (新建用户hadoop指定用户 ...
- hdoj 1257 DP||贪心
最少拦截系统 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...