Является ли ReadAsArray в gdal-python таким же, как GDALRasterIO в C-GDAL? - PullRequest
0 голосов
/ 01 ноября 2019

Привет. Я пытаюсь перебрать значения набора растровых данных (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],

А затем я читаю растровые данные и назначаю их предыдущему массиву band1 в следующей строке (26):

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?

Заранее спасибо

1 Ответ

1 голос
/ 07 ноября 2019

Что возвращает GDALRasterIO?

Согласно документации он возвращает 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 неправильный, он не должен быть матрицей.

...