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个问题,您应该从候选 ...
随机推荐
- mybatis入门-框架原理
mybatis是什么 在说mybatis原理之前,我们有必要知道,mybatis到底是个什么东西.mybatis是一个持久层的框架.是一个不完全的ORM框架.因为它需要由程序员自己去写sql语句.但是 ...
- 基于微博数据用 Python 打造一颗“心”
一年一度的虐狗节刚过去不久,朋友圈各种晒,晒自拍,晒娃,晒美食,秀恩爱的.程序员在晒什么,程序员在加班.但是礼物还是少不了的,送什么好?作为程序员,我准备了一份特别的礼物,用以往发的微博数据打造一颗“ ...
- 缓冲流自动把getchar()填充
#include"stdio.h" #include"conio.h" #include<stdlib.h> int main() { char c ...
- Two analytical 2d line intersection in OpenCASCADE
Two analytical 2d line intersection in OpenCASCADE eryar@163.com Abstract. OpenCASCADE geometric too ...
- 虚拟机Centos开机以后,有eth0网卡,但是没有IP,Determine IP information for eth0.. no link present check cable
Determine IP information for eth0.. no link present check cable 如果你的VMware虚拟机centos6.5使用NAT模式,开机以后,使 ...
- Unity3d中如何混用三种脚本语言?
首先要明白,这三种说的混用是指文件级别的混用,就是说一个文件是由一种语言写的.而不是说你这一个文件可以混用这三种语言,注意这是不允许的. 第二要明白,在unity3d中为什么可以使用三种语言混合开发? ...
- Winfrom 程序打包及安装
前言 近期被公司外派到驻空调厂的项目组,支援一个TCP相关的程序对接.主要是做智能门禁系统,然后主要是统计出实时的进出人数. 我这边能作为服务端,门禁设备作为客户端,整个流程并不算复杂,根据协议来写, ...
- 【Eclipse】web项目部署新手篇
本文属于新手篇章,记录了Eclipse中部署web项目的步骤 1 . 添加Tomcat服务器 右键项目属性-->Run as-->Run on server弹出以下界面 点击finish之 ...
- H5缓存-Manifest
在app中更新h5页面一直有缓存问题.默认什么都不做的情况下,app有一定的空间缓存页面.一开始更新之后会马上加载,等到app缓存空间上来之后更新就无法下载了.安卓能够清理缓存空间,ios就只能卸载重 ...
- 快速排序算法javascript实现
function quicksort(arr){ function q(start,end){ if(start>=end){return;} var pivot = start, temp = ...