1-----------------------------------------------------------------------
2--
3-- Copyright (c) 2009-2010 Mateusz Loskot <mateusz@loskot.net>, David Zwarg <dzwarg@azavea.com>
4--
5-- This program is free software; you can redistribute it and/or
6-- modify it under the terms of the GNU General Public License
7-- as published by the Free Software Foundation; either version 2
8-- of the License, or (at your option) any later version.
9--
10-- This program is distributed in the hope that it will be useful,
11-- but WITHOUT ANY WARRANTY; without even the implied warranty of
12-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13-- GNU General Public License for more details.
14--
15-- You should have received a copy of the GNU General Public License
16-- along with this program; if not, write to the Free Software Foundation,
17-- Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18-----------------------------------------------------------------------
19
20CREATE TABLE rt_properties_test (
21    id numeric,
22    name text,
23    srid integer,
24    width integer,
25    height integer,
26    scalex double precision,
27    scaley double precision,
28    ipx double precision,
29    ipy double precision,
30    skewx double precision,
31    skewy double precision,
32    rast raster
33);
34
35INSERT INTO rt_properties_test
36VALUES ( 0, '10x20, ip:0.5,0.5 scale:2,3 skew:0,0 srid:10 width:10 height:20',
37        10, 10, 20, --- SRID, width, height
38        2, 3, 0.5, 0.5, 0, 0, --- georeference
39(
40'01' -- little endian (uint8 ndr)
41||
42'0000' -- version (uint16 0)
43||
44'0000' -- nBands (uint16 0)
45||
46'0000000000000040' -- scaleX (float64 2)
47||
48'0000000000000840' -- scaleY (float64 3)
49||
50'000000000000E03F' -- ipX (float64 0.5)
51||
52'000000000000E03F' -- ipY (float64 0.5)
53||
54'0000000000000000' -- skewX (float64 0)
55||
56'0000000000000000' -- skewY (float64 0)
57||
58'0A000000' -- SRID (int32 10)
59||
60'0A00' -- width (uint16 10)
61||
62'1400' -- height (uint16 20)
63)::raster
64);
65
66INSERT INTO rt_properties_test
67VALUES ( 1, '1x1, ip:2.5,2.5 scale:5,5 skew:0,0, srid:12, width:1, height:1',
68        12, 1, 1, --- SRID, width, height
69         5, 5, 2.5, 2.5, 0, 0, --- georeference
70(
71'01' -- little endian (uint8 ndr)
72||
73'0000' -- version (uint16 0)
74||
75'0000' -- nBands (uint16 0)
76||
77'0000000000001440' -- scaleX (float64 5)
78||
79'0000000000001440' -- scaleY (float64 5)
80||
81'0000000000000440' -- ipX (float64 2.5)
82||
83'0000000000000440' -- ipY (float64 2.5)
84||
85'0000000000000000' -- skewX (float64 0)
86||
87'0000000000000000' -- skewY (float64 0)
88||
89'0C000000' -- SRID (int32 12)
90||
91'0100' -- width (uint16 1)
92||
93'0100' -- height (uint16 1)
94)::raster
95);
96
97INSERT INTO rt_properties_test
98VALUES ( 2, '1x1, ip:7.5,2.5 scale:5,5 skew:0,0, srid:0, width:1, height:1',
99         0, 1, 1, --- SRID, width, height
100         5, 5, 7.5, 2.5, 0, 0, --- georeference
101(
102'01' -- little endian (uint8 ndr)
103||
104'0000' -- version (uint16 0)
105||
106'0000' -- nBands (uint16 0)
107||
108'0000000000001440' -- scaleX (float64 5)
109||
110'0000000000001440' -- scaleY (float64 5)
111||
112'0000000000001E40' -- ipX (float64 7.5)
113||
114'0000000000000440' -- ipY (float64 2.5)
115||
116'0000000000000000' -- skewX (float64 0)
117||
118'0000000000000000' -- skewY (float64 0)
119||
120'00000000' -- SRID (int32 0)
121||
122'0100' -- width (uint16 1)
123||
124'0100' -- height (uint16 1)
125)::raster
126);
127
128INSERT INTO rt_properties_test
129VALUES ( 3, '1x1, ip:7.5,2.5 scale:5,5 skew:0,0, srid:-1, width:1, height:1',
130         0, 1, 1, --- SRID, width, height
131         5, 5, 7.5, 2.5, 0, 0, --- georeference
132(
133'01' -- little endian (uint8 ndr)
134||
135'0000' -- version (uint16 0)
136||
137'0000' -- nBands (uint16 0)
138||
139'0000000000001440' -- scaleX (float64 5)
140||
141'0000000000001440' -- scaleY (float64 5)
142||
143'0000000000001E40' -- ipX (float64 7.5)
144||
145'0000000000000440' -- ipY (float64 2.5)
146||
147'0000000000000000' -- skewX (float64 0)
148||
149'0000000000000000' -- skewY (float64 0)
150||
151'00000000' -- SRID (int32 0)
152||
153'0100' -- width (uint16 1)
154||
155'0100' -- height (uint16 1)
156)::raster
157);
158
159INSERT INTO rt_properties_test
160VALUES ( 4, '1x1, ip:7.5,2.5 scale:5,5 skew:1,1, srid:-1, width:1, height:1',
161         0, 1, 1, --- SRID, width, height
162         5, 5, 7.5, 2.5, 1, 1, --- georeference
163(
164'01' -- little endian (uint8 ndr)
165||
166'0000' -- version (uint16 0)
167||
168'0000' -- nBands (uint16 0)
169||
170'0000000000001440' -- scaleX (float64 5)
171||
172'0000000000001440' -- scaleY (float64 5)
173||
174'0000000000001E40' -- ipX (float64 7.5)
175||
176'0000000000000440' -- ipY (float64 2.5)
177||
178'000000000000F03F' -- skewX (float64 1)
179||
180'000000000000F03F' -- skewY (float64 1)
181||
182'00000000' -- SRID (int32 0)
183||
184'0100' -- width (uint16 1)
185||
186'0100' -- height (uint16 1)
187)::raster
188);
189
190INSERT INTO rt_properties_test
191VALUES ( 5, '1x1, ip:7.5,2.5 scale:5,5 skew:3,7, srid:-1, width:1, height:1',
192         0, 1, 1, --- SRID, width, height
193         5, 5, 7.5, 2.5, 3, 7, --- georeference
194(
195'01' -- little endian (uint8 ndr)
196||
197'0000' -- version (uint16 0)
198||
199'0000' -- nBands (uint16 0)
200||
201'0000000000001440' -- scaleX (float64 5)
202||
203'0000000000001440' -- scaleY (float64 5)
204||
205'0000000000001E40' -- ipX (float64 7.5)
206||
207'0000000000000440' -- ipY (float64 2.5)
208||
209'0000000000000840' -- skewX (float64 3)
210||
211'0000000000001C40' -- skewY (float64 7)
212||
213'00000000' -- SRID (int32 0)
214||
215'0100' -- width (uint16 1)
216||
217'0100' -- height (uint16 1)
218)::raster
219);
220
221-----------------------------------------------------------------------
222-- st_georeference (default)
223-----------------------------------------------------------------------
224
225SELECT
226    replace(st_georeference(rast)::text, E'\n', E'EOL'),
227    replace(st_georeference(rast)::text, E'\n', E'EOL') =
228    '2.0000000000EOL0.0000000000EOL0.0000000000EOL3.0000000000EOL0.5000000000EOL0.5000000000EOL'
229FROM rt_properties_test
230WHERE id = 0;
231
232SELECT
233    replace(st_georeference(rast)::text, E'\n', E'EOL'),
234    replace(st_georeference(rast)::text, E'\n', E'EOL') =
235    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL2.5000000000EOL2.5000000000EOL'
236FROM rt_properties_test
237WHERE id = 1;
238
239SELECT
240    replace(st_georeference(rast)::text, E'\n', E'EOL'),
241    replace(st_georeference(rast)::text, E'\n', E'EOL') =
242    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
243FROM rt_properties_test
244WHERE id = 2;
245
246SELECT
247    replace(st_georeference(rast)::text, E'\n', E'EOL'),
248    replace(st_georeference(rast)::text, E'\n', E'EOL') =
249    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
250FROM rt_properties_test
251WHERE id = 3;
252
253SELECT
254    replace(st_georeference(rast)::text, E'\n', E'EOL'),
255    replace(st_georeference(rast)::text, E'\n', E'EOL') =
256    '5.0000000000EOL1.0000000000EOL1.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
257FROM rt_properties_test
258WHERE id = 4;
259
260SELECT
261    replace(st_georeference(rast)::text, E'\n', E'EOL'),
262    replace(st_georeference(rast)::text, E'\n', E'EOL') =
263    '5.0000000000EOL7.0000000000EOL3.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
264FROM rt_properties_test
265WHERE id = 5;
266
267-----------------------------------------------------------------------
268-- st_georeference (GDAL)
269-----------------------------------------------------------------------
270
271SELECT
272    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL'),
273    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL') =
274    '2.0000000000EOL0.0000000000EOL0.0000000000EOL3.0000000000EOL0.5000000000EOL0.5000000000EOL'
275FROM rt_properties_test
276WHERE id = 0;
277
278SELECT
279    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL'),
280    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL') =
281    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL2.5000000000EOL2.5000000000EOL'
282FROM rt_properties_test
283WHERE id = 1;
284
285SELECT
286    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL'),
287    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL') =
288    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
289FROM rt_properties_test
290WHERE id = 2;
291
292SELECT
293    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL'),
294    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL') =
295    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
296FROM rt_properties_test
297WHERE id = 3;
298
299SELECT
300    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL'),
301    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL') =
302    '5.0000000000EOL1.0000000000EOL1.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
303FROM rt_properties_test
304WHERE id = 4;
305
306SELECT
307    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL'),
308    replace(st_georeference(rast,'GDAL')::text, E'\n', E'EOL') =
309    '5.0000000000EOL7.0000000000EOL3.0000000000EOL5.0000000000EOL7.5000000000EOL2.5000000000EOL'
310FROM rt_properties_test
311WHERE id = 5;
312
313-----------------------------------------------------------------------
314-- st_georeference (ESRI)
315-----------------------------------------------------------------------
316
317SELECT
318	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL'),
319	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL') =
320    '2.0000000000EOL0.0000000000EOL0.0000000000EOL3.0000000000EOL1.5000000000EOL2.0000000000EOL'
321FROM rt_properties_test
322WHERE id = 0;
323
324SELECT
325	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL'),
326	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL') =
327    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL5.0000000000EOL5.0000000000EOL'
328FROM rt_properties_test
329WHERE id = 1;
330
331SELECT
332	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL'),
333	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL') =
334    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL10.0000000000EOL5.0000000000EOL'
335FROM rt_properties_test
336WHERE id = 2;
337
338SELECT
339	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL'),
340	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL') =
341    '5.0000000000EOL0.0000000000EOL0.0000000000EOL5.0000000000EOL10.0000000000EOL5.0000000000EOL'
342FROM rt_properties_test
343WHERE id = 3;
344
345SELECT
346	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL'),
347	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL') =
348    '5.0000000000EOL1.0000000000EOL1.0000000000EOL5.0000000000EOL10.0000000000EOL5.0000000000EOL'
349FROM rt_properties_test
350WHERE id = 4;
351
352SELECT
353	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL'),
354	replace(st_georeference(rast,'ESRI')::text, E'\n', E'EOL') =
355    '5.0000000000EOL7.0000000000EOL3.0000000000EOL5.0000000000EOL10.0000000000EOL5.0000000000EOL'
356FROM rt_properties_test
357WHERE id = 5;
358
359-----------------------------------------------------------------------
360-- st_setgeoreference (error conditions)
361-----------------------------------------------------------------------
362
363SELECT
364    -- all 6 parameters must be numeric
365    st_setgeoreference(rast,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 nodata') IS NULL
366FROM rt_properties_test
367WHERE id = 0;
368
369SELECT
370    -- must have 6 parameters
371    st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000') IS NULL
372FROM rt_properties_test
373WHERE id = 1;
374
375SELECT
376    -- any whitespace accepted between parameters as well as ' '
377    st_setgeoreference(rast,E'2.0000000000	1.0000000000\n2.0000000000\t3.0000000000	1.5000000000	2.0000000000') IS NOT NULL
378FROM rt_properties_test
379WHERE id = 2;
380
381-----------------------------------------------------------------------
382-- st_setgeoreference (warning conditions)
383-----------------------------------------------------------------------
384
385SELECT
386    -- raster arg is null
387    st_setgeoreference(null,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 2.0000000000') IS NULL
388FROM rt_properties_test
389WHERE id = 0;
390
391-----------------------------------------------------------------------
392-- st_setgeoreference (default)
393-----------------------------------------------------------------------
394
395SELECT
396	st_scalex(rast) = 2,
397	st_scaley(rast) = 3,
398	st_scalex(st_setgeoreference(rast,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 2.0000000000')) = 4,
399	st_scaley(st_setgeoreference(rast,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 2.0000000000')) = 6
400FROM rt_properties_test
401WHERE id = 0;
402
403SELECT
404	st_skewx(rast) = 0,
405	st_skewy(rast) = 0,
406	st_skewx(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000')) = 2,
407	st_skewy(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000')) = 1
408FROM rt_properties_test
409WHERE id = 1;
410
411SELECT
412	st_upperleftx(rast) = 7.5,
413	st_upperlefty(rast) = 2.5,
414	st_upperleftx(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000')) = 1.5,
415	st_upperlefty(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000')) = 2.0
416FROM rt_properties_test
417WHERE id = 2;
418
419-----------------------------------------------------------------------
420-- st_setgeoreference (GDAL)
421-----------------------------------------------------------------------
422
423SELECT
424	st_scalex(rast) = 2,
425	st_scaley(rast) = 3,
426	st_scalex(st_setgeoreference(rast,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 2.0000000000','GDAL')) = 4,
427	st_scaley(st_setgeoreference(rast,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 2.0000000000','GDAL')) = 6
428FROM rt_properties_test
429WHERE id = 0;
430
431SELECT
432	st_skewx(rast) = 0,
433	st_skewy(rast) = 0,
434	st_skewx(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000','GDAL')) = 2,
435	st_skewy(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000','GDAL')) = 1
436FROM rt_properties_test
437WHERE id = 1;
438
439SELECT
440	st_upperleftx(rast) = 7.5,
441	st_upperlefty(rast) = 2.5,
442	st_upperleftx(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000','GDAL')) = 1.5,
443	st_upperlefty(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000','GDAL')) = 2.0
444FROM rt_properties_test
445WHERE id = 2;
446
447-----------------------------------------------------------------------
448-- st_setgeoreference (ESRI)
449-----------------------------------------------------------------------
450
451SELECT
452	st_scalex(rast) = 2,
453	st_scaley(rast) = 3,
454	st_scalex(st_setgeoreference(rast,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 2.0000000000','ESRI')) = 4,
455	st_scaley(st_setgeoreference(rast,'4.0000000000 0.0000000000 0.0000000000 6.0000000000 1.5000000000 2.0000000000','ESRI')) = 6
456FROM rt_properties_test
457WHERE id = 0;
458
459SELECT
460	st_skewx(rast) = 0,
461	st_skewy(rast) = 0,
462	st_skewx(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000','ESRI')) = 2,
463	st_skewy(st_setgeoreference(rast,'2.0000000000 1.0000000000 2.0000000000 3.0000000000 1.5000000000 2.0000000000','ESRI')) = 1
464FROM rt_properties_test
465WHERE id = 1;
466
467SELECT
468	st_upperleftx(rast) = 7.5,
469	st_upperlefty(rast) = 2.5,
470	st_upperleftx(st_setgeoreference(rast,'2.0000000000 0.0000000000 0.0000000000 3.0000000000 1.0000000000 2.5000000000','ESRI')) = 0,
471	st_upperlefty(st_setgeoreference(rast,'2.0000000000 0.0000000000 0.0000000000 3.0000000000 1.0000000000 2.5000000000','ESRI')) = 1
472FROM rt_properties_test
473WHERE id = 2;
474
475-----------------------------------------------------------------------
476-- ST_SetGeoReference(raster, double precision, ...)
477-----------------------------------------------------------------------
478
479SELECT id, ST_Metadata(rast), ST_Metadata(ST_SetGeoReference(rast, 0, 0, 1, -1, 0, 0)) FROM rt_properties_test ORDER BY id;
480SELECT id, ST_Metadata(rast), ST_Metadata(ST_SetGeoReference(rast, 1, 1, 0.1, -0.1, 0, 0)) FROM rt_properties_test ORDER BY id;
481SELECT id, ST_Metadata(rast), ST_Metadata(ST_SetGeoReference(rast, 0, 0.1, 1, 1, 0, 0)) FROM rt_properties_test ORDER BY id;
482
483DROP TABLE rt_properties_test;
484