[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