c++GDAL用一个面裁剪tif影像
时间: 2023-07-04 20:27:41 浏览: 112
以下是使用C++和GDAL库用一个面裁剪TIFF影像的示例代码:
```c++
#include <gdal_priv.h>
#include <ogr_geometry.h>
int main()
{
// 打开面文件
OGRRegisterAll();
OGRDataSource* shp_ds = OGRSFDriverRegistrar::Open("your_shapefile.shp", FALSE);
// 获取面图层
OGRLayer* shp_layer = shp_ds->GetLayer(0);
// 获取面几何体
OGRFeature* shp_feature = shp_layer->GetNextFeature();
OGRGeometry* shp_geometry = shp_feature->GetGeometryRef();
// 打开影像文件
GDALAllRegister();
GDALDataset* tif_ds = (GDALDataset*)GDALOpen("your_tif_file.tif", GA_ReadOnly);
// 获取影像投影信息和地理变换参数
double tif_trans[6];
tif_ds->GetGeoTransform(tif_trans);
const char* tif_proj = tif_ds->GetProjectionRef();
// 创建输出影像
GDALDriver* driver = GetGDALDriverManager()->GetDriverByName("GTiff");
GDALDataset* out_ds = driver->Create("your_output.tif", shp_geometry->getEnvelope()->nCols, shp_geometry->getEnvelope()->nRows, 1, GDT_Float32, NULL);
// 设置输出影像的地理变换参数和投影信息
out_ds->SetGeoTransform(tif_trans);
out_ds->SetProjection(tif_proj);
// 读取输入影像数据
float* tif_data = new float[tif_ds->GetRasterXSize() * tif_ds->GetRasterYSize()];
tif_ds->GetRasterBand(1)->RasterIO(GF_Read, 0, 0, tif_ds->GetRasterXSize(), tif_ds->GetRasterYSize(), tif_data, tif_ds->GetRasterXSize(), tif_ds->GetRasterYSize(), GDT_Float32, 0, 0);
// 创建输出影像数据
float* out_data = new float[shp_geometry->getEnvelope()->nCols * shp_geometry->getEnvelope()->nRows];
// 将输入影像数据裁剪到面范围内
for (int i = 0; i < shp_geometry->getEnvelope()->nCols; i++)
{
for (int j = 0; j < shp_geometry->getEnvelope()->nRows; j++)
{
double x = tif_trans[0] + (i + 0.5) * tif_trans[1] + (j + 0.5) * tif_trans[2];
double y = tif_trans[3] + (i + 0.5) * tif_trans[4] + (j + 0.5) * tif_trans[5];
if (shp_geometry->Contains(new OGRPoint(x, y)))
{
out_data[i + j * shp_geometry->getEnvelope()->nCols] = tif_data[i + j * tif_ds->GetRasterXSize()];
}
}
}
// 写入输出影像数据
out_ds->GetRasterBand(1)->RasterIO(GF_Write, 0, 0, shp_geometry->getEnvelope()->nCols, shp_geometry->getEnvelope()->nRows, out_data, shp_geometry->getEnvelope()->nCols, shp_geometry->getEnvelope()->nRows, GDT_Float32, 0, 0);
// 释放资源
delete[] tif_data;
delete[] out_data;
GDALClose(tif_ds);
GDALClose(out_ds);
OGRFeature::DestroyFeature(shp_feature);
OGRDataSource::DestroyDataSource(shp_ds);
return 0;
}
```
这段代码中,我们首先使用`OGRDataSource`、`OGRLayer`和`OGRFeature`类打开面文件,并获取面图层和面几何体。然后,我们使用GDAL库中的`GDALDataset`、`GDALDriver`和`GDALRasterBand`类打开TIFF文件,并获取投影信息和地理变换参数。接下来,我们创建输出影像,并设置输出影像的地理变换参数和投影信息。然后,我们使用`RasterIO()`函数读取输入影像数据,并根据面范围将输入影像数据裁剪到面内部。最后,我们使用`RasterIO()`函数将输出影像数据写入输出影像中,并使用`DestroyDataSource()`函数和`DestroyFeature()`函数释放资源。
阅读全文