[postgis-commits] svn - r3873 - spike/wktraster/rt_pg

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Mon Mar 16 10:42:52 PDT 2009


Author: mloskot
Date: 2009-03-16 10:42:52 -0700 (Mon, 16 Mar 2009)
New Revision: 3873

Modified:
   spike/wktraster/rt_pg/rtpostgis.sql.in.c
Log:
AddRasterColumn() function: Added basic validation for: nodata array vs pixel types, type of extent geometry, raster_blocking value vs block sizes, out_db.

Modified: spike/wktraster/rt_pg/rtpostgis.sql.in.c
===================================================================
--- spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-03-16 15:00:22 UTC (rev 3872)
+++ spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-03-16 17:42:52 UTC (rev 3873)
@@ -404,19 +404,21 @@
     p_extent ALIAS FOR $14;
 
     -- Local helpers
-
+    sql text;
+    real_schema name;
+    srid_into varchar;
+    geometry_type_into varchar;
     pixel_types varchar[];
-    srid_into varchar;
-    pixel_types_found integer = 0;
-    real_schema name;
-    sql text;
+    pixel_types_size integer := 0;
+    pixel_types_found integer := 0;
+    nodata_values_size integer := 0;
 
 BEGIN
     
     RAISE DEBUG 'Parameters: catalog=%, schema=%, table=%, column=%, srid=%, pixel_types=%, out_db=%, regular_blocking=%, nodata_values=%, pixelsize_x=%, pixelsize_y=%, blocksize_x=%, blocksize_y=%',
                  p_catalog_name, p_schema_name, p_table_name, p_column_name, p_srid, p_pixel_types, p_out_db, p_regular_blocking, p_nodata_values, p_pixelsize_x, p_pixelsize_y, p_blocksize_x, p_blocksize_y;
     
-    -- Validate required parameters
+    -- Validate required parametersa and combinations
     IF ( (p_catalog_name IS NULL) OR (p_schema_name IS NULL)
           OR (p_table_name IS NULL) OR (p_column_name IS NULL) ) THEN
         RAISE EXCEPTION 'Name of catalog, schema, table or column IS NULL, value expected';
@@ -443,6 +445,19 @@
         RETURN 'fail';
     END IF;
 
+    IF ( p_regular_blocking = true ) THEN
+       IF ( p_blocksize_x IS NULL or p_blocksize_y IS NULL ) THEN
+           RAISE EXCEPTION 'blocksize_x/blocksize_y IS NULL, value expected if regular_blocking is TRUE';
+           RETURN 'fail';
+       END IF;
+    ELSE
+       IF ( p_blocksize_x IS NOT NULL or p_blocksize_y IS NOT NULL ) THEN
+           RAISE EXCEPTION 'blocksize_x/blocksize_y values given, but regular_blocking is FALSE';
+           RETURN 'fail';
+       END IF;
+    END IF;
+
+
     -- Verify SRID
     IF ( (p_srid != 0) AND (p_srid != -1) ) THEN
         SELECT SRID INTO srid_into FROM spatial_ref_sys WHERE SRID = p_srid;
@@ -453,15 +468,16 @@
         RAISE DEBUG 'Verified SRID = %', p_srid;
     END IF;
 
+
     -- Verify PIXEL TYPE
     -- TODO: If only PostgreSQL 8.2+ supported, use @> operator instead of brute-force lookup
     --       SELECT p_pixel_types <@ pixel_types INTO pixel_types_found_into; -- boolean
     pixel_types := ARRAY['1BB','2BUI','4BUI','8BSI','8BUI','16BSI','16BUI','32BSI','32BUI','16BF','32BF','64BF'];
 
-    FOR npti IN array_lower(p_pixel_types,1) .. array_upper(p_pixel_types,1) LOOP
+    FOR npti IN array_lower(p_pixel_types, 1) .. array_upper(p_pixel_types, 1) LOOP
 
         pixel_types_found := 0;
-        FOR pti IN array_lower(pixel_types,1) .. array_upper(pixel_types,1) LOOP
+        FOR pti IN array_lower(pixel_types, 1) .. array_upper(pixel_types, 1) LOOP
             IF p_pixel_types[npti] = pixel_types[pti] THEN
                 pixel_types_found := 1;
                 RAISE DEBUG 'Identified pixel type %', p_pixel_types[npti];
@@ -472,8 +488,64 @@
             RAISE EXCEPTION 'Invalid pixel type % - valid ones are %', p_pixel_types[npti], pixel_types;
             RETURN 'fail';
         END IF;
+
+        pixel_types_size := pixel_types_size + 1;
     END LOOP;
 
+
+    -- Verify out_db
+    -- TODO: Waiting for out-db rasters
+    IF ( p_out_db = true ) THEN
+            RAISE EXCEPTION 'TODO: Outside database rasters not implemented yet';
+            RETURN 'fail';
+    END IF;
+
+
+    -- Verify NODATA
+    -- TODO: Validate if NODATA values matche range of corresponding pixel types
+    nodata_values_size := 1 + array_upper(p_nodata_values, 1) - array_lower(p_nodata_values, 1);
+    IF ( pixel_types_size != nodata_values_size ) THEN
+        RAISE EXCEPTION 'Number of pixel types (%) and NODATA values (%) do not match',
+                        pixel_types_size, nodata_values_size;
+        RETURN 'fail';
+    END IF;
+
+
+    -- Verify regular_blocking
+    IF ( p_regular_blocking = true ) THEN
+        IF ( p_blocksize_x IS NULL or p_blocksize_y IS NULL ) THEN
+            RAISE EXCEPTION 'Unexpected NULL for blocksize_x or blocksize_y';
+            RETURN 'fail';
+        END IF;
+
+        -- TODO: Set number of constraints on target table:
+        --       - all tiles have the same size (blocksize_x and blocksize_y)
+        --       - all tiles do not overlap
+        --       - all tiles appear on the regular block grid
+        --       - top left block start at the top left corner of the extent
+        --       - extent field must be a simple non-rotated rectangle
+    END IF;
+
+
+    -- Verify extent geometry
+    IF ( p_extent IS NOT NULL ) THEN
+
+        -- Verify POLYGON type
+        SELECT GeometryType(p_extent) INTO geometry_type_into;
+        IF ( NOT ( geometry_type_into = 'POLYGON' ) ) THEN
+            RAISE EXCEPTION 'extent is of invalid type (%), expected simple and non-rotated POLYGON', geometry_type_into;
+            RETURN 'fail';
+        END IF;
+        
+        -- Verify SRID
+        SELECT ST_SRID(p_extent) INTO srid_into;
+        IF ( p_srid != srid_into::integer ) THEN
+            RAISE EXCEPTION 'SRID values for raster (%) and extent (%) do not match', p_srid, srid_into;
+            RETURN 'fail';
+        END IF;
+    END IF;
+
+
     -- Verify SCHEMA
     IF ( p_schema_name IS NOT NULL AND p_schema_name != '' ) THEN
         sql := 'SELECT nspname FROM pg_namespace '
@@ -508,6 +580,7 @@
         END IF;
     END IF;
 
+
     -- Add raster column to target table
     sql := 'ALTER TABLE '
         || quote_ident(real_schema) || '.' || quote_ident(p_table_name)
@@ -515,6 +588,7 @@
     RAISE DEBUG '%', sql;
     EXECUTE sql;
 
+
     -- Delete stale record in RASTER_COLUMNS (if any)
     sql := 'DELETE FROM raster_columns '
         || ' WHERE r_table_catalog = ' || quote_literal('')
@@ -524,10 +598,13 @@
     RAISE DEBUG '%', sql;
     EXECUTE sql;
 
+
     -- Add record in RASTER_COLUMNS
     sql := 'INSERT INTO raster_columns '
-        || ' (r_table_catalog, r_table_schema, r_table_name, r_column, srid, pixel_types, out_db, regular_blocking, nodata_values) '
-        || ' VALUES ('
+        || '(r_table_catalog, r_table_schema, r_table_name, r_column, srid, '
+        || 'pixel_types, out_db, regular_blocking, nodata_values, '
+        || 'pixelsize_x, pixelsize_y, blocksize_x, blocksize_y, extent) '
+        || 'VALUES ('
         || quote_literal('') || ','
         || quote_literal(real_schema) || ','
         || quote_literal(p_table_name) || ','
@@ -536,23 +613,26 @@
         || quote_literal(p_pixel_types::text) || ','
         || p_out_db::text || ','
         || p_regular_blocking::text || ','
-        || COALESCE(quote_literal(p_nodata_values), 'NULL') || ')';
+        || COALESCE(quote_literal(p_nodata_values::text), 'NULL') || ','
+        || COALESCE(quote_literal(p_pixelsize_x), 'NULL') || ','
+        || COALESCE(quote_literal(p_pixelsize_y), 'NULL') || ','
+        || COALESCE(quote_literal(p_blocksize_x), 'NULL') || ','
+        || COALESCE(quote_literal(p_blocksize_y), 'NULL') || ','
+        || COALESCE(quote_literal(p_extent::text), 'NULL') || ')';
     RAISE DEBUG '%', sql;
     EXECUTE sql;
 
-    RAISE NOTICE 'TODO: Constraints not implemented';
-
     RETURN p_schema_name || '.' || p_table_name || '.' || p_column_name
         || ' srid:' || p_srid::text
         || ' pixel_types:' || p_pixel_types::text
         || ' out_db:' || p_out_db::text
         || ' regular_blocking:' || p_regular_blocking::text
-        || ' nodata_values:' || p_nodata_values::text
-        || ' pixelsize_x:' || p_pixelsize_x::text
-        || ' pixelsize_y:' || p_pixelsize_y::text
-        || ' blocksize_x:' || p_blocksize_x::text
-        || ' blocksize_y:' || p_blocksize_y;
-        -- TODO: Add extent field
+        || ' nodata_values:' || COALESCE(quote_literal(p_nodata_values::text), 'NULL')
+        || ' pixelsize_x:' || COALESCE(quote_literal(p_pixelsize_x), 'NULL')
+        || ' pixelsize_y:' || COALESCE(quote_literal(p_pixelsize_y), 'NULL')
+        || ' blocksize_x:' || COALESCE(quote_literal(p_blocksize_x), 'NULL')
+        || ' blocksize_y:' || COALESCE(quote_literal(p_blocksize_y), 'NULL')
+        || ' extent:' || COALESCE(ST_AsText(p_extent), 'NULL');
 
 END;
 $$



More information about the postgis-commits mailing list