[gdal-dev] Arc File Geodatabase

Richard Barnes rbarnes at umn.edu
Mon Aug 29 13:48:26 PDT 2016


I'm not sure that I have time to do a full integration with GDAL. But I 
did continue my previous line of work far enough that I now have a 
decent program for extracting the raster data into GeoTIFFs. It's 
available at: https://github.com/r-barnes/ArcRasterRescue

It seems each raster is associated with five gdbtables. From these the 
program makes a best effort to obtain a CRS WKT and geotransform. It 
also determines the data type and performs endian conversion. 
Decompression is still limited to LZ77 and uncompressed formats.

Best regards,
Richard

On 08/21/2016 05:17 AM, James Ramm wrote:
> Yes, there is some form 2d index - each raster has a corresponding 
> .col_index.atx, .row_index.atx, _.blk_key_index.atx and 
> .band_index.atx files. I've not looke at how they work together so far.
>
>
>
> On Sunday, 21 August 2016, Even Rouault <even.rouault at spatialys.com 
> <mailto:even.rouault at spatialys.com>> wrote:
>
>     Hi Richard,
>
>     > I saw a posting from July
>     >
>     <https://lists.osgeo.org/pipermail/gdal-dev/2016-July/044761.html
>     <https://lists.osgeo.org/pipermail/gdal-dev/2016-July/044761.html>>
>     about
>     > work towards deciphering the Arc File Geodatabase Raster format.
>     >
>     > Inspired, I did some work today and successfully extracted a
>     raster from
>     > a geodatabase.
>     >
>     > Using Even Rouault's /dump_gdbtable/ as a starting point, I
>     decompressed
>     > the raster blobs using zlib, as suggested in the posting.
>     >
>     > For my raster, this gave 128x128 big-endian 32-bit
>     floating-point values
>     > with a trailer of about 512 bytes.
>     >
>     > Assembling these 128x128 tiles using the col_nbr and row_nbr fields
>     > resulted in the raster coming out.
>     >
>     > I've uploaded my fork, along with appropriate input data and a
>     command
>     > to run it all (see README.md) to
>     https://github.com/r-barnes/dump_gdbtable
>     <https://github.com/r-barnes/dump_gdbtable>.
>     >
>     > What remains is to link metadata (block size, band_width,
>     band_height)
>     > to the raster so the output can be sized appropriately, the data
>     type
>     > deduced automatically, and projections saved. This is probably
>     just a
>     > matter of linking the appropriate rows from some of the
>     lower-numbered
>     > gdbtables with the files containing the raster data. It might
>     also be
>     > nice to determine whether zlib is always being used, but I assume an
>     > error could be thrown if an unexpected compression format is
>     encountered.
>
>     One can expect other compression formats according to :
>     http://desktop.arcgis.com/en/arcmap/10.3/manage-data/raster-and-images/raster-compression.htm
>     <http://desktop.arcgis.com/en/arcmap/10.3/manage-data/raster-and-images/raster-compression.htm>
>     None of them seem to be particularly difficult given what GDAL
>     supports ("raw" RLE and "raw" LZW
>     would probably require a bit more work as there is no direct
>     drivers that support them, although they
>     are codecs of some other GDAL drivers like TIFF, and so could be
>     perhaps wrapped on the fly in a in-memory TIFF)
>
>     What they call LZ77 must be the ZLib one (according to
>     https://en.wikipedia.org/wiki/Zlib
>     <https://en.wikipedia.org/wiki/Zlib> ZLib's DEFLATE is a modified
>     LZ77)
>
>     >
>     > I'm interested in seeing GDAL include the ability to translate
>     Arc File
>     > Geodatabase Rasters into other (less proprietary) formats.
>     > What is a good way to move forward with that?
>
>     "A bit" of coding !
>     ogr/ogrsf_frmts/openfilegdb/filegdbtable.cpp should probably be
>     extended to offer
>     the low level access to the rasters.
>     And ogropenfilegdbdatasource.cpp to implement the GDAL Raster API
>     using the above.
>     Regarding efficiency of random reading of tiles, I'm wondering if
>     they have some form of 2D (row, column)
>     indexing or perhaps 3D (row, column, pyramid_level). For the
>     vector part, I only addressed the case
>     of 1D indexes.
>     As a fallback sequential reading through the records could still
>     be used, perhaps with some tricks to read only the start
>     of the records to get the (row, column, pyramid_level) values, if
>     located at the beginning of it,
>     and not the raster data if not needed.
>
>     Even
>
>     >
>     > Best regards,
>     > Richard Barnes
>
>     --
>     Spatialys - Geospatial professional services
>     http://www.spatialys.com
>     _______________________________________________
>     gdal-dev mailing list
>     gdal-dev at lists.osgeo.org <javascript:;>
>     http://lists.osgeo.org/mailman/listinfo/gdal-dev
>     <http://lists.osgeo.org/mailman/listinfo/gdal-dev>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20160829/20d11389/attachment.html>


More information about the gdal-dev mailing list