Discussion:
[Gdal-dev] Newbie question about Memory driver
Black, Jerry
2007-11-21 17:50:33 UTC
Permalink
Hi,

I'm a newbie, and have a question that stems from my desire to perform the
following:

gdal_translate from a source data file into a memory driver and then
gdal_warp from that memory driver into a 2nd memory driver

Writing code to essentially call copies of these routines, from my own code
works fine when the execution is:

gdal_translate from a source data file into a temporary file and
then
gdal_warp from that file into a 2nd temporary file (at which point
my code can grab the raster from the 2nd file)

When attempting to use memory drivers, the gdal_warp code quite validly
complains that there is not affine transformation (note this being done in
C++ so the memory address is valid between these calls).

Translating file:
gdal_translate -of MEM -co PHOTOMETRIC=RGB -co INTERLEAVE=PIXEL -ot Byte
-outsize 1226 574 -projwin -130.000000 52.000000 -113.883258 47.000000
c:/world-topo-bathy-200406-3x86400x43200.ecw
MEM:::DATAPOINTER=142409800,PIXELS=613,LINES=287,BANDS=3,DATATYPE=Byte
Input file size is 86400, 43200

Warping file:
Gdalwarp -s_srs EPSG:4326 -t_srs +proj=merc +lon_0=-121.942w -ts 613 287 -wt
Byte
MEM:::DATAPOINTER=142409800,PIXELS=613,LINES=287,BANDS=3,DATATYPE=Byte
c:/world-topo-bathy-200406-3x86400x43200_MERC.TIF

Unable to compute a transformation between pixel/line
and georeferenced coordinates for
MEM:::DATAPOINTER=142409800,PIXELS=613,LINES=287,BANDS=3,DATATYPE=Byte.
There is no affine transformation and no GCPs.

As the Memory driver only stores the actual pixels, I can see why the affine
transformation is missing when calling gdalwarp. Either I'm missing a
parameter for gdalwarp that would enable this, or is there another memory
driver example / or approach available that encapsulates all of the
projection info into the memory structure?

I suspect the only solution is to tease out the relevant sections of
gdaltranlate and gdalwarp and pass the dataset between them.


The original ecw file has EPSG:4326 imbedded in it.

gdalinfo
c:/world-topo-bathy-200406-3x86400x43200.ecw
Driver: ECW/ERMapper Compressed Wavelets
Size is 86400, 43200
Coordinate System is:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
TOWGS84[0,0,0,0,0,0,0],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9108"]],
AXIS["Lat",NORTH],
AXIS["Long",EAST],
AUTHORITY["EPSG","4326"]]
Origin = (-180.000000,90.000000)
Pixel Size = (0.00416667,-0.00416667)
Corner Coordinates:
Upper Left (-180.0000000, 90.0000000) (180d 0'0.00"W, 90d 0'0.00"N)
Lower Left (-180.0000000, -90.0000000) (180d 0'0.00"W, 90d 0'0.00"S)
Upper Right ( 180.0000000, 90.0000000) (180d 0'0.00"E, 90d 0'0.00"N)
Lower Right ( 180.0000000, -90.0000000) (180d 0'0.00"E, 90d 0'0.00"S)
Center ( -0.0000000, 0.0000000) ( 0d 0'0.00"W, 0d 0'0.00"N)
Band 1 Block=86400x1 Type=Byte, ColorInterp=Red
Overviews: arbitrary
Band 2 Block=86400x1 Type=Byte, ColorInterp=Green
Overviews: arbitrary
Band 3 Block=86400x1 Type=Byte, ColorInterp=Blue
Overviews: arbitrary

Thanks

Jerry Black
Bedford Institute of Oceanography
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20061222/edf1c5d3/attachment.html
Frank Warmerdam
2007-11-21 17:50:33 UTC
Permalink
Post by Black, Jerry
Hi,
I'm a newbie, and have a question that stems from my desire to perform
gdal_translate from a source data file into a memory driver and then
gdal_warp from that memory driver into a 2nd memory driver
Writing code to essentially call copies of these routines, from my own
gdal_translate from a source data file into a temporary file and then
gdal_warp from that file into a 2nd temporary file (at which point
my code can grab the raster from the 2nd file)
When attempting to use memory drivers, the gdal_warp code quite validly
complains that there is not affine transformation (note this being done
in C++ so the memory address is valid between these calls).
...
Post by Black, Jerry
As the Memory driver only stores the actual pixels, I can see why the
affine transformation is missing when calling gdalwarp. Either I'm
missing a parameter for gdalwarp that would enable this, or is there
another memory driver example / or approach available that encapsulates
all of the projection info into the memory structure?
I suspect the only solution is to tease out the relevant sections of
gdaltranlate and gdalwarp and pass the dataset between them.
Jerry,

You are exactly right. In order to keep the metadata associated with the
MEM dataset you need to keep it open, and pass the same dataset handle from
step to step.

Best regards,
--
---------------------------------------+--------------------------------------
I set the clouds in motion - turn up | Frank Warmerdam, ***@pobox.com
light and sound - activate the windows | http://pobox.com/~warmerdam
and watch the world go round - Rush | President OSGeo, http://osgeo.org
Continue reading on narkive:
Loading...