基于GDAL库读取tiff文件的C++代码

4 篇文章 2 订阅

 这是基于GDAL库读取tiff文件的C++代码,算是比较基础的数据读取,更深层次的运用需要自己去熟悉和理解他的类以及提供的相关接口(代码中也提供了一段输出tfw文件的方式)

#include <iostream>
#include <gdal.h>
#include <gdal_priv.h>
#include <streambuf>
#include <fstream>

using namespace std;


#define BYTE short     //方便数据类型的修改 


/* ************************************** TIFF--read ******************************** */
int tiffread(const char* file_path_name)
{
	CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");	// 支持中文路径

	GDALAllRegister();  //注册所有的驱动 


	BYTE *pafScanblock1;  //开辟缓存区 

	GDALDataset *poDataset;   //GDAL数据集 

	poDataset = (GDALDataset *)GDALOpen(file_path_name, GA_ReadOnly);
	if (poDataset == NULL)
	{
		cout << "fail in open files!!!" << endl;
		return 0;
	}

	//获取图像的尺寸 
	int nImgSizeX = poDataset->GetRasterXSize();
	int nImgSizeY = poDataset->GetRasterYSize();
	cout << nImgSizeX << "  *  " << nImgSizeY << endl;


	//获取坐标变换系数 
	double trans[6];
	CPLErr aaa = poDataset->GetGeoTransform(trans);
	cout << "坐标变换系数:";
	for (auto tran : trans)
		cout << tran << " ";
	cout << endl;


	//获取图像波段 
	GDALRasterBand *poBand, *poBand1, *poBand2;
	int bandcount;
	bandcount = poDataset->GetRasterCount();	// 获取波段数
	cout << "波段数:" << bandcount << endl;
	
	for (int bandind = 1; bandind <= bandcount; bandind++)
	{
		poBand = poDataset->GetRasterBand(bandind);		// 获取对应波段
		
		//读取图像高程数据 
		int num_iamge_size = 0;		//数据计数
		BYTE *pafScanline = new BYTE[nImgSizeX*nImgSizeY];
		poBand->RasterIO(GF_Read, 0, 0, nImgSizeX, nImgSizeY, pafScanline, nImgSizeX, nImgSizeY, GDALDataType(poBand->GetRasterDataType()), 0, 0);
		for (int i = 0; i < nImgSizeX; i++)
		{
			for (int j = 0; j < nImgSizeY; j++)
			{
				num_iamge_size++;
				//if (i<10 && j < 10)
				cout << pafScanline[i*nImgSizeY+j] << endl;
			}
			//cout << i << "---" << pafScanline[i*nImgSizeY] << endl;
		}
		cout << "total:" << num_iamge_size << endl;

		delete[] pafScanline;
	}

	//输出tfw文件
	cout << "准备输出tfw文件:" << endl;
	double gt[6];
	GDALGetGeoTransform(poDataset, gt);
	for (auto value : gt)
		cout << "gt:" << (int)value << " ";
	cout << endl;
	fstream tfw;
	string tmpname = file_path_name;
	tmpname = tmpname.substr(0, tmpname.find_last_of('.') + 1) + "tfw";
	tfw.open(tmpname, ios::out);
	tfw << fixed;
	tfw << setprecision(5);
	tfw << gt[1] << endl;
	tfw << gt[2] << endl;
	tfw << gt[4] << endl;
	tfw << gt[5] << endl;
	tfw << gt[0] << endl;
	tfw << gt[3] << endl;
	tfw.close();


	// 清空资源
	delete poDataset;

	return 0;
}


int main()
{
    tiffread("D:/yourfilename.tiff");
    system("pause");

    return 0;
}

  • 3
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要在three.js中显示tiff文件,您需要使用gdal将其加载为图像数据,然后将其转换为three.js支持的格式。以下是一些步骤: 1. 安装gdal 使用以下命令安装gdal: ``` pip install gdal ``` 2. 使用gdal加载tiff文件 使用以下代码加载tiff文件: ```python from osgeo import gdal # 打开tiff文件 ds = gdal.Open('path/to/tiff/file') # 读取tiff文件中的图像数据 data = ds.ReadAsArray() # 获取图像数据的相关信息 width = ds.RasterXSize height = ds.RasterYSize channels = ds.RasterCount # 关闭tiff文件 ds = None ``` 3. 转换图像数据为three.js支持的格式 使用以下代码将图像数据转换为three.js支持的格式: ```javascript // 将图像数据转换为three.js支持的格式 var texture = new THREE.DataTexture(data, width, height, channels, THREE.RGBAFormat); // 设置纹理属性 texture.magFilter = THREE.LinearFilter; texture.minFilter = THREE.LinearFilter; texture.wrapS = THREE.ClampToEdgeWrapping; texture.wrapT = THREE.ClampToEdgeWrapping; // 创建材质 var material = new THREE.MeshBasicMaterial({ map: texture }); // 创建网格 var geometry = new THREE.PlaneGeometry(width, height); var mesh = new THREE.Mesh(geometry, material); // 添加网格到场景中 scene.add(mesh); ``` 这些代码将创建一个平面网格,其中纹理使用从tiff文件加载的图像数据。您可以根据需要调整平面网格的大小和位置。 请注意,由于gdal是用C++编写的,因此在使用Python时可能会遇到一些性能问题。如果您需要更高的性能,请考虑使用其他,例如OpenCV。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值