[postgis-commits] svn - r3874 - spike/wktraster/scripts

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Mon Mar 16 15:23:03 PDT 2009


Author: pracine
Date: 2009-03-16 15:23:02 -0700 (Mon, 16 Mar 2009)
New Revision: 3874

Modified:
   spike/wktraster/scripts/gdal2wktraster.py
Log:
Added the possibility to register a raster.

Modified: spike/wktraster/scripts/gdal2wktraster.py
===================================================================
--- spike/wktraster/scripts/gdal2wktraster.py	2009-03-16 17:42:52 UTC (rev 3873)
+++ spike/wktraster/scripts/gdal2wktraster.py	2009-03-16 22:23:02 UTC (rev 3874)
@@ -30,8 +30,7 @@
 from osgeo import osr
 import osgeo.gdalconst as gdalc
 from optparse import OptionParser
-import binascii
-import sys, glob
+import binascii, sys, glob, os
 
 # TODO: *** DUMPER *** Testing if loading breaks raster data.
 # This is to dump source raster to text file for testing raw pixel values
@@ -66,8 +65,10 @@
                       help="drop table, create new one and populate with raster(s)")
     optprs.add_option("-f", "--field", dest="column", action="store", default=g_rt_column, 
                       help="specify name of raster data column, default is 'rast'")
+    optprs.add_option("-R", "--register", dest="register", action="store_true", default=False, 
+                      help="register the raster as a filesystem (out-db) raster")
     optprs.add_option("-I", "--index", dest="index", action="store_true", default=False, 
-                      help="Create a GiST index on the raster column")
+                      help="create a GiST index on the raster column")
     optprs.add_option("-o", "--output", dest="output", action="store", default=sys.stdout,
                       help="specify file for conversion output, otherwise send to stdout")
     optprs.add_option("-v", "--verbose", dest="verbose", action="store_true", default=False,
@@ -141,7 +142,8 @@
         'i': '%d', # PT_32BSI
         'I': '%d', # PT_32BUI
         'f': '%f', # PT_32BF
-        'd': '%f'  # PT_64BF
+        'd': '%f',  # PT_64BF
+        's': '%s'
         }
     return fmttypes.get(fmt, 'f')
 
@@ -154,7 +156,7 @@
     hexstr = binascii.hexlify(struct.pack(fmt_little, data)).upper()
 
     # String'ify raw value for log
-    valfmt = '\'' + fmt2printfmt(fmt) + '\''
+    valfmt = '\'' + fmt2printfmt(fmt[len(fmt) - 1]) + '\''
     val = valfmt % data
     logit('HEX (\'fmt=%s\', bytes=%d, val=%s):\t\t%s\n' % (fmt, len(hexstr) / 2, str(val), hexstr))
 
@@ -200,13 +202,20 @@
     return hexwkb
 
 
-def wkblify_band(band):
-    assert band is not None, "Error: No raster band"
-    import struct # TODO: Remove
+def wkblify_band(ds, bandidx, register):
+    assert ds is not None, "Error: No dataset to extract band from"
 
     hexwkb = ""
+    band = ds.GetRasterBand(bandidx)
+    if band is None:
+        logit("Cannot fetch raster band of index %d" % bn)
+        # exit def
     pixtype = gdt2pt(band.DataType)['id']
-    hexwkb += wkblify('B', pixtype)
+
+    if register:
+        hexwkb += wkblify('B', pixtype + 128)
+    else:
+        hexwkb += wkblify('B', pixtype)
     
     # FIXME: What if input dataset does not specify NODATA value? Zero?
     nodata = 0
@@ -214,22 +223,28 @@
         nodata = band.GetNoDataValue()
     hexwkb += wkblify(pt2fmt(pixtype), nodata)
 
-    # Rows of pixels of raster 
-    for row in range(0, band.YSize):
-        scanline = band.ReadRaster(0, row, band.XSize, 1, band.XSize, 1)
+    if register:
+        hexwkb += wkblify('B', bandidx - 1)
+        filepath = os.path.abspath((ds.GetFileList()[0]).replace('\\', '\\\\'))
+        hexwkb += wkblify(str(len(filepath)) + 's', filepath)
+        hexwkb += wkblify('B', 0)
+    else:    
+        # Rows of pixels of raster 
+        for row in range(0, band.YSize):
+            scanline = band.ReadRaster(0, row, band.XSize, 1, band.XSize, 1)
 
-        # TODO: *** DUMPER *** Dump scanline to file
-        #tuple = struct.unpack('B' * band.XSize, scanline)
-        #s = '\t'.join([str(v) for v in tuple]) + '\n'
-        #fdumper.write(s)
+            # TODO: *** DUMPER *** Dump scanline to file
+            #tuple = struct.unpack('B' * band.XSize, scanline)
+            #s = '\t'.join([str(v) for v in tuple]) + '\n'
+            #fdumper.write(s)
 
-        hexwkb += binascii.hexlify(scanline)
-        logit('.')
+            hexwkb += binascii.hexlify(scanline)
+            logit('.')
     logit('\n')
 
     return hexwkb
 
-def wkblify_raster(infile, band_num, rt_version, rt_endian, rt_srid):
+def wkblify_raster(infile, band_num, rt_version, rt_endian, rt_srid, register):
     assert rt_version == 0, "Error: invalid rt_version"
     assert rt_endian == 1, "Error: invalid rt_endian specifier, use little-endian only"
     assert rt_srid >= -1, "Error: do you really want to specify SRID = %d" % rt_srid
@@ -251,19 +266,14 @@
         band_to = band_num + 1
 
     for bn in range(band_from, band_to):
-        band = ds.GetRasterBand(bn)
-        if band is None:
-            logit("Cannot fetch raster band of index %d" % bn)
-            continue
-        
+       
         # TODO: *** DUMPER - Mark band being dumped
         #fdumper.write('--- BAND %d ------------------------------\n' % bn)
 
         logit('MSG: Band #%d\n' % bn)
-        hexwkb += wkblify_band(band)
-        band = None
+        hexwkb += wkblify_band(ds, bn, register)
+
     ds = None
-
     return hexwkb
 
 
@@ -279,7 +289,7 @@
     st = schema_table.split('.')
     assert len(st) == 1 or len(st) == 2, "Invalid format of table name, expected [<schema>.]table"
     if len(st) == 2:
-    	return st[1]
+        return st[1]
     return st[0]
 
 def make_sql_drop_table(table):
@@ -334,7 +344,7 @@
         for file in filelist:
             logit("MSG: Raster #%d: %s\n" % (i + 1, file))
         
-            hexwkb = wkblify_raster(file, opts.band, g_rt_version, g_rt_endiannes, opts.srid)
+            hexwkb = wkblify_raster(file, opts.band, g_rt_version, g_rt_endiannes, opts.srid, opts.register)
             assert len(hexwkb) > 0, "Error: No HEX WKB generated"
             assert (len(hexwkb) % 2 == 0), "Error: Invalid size of generated HEX WKB"
 



More information about the postgis-commits mailing list