gpt4 book ai didi

python - gdal-python 中的 ReadAsArray 与 C-GDAL 中的 GDALRasterIO 相同吗?

转载 作者:行者123 更新时间:2023-11-30 14:35:08 26 4
gpt4 key购买 nike

您好,我正在尝试迭代栅格数据集 (band1) 的值。我可以使用以下代码片段在 python 中完成此操作(抱歉,我无法提供原始栅格)

import numpy as np
import gdal

path = "data/Isle_wight.tif"

ds = gdal.Open(path)
myarray = np.array(ds.GetRasterBand(1).ReadAsArray())
print(myarray.shape[0])
#print(columns)
for j in range(myarray.shape[0]-1):
for i in range(myarray.shape[1]-1):
print( myarray[j][i])

我的目标是在 C-GDAL 中模拟相同的情况,

这是我的代码片段(它不起作用)

#include "gdal/gdal.h"
#include "gdal/cpl_conv.h"
int main()
{

GDALDatasetH raster;
GDALAllRegister();
raster = GDALOpen( "/home/roger/Documents/98_GDAL_C++_snippets/data/Isle_wight.tif", GA_ReadOnly);
if(raster==NULL)
{
printf("Invalid Raster Dataset");
}
else
{
GDALRasterBandH raster_band;
int XSize, YSize;

raster_band = GDALGetRasterBand( raster, 1);
GDALGetBlockSize( raster_band, &XSize, &YSize);
float *pafScanline;
int nXSize = GDALGetRasterBandXSize (raster_band);
int nYSize = GDALGetRasterBandYSize (raster_band);
pafScanline = (float*) CPLMalloc(sizeof(float)*nXSize);
int address_of_pafScanline = *pafScanline;
int band1[nXSize][nYSize];
int band1 = GDALRasterIO(raster_band, 0, 0,GF_Read, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0);
for(int i = 0; i <= nXSize; i++) {
for(int j = 0; j < nYSize; j++ ) {
printf("%d", band1[i][j]);
}
}
}

}

问题:GDALRasterIO返回什么?,我在第25行写的时候做了数组声明:

int band1[nXSize][nYSize],

然后我读取栅格数据并将其分配给以下行 (26) 中的前一个 band1 数组:

int band1 = GDALRasterIO(raster_band, 0, 0,GF_Read, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0);

编译时通过

cc open_array.c -o open_array -lgdal

我收到以下错误:

open_array.c: In function ‘main’:
open_array.c:26:9: error: conflicting types for ‘band1’
int band1 = GDALRasterIO(raster_band, 0, 0,GF_Read, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0);
^~~~~
open_array.c:25:9: note: previous declaration of ‘band1’ was here
int band1[nXSize][nYSize];
^~~~~
open_array.c:29:31: error: subscripted value is neither array nor pointer nor vector
printf("%d", band1[i][j]);

为什么会发生这种情况?我应该去掉第 25 行的声明吗?

提前致谢

最佳答案

What does GDALRasterIO returns?

根据 documentation它返回 CPLErr这是一个 int 值。您可以使用此值来检查读取是否成功:

CPLErr readResult = GDALRasterIO(raster_band, 0, 0,GF_Read, nXSize, 1, pafScanline, nXSize, 1, GDT_Float32, 0, 0);
if (readResult != CE_None) {
// error reading the file
}
// else continue processing

代码中出现的错误与您尝试两次重新声明同一变量 (band1) 有关。这就是编译者所提示的。您首先需要 int band1[nXSize][nYSize] -> 声明一次变量,然后在 int band1 = GDALRasterIO(...) 后声明该变量。因为您正在使用类型 (int) 再次重新声明变量。如果您不想重新声明它,则只需在第二行进行赋值:band1 = GDALRasterIO(...。无论如何,band1的类型不正确,它不应该是矩阵。

关于python - gdal-python 中的 ReadAsArray 与 C-GDAL 中的 GDALRasterIO 相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58659853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com