Прочитать всю точку и вставить в массив - PullRequest
0 голосов
/ 21 июня 2020

Я наткнулся на этот код gdal, чтобы прочитать точку возвышения для указанного c местоположения. Этот код позволяет мне прочитать только одну точку. Информация о файле высот:

Верхний левый X = 103.0000 Верхний левый Y = 4.0000

Нижний правый X = 104.0000 Нижний правый Y = 3.0000

Нет. of columns = 3601, Number of rows = 3601

Как можно прочитать все точки высот и сохранить их в векторном массиве?

   int _tmain(int argc, _TCHAR* argv[])
{
    const char* pszFilename = "C:\\Elevation.DT2";
    double adfGeoTransform[6];
    float buffEleveation[1];

    int row;
    int col;

    std::vector<float> elevationVecArr;

    GDALRasterBand *poBand;

    GDALDataset  *poDataset;
    GDALAllRegister();
    poDataset = (GDALDataset *) GDALOpen( pszFilename, GA_ReadOnly );

    printf( "Driver: %s/%s\n",
        poDataset->GetDriver()->GetDescription(),
        poDataset->GetDriver()->GetMetadataItem( GDAL_DMD_LONGNAME ) );
    printf( "Size is %dx%dx%d\n",
        poDataset->GetRasterXSize(),poDataset->GetRasterYSize(),
        poDataset->GetRasterCount() );
    if( poDataset->GetProjectionRef()  != NULL )
        printf( "Projection is `%s'\n", poDataset->GetProjectionRef() );
    if( poDataset->GetGeoTransform( adfGeoTransform ) == CE_None )
    {
        printf( "Origin = (%.6f,%.6f)\n",
                adfGeoTransform[0], adfGeoTransform[3] );
        printf( "Pixel Size = (%.6f,%.6f)\n",
                adfGeoTransform[1], adfGeoTransform[5] );
    }

    poDataset->GetGeoTransform(adfGeoTransform);
    poBand = poDataset->GetRasterBand(1); 
    float X = (103.0000);
    float Y = (4.000);
    
    row = (int)((adfGeoTransform[3] - Y) / -adfGeoTransform[5]); // ULY - xcoord / -N-S CellSize;
    col = (int)((X - adfGeoTransform[0]) / adfGeoTransform[1]);  // xcoord - ULX / E-W CellSize

    poBand->RasterIO(GF_Read, col, row, 1, 1, buffEleveation, 1, 1, GDT_Float32, 0, 0); // read the cell value

    float elevationValue = buffEleveation[0];           

    elevationVecArr.push_back(buffEleveation[0]);

    printf("Elevation = %.f", elevationValue);

    getchar();

    return 0;
    
    
}

1 Ответ

2 голосов
/ 21 июня 2020

Согласно документации на https://gdal.org/doxygen/classGDALRasterBand.html#a75d4af97b3436a4e79d9759eedf89af4 вы можете просто указать диапазон, который хотите прочитать.

constexpr int rows=3601;
constexpr int cols=3601;
std::vector<float> buffEleveation(rows*cols);

// Since we want to read all the data we set:
// nXOff/nYOff to 0
// nXSize/nYSize to 3601
// nBufXSize/nBufXSize to 3601.
poBand->RasterIO(GF_Read, 0, 0, rows, cols, buffEleveation.data(), rows, cols, GDT_Float32, 0, 0); // read all elevation values.
...