[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