GDAL读取影像并插值
影像读取 并缩放
读取大影像某一部分,并缩放到指定大小,我们有时会用如下代码:
#include "gdal.h"
#include "gdal_priv.h"
#include "gdalwarper.h" void main()
{
GDALAllRegister();
CPLSetConfigOption("GDAL_FILENAME_IS_UTF8","NO");//support Chinese GDALDataset* readDataSet = (GDALDataset*)GDALOpen(inputFile.c_str(),GA_ReadOnly);
if (readDataSet == NULL )
{
return;
}
int width = readDataSet->GetRasterXSize();
int height = readDataSet->GetRasterYSize();
int bandCount = readDataSet->GetRasterCount(); int tilesize = ;
unsigned char* data = new unsigned char[tilesize*tilesize*bandCount];
if (readDataSet->RasterIO(GDALRWFlag::GF_Read,,,width,height,data,tilesize,tilesize,GDT_Byte,bandCount,NULL,,,)==CPLErr::CE_Failure)
{
delete readDataSet;readDataSet=NULL;
delete data;
return;
}
}
如果这里影像大小,非常大时,几G到几十G,上百G的时候,会可能遇到什么问题?
让我们从RasterIO接口谈起,跟其中代码,得知
1、从影像金字塔取数据。根据缩小到的TileSize,它会从影像金字塔中取相应层级的数据。
2、取到数据后,会进行最近邻插值。
由于最近邻插值效果不佳,会导致得到的数据,都是相应的噪声,麻点现象。
GDAL从2.0版本支持RasterIO接口进行插值算法的配置,仅仅进行简单的配置,就可以解决这个问题。
GDALRasterIOExtraArg exterArg;
INIT_RASTERIO_EXTRA_ARG(exterArg);
exterArg.eResampleAlg = GDALRIOResampleAlg::GRIORA_Bilinear;//配置插值方法
readDataSet->RasterIO(GDALRWFlag::GF_Read,,,width,height,data,tilesize,tilesize,GDT_Byte,bandCount,NULL,,,,&exterArg);
可以选择的插值方法:
/*! Nearest neighbour */ GRIORA_NearestNeighbour = 0,
/*! Bilinear (2x2 kernel) */ GRIORA_Bilinear = 1,
/*! Cubic Convolution Approximation (4x4 kernel) */ GRIORA_Cubic = 2,
/*! Cubic B-Spline Approximation (4x4 kernel) */ GRIORA_CubicSpline = 3,
/*! Lanczos windowed sinc interpolation (6x6 kernel)*/ GRIORA_Lanczos = 4,
/*! Average */ GRIORA_Average = 5,
/*! Mode (the value which appears most often) */ GRIORA_Mode = 6,
/*! Gauss blurring */ GRIORA_Gauss = 7
影像写出,如下操作:
GDALDriver *pDriver;
pDriver = GetGDALDriverManager()->GetDriverByName("GTiff"); GDALDataset* gdalDataset;
gdalDataset = pDriver->Create(outputFile.c_str(),tilesize,tilesize,bandCount,GDT_Byte,NULL);
gdalDataset->RasterIO(GF_Write,,,tilesize,tilesize,data,tilesize,tilesize,GDT_Byte,bandCount,NULL,,,);
GDALClose(gdalDataset);
gdalDataset = NULL;
参考:https://trac.osgeo.org/gdal/wiki/rfc51_rasterio_resampling_progress
GDAL读取影像并插值的更多相关文章
- C#+GDAL读取影像(1)
环境:VS2010,C#,GDAL1.7 读取影像: using System; using System.Collections.Generic; using System.ComponentMod ...
- 基于GDAL的栅格图像空间插值预处理
转自 基于GDAL的栅格图像空间插值预处理——C语言版 基于GDAL的栅格图像预处理 前言 栅格数据和矢量数据构成空间数据的主要来源,怎样以开源方式读取并处理这些空间数据?目前有多种开源支持包,这里只 ...
- GDAL读取的坐标起点在像素左上角还是像素中心?
目录 1. 问题 2. 结论 3. 例外 1. 问题 笔者在处理地理栅格数据的时候,总是会发生偏差半个像素的问题. 比如说通过ArcMap打开一张.tif,查看其地理信息:同时用记事本打开.tfw,比 ...
- 使用C#版本GDAL读取复数图像
GDAL的C#版本虽然在很多算法接口没有导出,但是在读写数据中的接口基本上都是完全导出了.使用ReadRaster和WriteRaster方法来进行读写,同时对这两个方法进行了重载,对于常用的数据类型 ...
- GDAL读取Shp问题解决:Unable to open EPSG support file gcs.csv
在GIS软件的开发中,经常用到开源库GDAL读取Shp数据,当shp数据中包含投影信息时,可能会遇到“Unable to open EPSG support file gcs.csv”错误提示,该错误 ...
- C#使用GDAL读取与创建影像
C#下GDAL的使用这里就不多赘述了.參见上一篇博客. 代码中都加了凝视,这里就不再一一叙述了.代码例如以下: class FloodSimulation { #region 类成员变量 public ...
- [GDAL]读取HDF格式的calipso数据
探测地球云层分布的CloudSat和CALIPSO卫星 http://www.nasa.gov/mission_pages/calipso/main/index.html http://www.nas ...
- GDAL读取tiff文件/C++源码
// gdal_geotiff.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include "gdal_priv.h&quo ...
- AE + GDAL实现影像按标准图幅分割(上)
最近有个项目,其中有个功能是要将遥感影像按标准图幅分割,一开始用AE的接口,慢的让人抓狂,就改用GDAL,速度提升很大.我主要通过http://blog.csdn.net/liminlu0314/学习 ...
随机推荐
- Java 访问权限控制:你真的了解 protected 关键字吗?
摘要: 对于类的成员而言,其能否被其他类所访问,取决于该成员的修饰词:而对于一个类而言,其能否被其他类所访问,也取决于该类的修饰词.在Java中,类成员访问权限修饰词有四类:private,无(包访问 ...
- postman小结
1.get和post请求,get有限制2k,post没有限制post安全 在选择的时候别把get post选错然后,run 2.data 选成txt文件 utf-8 ip ip,result12.1 ...
- UNIX基础概念
UNIX基本概念 进程 从用户观点来看:进程是程序的一个执行实例. 从UNIX系统内部来看,是为运行程序提供执行环境的实体,是系统进行资源分配和调度运行的一个单位. 进程有三个特点: 1)进程有一个控 ...
- 索引(Awakening!)
orz写个索引,方便日后复习和补充. 目前笔记还不是很多,而且写得比较烂,望各位到访的巨佬谅解. 大概可以算作一个归纳总结? ……没链接的还没开始写或者没写完,而且不知道什么时候才能写完(咕咕咕) 一 ...
- [转] HBase异常:hbase-default.xml file seems to be for an old version of HBase
[From] https://blog.yoodb.com/yoodb/article/detail/157 使用HBase Java Client连接HBase服务端创建Configuration对 ...
- Scrapyd-Client的安装
1. pip安装 这里推荐使用pip安装,相关命令如下: pip3 install scrapyd-client 2.验证安装 安装成功后会有一个可用命令,叫作scrapyd-deploy,即部署命令 ...
- (转载)Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码
1 import java.util.Collections; 2 import java.util.LinkedList; 3 import java.util.List; 4 5 public c ...
- 由UI刷新谈到线程安全和Android单线程模型
1.为什么说invalidate()不能直接在线程中调用? Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在非UI主线程中调用,因为他是违背了单线程模型:A ...
- JavaScript数据结构-15.二叉树
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- WPF 使用附加属性增加控件属性
使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 using System; using ...