[gdal-dev] Extracting cell values from a big image and many smaller images

Limei Ran lran at unc.edu
Mon Mar 3 11:14:24 EST 2008


Hi Frank:

Thank you very much for your help.  I am still puzzled about what GDAL 
classes I should use in our application.  I should give you more details 
about our goal in the previous email.  Our goal for the program is to 
compute the percent of each NLCD 30meter landuse type within each of 
12km modeling grids like zonal computation in arcGIS.  The 12km modeling 
grids cover almost more than 2/3 US (in meterological modeling) and some 
Canada and Mexico.   For areas outside US, we want to use MODIS 1km data 
for the landuse type percent calculation. 

I created a program using OGR classes to generate the 12km modeling grid 
shapefile with modeling grid IDs.  Then, I used ogr2ogr for projection 
conversion, gdal_translate to create a 30 meter-cell 0 value grid with 
the modeling grid extent, and gdal_rasterize to rasterize the shapefile 
into the 0 value image as you suggested (UInt32 to hold ID).  I also 
clipped 1km MODIS image using the modeling area and regrid it into 30m 
grid cells.

Now, I have this created image (116474 X 100960 cells with 30 meter cell 
size, 47gb for *.bil file), 14 NLCD 30 meters landuse images, and MODIS 
30meter landuse image.  I am developing a cpp program using GDAL to 
compute a table which has modeling grid ID and all landuse perentages 
falling into this modeling grid.

The logic in my mind is to read through each NLCD and match each pixel 
in the modeling grid image to calculate each landuse types falling into 
the modeling grid.  After going through NLCD images, non-data areas will 
be calculated using MODIS image data.  But, reading through one pixel at 
a time will take a long time to finish using RasterIO() like you said. 

What is the best way to read through those images for the program under 
GDAL?  Are there any image addition classes or zonal function classes I 
can use within GDAL c++?

Thank you very much,


Limei


Frank Warmerdam wrote:

> Limei Ran wrote:
>
>>
>> Hi:
>>
>> I am using GDAL cpp library to create a program. The program will 
>> ultimately generate a statistic table with cell values from a very 
>> big modeling grid domain image (almost whole US) and many smaller 
>> land use images within the big image.
>>
>> I need to go through all the small image pixels to match grid cell 
>> values in the big image. There are many ways to read image data in 
>> line and blocks from GDALRasterBand class.
>>
>> Since I am new in using GDAL libraries, I appreciate any suggestion 
>> you might have in accessing the images efficiently.
>
>
> Limei,
>
> I'm not exactly clear on what you want to do, but a couple hints:
>
>  - Avoid doing many one pixel reads with RasterIO().  There is quite
>    a bit of overhead in each call and so you should only do one pixel
>    reads when that is all you really need.  I believe even with caching
>    using one pixel reads to read a whole scanline would be easily an
>    order of magnitude slower than doing one full scanline read.
>
>  - If you will be accessing your huge image in local chunks, consider
>    organizing it as a tiled image.  Perhaps an imagine (HFA) file or
>    a BigTIFF with tiling.
>
>  - If you need precision, and your small land use images are for
>    reasonably small areas, I would suggest just loading all the data from
>    the big image that matches the area for the small image in one gulp
>    (one RasterIO() call).  Then do your matching analysis and then move
>    on to the next.
>
> Best regards,




More information about the gdal-dev mailing list