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

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Mon Mar 9 12:32:43 PDT 2009


Author: mloskot
Date: 2009-03-09 12:32:42 -0700 (Mon, 09 Mar 2009)
New Revision: 3818

Modified:
   spike/wktraster/scripts/gdal2wktraster.py
Log:
gdal2wktraster.py: This is patch from Pierre at the Toronto Sprint:
 * Support processing of directories of raster files. Raster files specification using wildcards.
 * Option -I, --index to generated GiST index on raster column.


Modified: spike/wktraster/scripts/gdal2wktraster.py
===================================================================
--- spike/wktraster/scripts/gdal2wktraster.py	2009-03-09 18:40:23 UTC (rev 3817)
+++ spike/wktraster/scripts/gdal2wktraster.py	2009-03-09 19:32:42 UTC (rev 3818)
@@ -7,6 +7,9 @@
 # For more details about raster2pgsql tool, see Specification page:
 # http://www.cef-cfr.ca/index.php?n=Membres.PierreRacineWKTRasterSpecifications
 #
+# For this script to work you'll have to install the GDAL Python library
+# from http://pypi.python.org/pypi/GDAL/
+#
 # Copyright (C) 2009 Mateusz Loskot <mateusz at loskot.net>
 # 
 # This program is free software; you can redistribute it and/or modify
@@ -28,7 +31,7 @@
 import osgeo.gdalconst as gdalc
 from optparse import OptionParser
 import binascii
-import sys
+import sys, glob
 
 ###############################################################################
 # CONSTANTS - DO NOT CHANGE
@@ -45,7 +48,7 @@
     optprs = OptionParser(version="%prog $Revision: 3752 $")
     # Mandatory parameters
     optprs.add_option("-r", "--raster", dest="raster", action="append", default=None,
-                      help="append raster to list of input files, at least one raster file required")
+                      help="append raster to list of input files, at least one raster file required. You may use wildcards (?,*) for specifying multiple files.")
     optprs.add_option("-t", "--table", dest="table", action="store", default=None,
                       help="raster destination in form of [<schema>.]<table>, required")
     # Optional parameters
@@ -59,6 +62,8 @@
                       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("-I", "--index", dest="index", action="store_true", default=False, 
+                      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,
@@ -73,7 +78,7 @@
         opts.create_table = True
 
     if opts.raster is None:
-        optprs.error("use option -r to specify at least one input raster")
+        optprs.error("use option -r to specify at least one input raster. Wildcards (?,*) are accepted.")
 
     # XXX: Now, if --band=Nth, then only Nth band of all specified rasters is dumped/imported
     #      This behavior can be changed to support only single-raster input if --band option used.
@@ -248,7 +253,7 @@
     return hexwkb
 
 
-def make_sql_table_name(schema_table):
+def make_sql_full_table_name(schema_table):
     st = schema_table.split('.')
     if len(st) == 1:
         st.insert(0, "public")
@@ -256,21 +261,27 @@
     table = "\"%s\".\"%s\"" % (st[0], st[1])
     return table
 
+def make_sql_table_name(schema_table):
+    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[0]
 
 def make_sql_drop_table(table):
-    sql = "DROP TABLE IF EXISTS %s CASCADE;\n" % make_sql_table_name(table)
+    sql = "DROP TABLE IF EXISTS %s CASCADE;\n" % make_sql_full_table_name(table)
     logit("SQL: %s" % sql)
     return sql
 
 
 def make_sql_create_table(table, rast):
-    sql = "CREATE TABLE %s (rid serial PRIMARY KEY, \"%s\" RASTER );\n" % (make_sql_table_name(table), rast)
+    sql = "CREATE TABLE %s (rid serial PRIMARY KEY, \"%s\" RASTER );\n" % (make_sql_full_table_name(table), rast)
     logit("SQL: %s" % sql)
     return sql
 
 
 def make_sql_insert_raster(table, rast, hexwkb):
-    sql = "INSERT INTO %s ( %s ) VALUES ( (\'%s\')::raster );\n" % (make_sql_table_name(table), rast, hexwkb)
+    sql = "INSERT INTO %s ( %s ) VALUES ( (\'%s\')::raster );\n" % (make_sql_full_table_name(table), rast, hexwkb)
     # NOTE: Usually, no need for such detailed verbosity
     #logit("SQL: %s" % sql)
     return sql
@@ -303,19 +314,30 @@
 
     # Burn all specified input raster files into single WKTRaster table
     i = 0
+
     for infile in opts.raster:
-        logit("MSG: Raster #%d: %s\n" % (i + 1, infile))
+        filelist = glob.glob(infile)
+        for file in filelist:
+            logit("MSG: Raster #%d: %s\n" % (i + 1, file))
         
-        hexwkb = wkblify_raster(infile, opts.band, g_rt_version, g_rt_endiannes, opts.srid)
-        assert len(hexwkb) > 0, "Error: No HEX WKB generated"
-        assert (len(hexwkb) % 2 == 0), "Error: Invalid size of generated HEX WKB"
+            hexwkb = wkblify_raster(file, opts.band, g_rt_version, g_rt_endiannes, opts.srid)
+            assert len(hexwkb) > 0, "Error: No HEX WKB generated"
+            assert (len(hexwkb) % 2 == 0), "Error: Invalid size of generated HEX WKB"
 
-        # INSERT INTO ... (rast) VALUES (...)
-        sql = make_sql_insert_raster(opts.table, opts.column, hexwkb)
-        fout.write(sql)
+            # INSERT INTO ... (rast) VALUES (...)
+            sql = make_sql_insert_raster(opts.table, opts.column, hexwkb)
+            fout.write(sql)
 
-        i += 1
+            i += 1
 
+    
+    if opts.index:
+		# CREATE INDEX "table_column_gist" ON "public"."table" using gist (rt_raster_envelope(rast));
+		sql = "CREATE INDEX \"%s_%s_gist\" ON %s using gist (rt_raster_envelope(%s));\n" % (make_sql_table_name(opts.table), opts.column, make_sql_full_table_name(opts.table),opts.column)
+
+		fout.write(sql)
+    	
+    
     # Cleanup
     sys.stdout = saved_out
 



More information about the postgis-commits mailing list