]> granicus.if.org Git - postgis/commitdiff
Added ST_Transform(raster) variant that allows of aligning output
authorBborie Park <bkpark at ucdavis.edu>
Mon, 26 Nov 2012 21:09:02 +0000 (21:09 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Mon, 26 Nov 2012 21:09:02 +0000 (21:09 +0000)
rasters to a reference raster. Ticket #2105

git-svn-id: http://svn.osgeo.org/postgis/trunk@10741 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
doc/reference_raster.xml
raster/rt_pg/rtpostgis.sql.in.c
raster/test/regress/rt_resample.sql
raster/test/regress/rt_resample_expected

diff --git a/NEWS b/NEWS
index 87d0cf164abceec26d021258f31d0796946e79e4..dd0f3ddc941fc7d2d0a53509248d2492d5a08d6c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -86,6 +86,8 @@ PostGIS 2.1.0
   - #2078, New variants of ST_Slope, ST_Aspect and ST_HillShade to provide
     solution to handling tiles in a coverage
   - #2097, Added RANGE uniontype option for ST_Union(raster)
+  - #2105, Added ST_Transform(raster) variant for aligning output to
+    reference raster
 
 * Fixes *
 
index 8263044f87750c185c50b8048c923e6432d76751..b1429cdda7901f7f7e9192efb3cf1428236b2934 100644 (file)
@@ -5755,6 +5755,16 @@ SELECT ST_UpperLeftX(ST_SnapToGrid(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 0
                
                        <refsynopsisdiv>
                                <funcsynopsis>
+                                 <funcprototype>
+                                       <funcdef>raster <function>ST_Transform</function></funcdef>
+                                       <paramdef><type>raster </type> <parameter>rast</parameter></paramdef>
+                                       <paramdef><type>integer </type> <parameter>srid</parameter></paramdef>
+                                       <paramdef choice="opt"><type>text </type> <parameter>algorithm=NearestNeighbor</parameter></paramdef>
+                                       <paramdef choice="opt"><type>double precision </type> <parameter>maxerr=0.125</parameter></paramdef>
+                                       <paramdef choice="opt"><type>double precision </type> <parameter>scalex</parameter></paramdef>
+                                       <paramdef choice="opt"><type>double precision </type> <parameter>scaley</parameter></paramdef>
+                                 </funcprototype>
+
                                  <funcprototype>
                                        <funcdef>raster <function>ST_Transform</function></funcdef>
                                        <paramdef><type>raster </type> <parameter>rast</parameter></paramdef>
@@ -5768,11 +5778,9 @@ SELECT ST_UpperLeftX(ST_SnapToGrid(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 0
                                  <funcprototype>
                                        <funcdef>raster <function>ST_Transform</function></funcdef>
                                        <paramdef><type>raster </type> <parameter>rast</parameter></paramdef>
-                                       <paramdef><type>integer </type> <parameter>srid</parameter></paramdef>
+                                       <paramdef><type>raster </type> <parameter>alignto</parameter></paramdef>
                                        <paramdef choice="opt"><type>text </type> <parameter>algorithm=NearestNeighbor</parameter></paramdef>
                                        <paramdef choice="opt"><type>double precision </type> <parameter>maxerr=0.125</parameter></paramdef>
-                                       <paramdef choice="opt"><type>double precision </type> <parameter>scalex</parameter></paramdef>
-                                       <paramdef choice="opt"><type>double precision </type> <parameter>scaley</parameter></paramdef>
                                  </funcprototype>
                                </funcsynopsis>
                        </refsynopsisdiv>
@@ -5783,9 +5791,16 @@ SELECT ST_UpperLeftX(ST_SnapToGrid(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 0
                                <para>Reprojects a raster in a known spatial reference system to another known spatial reference system using specified pixel warping algorithm. 
                                    Uses 'NearestNeighbor' if no algorithm is specified and maxerror percent of 0.125 if no maxerr is specified.</para>
                                <para>Algorithm options are: 'NearestNeighbor', 'Bilinear', 'Cubic', 'CubicSpline', and 'Lanczos'.  Refer to: <ulink url="http://www.gdal.org/gdalwarp.html">GDAL Warp resampling methods</ulink> for more details.</para>
+
+                               <para>
+                                       Unlike the other variants, Variant 3 requires a reference raster as <varname>alignto</varname>. The transformed raster will be transformed to the spatial reference system (SRID) of the reference raster and be aligned (ST_SameAlignment = TRUE) to the reference raster.
+                               </para>
+
                                <para>Availability: 2.0.0  Requires GDAL 1.6.1+</para>
                                <note><para>If you find your transformation support is not working right, you may need to set the environment variable PROJSO to the .so or .dll projection library
                                        your PostGIS is using.  This just needs to have the name of the file. So for example on windows, you would in Control Panel -> System -> Environment Variables add a system variable called <varname>PROJSO</varname> and set it to <varname>libproj.dll</varname> (if you are using proj 4.6.1).  You'll have to restart your PostgreSQL service/daemon after this change.</para></note>
+
+                               <para>Enhanced: 2.1.0 Addition of ST_Transform(rast, alignto) variant</para>
                        </refsection>
                                
                        <refsection>
@@ -5842,6 +5857,49 @@ SELECT ST_UpperLeftX(ST_SnapToGrid(ST_AddBand(ST_MakeEmptyRaster(10, 10, 0, 0, 0
 </informaltable>
                        </refsection>
 
+                       <refsection>
+                               <title>Examples: Variant 3</title>
+
+                               <para>The following shows the difference between using ST_Transform(raster, srid) and ST_Transform(raster, alignto)</para>
+                               <programlisting>
+WITH foo AS (
+       SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 1, 0) AS rast UNION ALL
+       SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 2, 0) AS rast UNION ALL
+       SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 600000, 100, -100, 0, 0, 2163), 1, '16BUI', 3, 0) AS rast UNION ALL
+
+       SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 10, 0) AS rast UNION ALL
+       SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 20, 0) AS rast UNION ALL
+       SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599800, 100, -100, 0, 0, 2163), 1, '16BUI', 30, 0) AS rast UNION ALL
+
+       SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 100, 0) AS rast UNION ALL
+       SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 200, 0) AS rast UNION ALL
+       SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599600, 100, -100, 0, 0, 2163), 1, '16BUI', 300, 0) AS rast
+), bar AS (
+       SELECT
+               ST_Transform(rast, 4269) AS alignto
+       FROM foo
+       LIMIT 1
+), baz AS (
+       SELECT
+               rid,
+               rast,
+               ST_Transform(rast, 4269) AS not_aligned,
+               ST_Transform(rast, alignto) AS aligned
+       FROM foo
+       CROSS JOIN bar
+)
+SELECT
+       ST_SameAlignment(rast) AS rast,
+       ST_SameAlignment(not_aligned) AS not_aligned,
+       ST_SameAlignment(aligned) AS aligned
+FROM baz
+
+ rast | not_aligned | aligned 
+------+-------------+---------
+ t    | f           | t
+                               </programlisting>
+                       </refsection>
+
                        <refsection>
                                <title>See Also</title>
                                <para><xref linkend="ST_Transform" />, <xref linkend="RT_ST_SetSRID" /></para>
index c98f9635f4120ff45094f2f04bf295876cc65ebb..4256fe688e94657a68b93158998d7db72bfcf610 100644 (file)
@@ -2074,6 +2074,15 @@ CREATE OR REPLACE FUNCTION st_transform(rast raster, srid integer, scalexy doubl
        AS $$ SELECT _st_resample($1, $4, $5, $2, $3, $3) $$
        LANGUAGE 'sql' STABLE STRICT;
 
+CREATE OR REPLACE FUNCTION st_transform(
+       rast raster, 
+       alignto raster,
+       algorithm text DEFAULT 'NearestNeighbour', maxerr double precision DEFAULT 0.125
+)
+       RETURNS raster
+       AS $$ SELECT st_resample($1, $2, $3, $4, TRUE) $$
+       LANGUAGE 'sql' STABLE STRICT;
+
 -----------------------------------------------------------------------
 -- ST_Rescale
 -----------------------------------------------------------------------
index 7394e553c13d271a94b149a0b9ba3c8743a1072f..4322cd68d7c12e323406ab47242d8ab60988608b 100644 (file)
@@ -590,6 +590,41 @@ FROM (
        ORDER BY rid
 ) foo;
 
+DROP TABLE raster_resample_src;
+DROP TABLE raster_resample_dst;
+
+WITH foo AS (
+       SELECT 0 AS rid, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 600000, 100, -100, 0, 0, 992163), 1, '16BUI', 1, 0) AS rast UNION ALL
+       SELECT 1, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 600000, 100, -100, 0, 0, 992163), 1, '16BUI', 2, 0) AS rast UNION ALL
+       SELECT 2, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 600000, 100, -100, 0, 0, 992163), 1, '16BUI', 3, 0) AS rast UNION ALL
+
+       SELECT 3, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599800, 100, -100, 0, 0, 992163), 1, '16BUI', 10, 0) AS rast UNION ALL
+       SELECT 4, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599800, 100, -100, 0, 0, 992163), 1, '16BUI', 20, 0) AS rast UNION ALL
+       SELECT 5, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599800, 100, -100, 0, 0, 992163), 1, '16BUI', 30, 0) AS rast UNION ALL
+
+       SELECT 6, ST_AddBand(ST_MakeEmptyRaster(2, 2, -500000, 599600, 100, -100, 0, 0, 992163), 1, '16BUI', 100, 0) AS rast UNION ALL
+       SELECT 7, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499800, 599600, 100, -100, 0, 0, 992163), 1, '16BUI', 200, 0) AS rast UNION ALL
+       SELECT 8, ST_AddBand(ST_MakeEmptyRaster(2, 2, -499600, 599600, 100, -100, 0, 0, 992163), 1, '16BUI', 300, 0) AS rast
+), bar AS (
+       SELECT
+               ST_Transform(rast, 994269) AS alignto
+       FROM foo
+       LIMIT 1
+), baz AS (
+       SELECT
+               rid,
+               rast,
+               ST_Transform(rast, 994269) AS not_aligned,
+               ST_Transform(rast, alignto) AS aligned
+       FROM foo
+       CROSS JOIN bar
+)
+SELECT
+       ST_SameAlignment(rast) AS rast,
+       ST_SameAlignment(not_aligned) AS not_aligned,
+       ST_SameAlignment(aligned) AS aligned
+FROM baz;
+
 DELETE FROM "spatial_ref_sys" WHERE srid = 992163;
 DELETE FROM "spatial_ref_sys" WHERE srid = 993309;
 DELETE FROM "spatial_ref_sys" WHERE srid = 993310;
@@ -597,5 +632,3 @@ DELETE FROM "spatial_ref_sys" WHERE srid = 994269;
 DELETE FROM "spatial_ref_sys" WHERE srid = 984269;
 DELETE FROM "spatial_ref_sys" WHERE srid = 974269;
 
-DROP TABLE raster_resample_src;
-DROP TABLE raster_resample_dst;
index 826a58ae41edd9832cf51998cdc77b4016aec792..aef8d650a48070ac5435eb716e230d07e0ee333c 100644 (file)
@@ -88,3 +88,4 @@ NOTICE:  Values must be provided for both X and Y when specifying the scale.  Re
 5.7|992163|10|11|1|1000.000|-1000.000|0.000|0.000|-500000.000|600991.000|t|t|t
 5.8|992163|10|11|1|1000.000|-1000.000|0.000|0.000|-500000.000|600001.000|t|t|t
 5.9|992163|10|11|1|1000.000|-1000.000|0.000|0.000|-500000.000|600009.000|t|t|t
+t|f|t