Commit beaa619f authored by Regina Obe's avatar Regina Obe

Add ST_BandFileSize and ST_BandFileTimestamp,

           extend ST_BandMetadata (Even Rouault)
Closes #4083 for PostGIS 2.5.0
Closes https://github.com/postgis/postgis/pull/240

git-svn-id: http://svn.osgeo.org/postgis/trunk@16566 b70326c6-7e19-0410-871a-916f4a2858ee
parent 16bd737e
Pipeline #21721917 passed with stage
in 20 minutes and 10 seconds
......@@ -13,6 +13,8 @@ PostGIS 2.5.0
- #3176, Add ST_OrientedEnvelope (Dan Baston)
- #4029, Add ST_QuantizeCoordinates (Dan Baston)
- #4063, Optional false origin point for ST_Scale (Paul Ramsey)
- #4082, Add ST_BandFileSize and ST_BandFileTimestamp,
extend ST_BandMetadata (Even Rouault)
* Breaking Changes *
- #4054, ST_SimplifyVW changed from > tolerance to >= tolerance
......
......@@ -3760,7 +3760,7 @@ FROM dummy_rast;
<refsection>
<title>Description</title>
<para>Returns basic meta data about a raster band. Columns returned: pixeltype, nodatavalue, isoutdb, path, outdbbandnum.
<para>Returns basic meta data about a raster band. Columns returned: pixeltype, nodatavalue, isoutdb, path, outdbbandnum, filesize, filetimestamp.
</para>
<note>
<para>
......@@ -3775,9 +3775,12 @@ FROM dummy_rast;
</note>
<note>
<para>
If isoutdb is False, path and outdbbandnum are NULL.
If isoutdb is False, path, outdbbandnum, filesize and filetimestamp are NULL. If outdb access is disabled, filesize and filetimestamp will also be NULL.
</para>
</note>
<para>Enhanced: 2.5.0 to include filesize and filetimestamp for outdb rasters.</para>
</refsection>
<refsection>
......@@ -3795,11 +3798,11 @@ FROM ST_BandMetadata(
ARRAY[1,3,2]::int[]
);
bandnum | pixeltype | nodatavalue | isoutdb | path | outdbbandnum
---------+-----------+-------------+---------+--------------------------------------------------------------------------------+--------------
1 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1
3 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 3
2 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 2
bandnum | pixeltype | nodatavalue | isoutdb | path | outdbbandnum | filesize | filetimestamp |
---------+-----------+-------------+---------+--------------------------------------------------------------------------------+---------------+----------+---------------+-
1 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 1 | 12345 | 1521807257 |
3 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 3 | 12345 | 1521807257 |
2 | 8BUI | | t | /home/pele/devel/geo/postgis-git/raster/test/regress/loader/Projected.tif | 2 | 12345 | 1521807257 |
</programlisting>
</refsection>
......@@ -3819,9 +3822,9 @@ FROM (
WHERE rid=2
) As foo;
rid | pixeltype | nodatavalue | isoutdb | path | outdbbandnum
-----+-----------+---- --------+---------+------+--------------
2 | 8BUI | 0 | f | |
rid | pixeltype | nodatavalue | isoutdb | path | outdbbandnum | filesize | filetimestamp |
-----+-----------+---- --------+---------+------+---------------+----------+---------------+-
2 | 8BUI | 0 | f | | | | |
</programlisting>
</refsection>
......@@ -4022,6 +4025,86 @@ select st_bandisnodata(rast, 2) from dummy_rast where rid = 1; -- Expected false
</refsection>
</refentry>
<refentry id="RT_ST_BandFileSize">
<refnamediv>
<refname>ST_BandFileSize</refname>
<refpurpose>Returns the file size of a band stored in file system. If no bandnum specified, 1 is assumed.</refpurpose>
</refnamediv>
<refsynopsisdiv>
<funcsynopsis>
<funcprototype>
<funcdef>bigint <function>ST_BandFileSize</function></funcdef>
<paramdef><type>raster </type> <parameter>rast</parameter></paramdef>
<paramdef choice="opt"><type>integer </type> <parameter>bandnum=1</parameter></paramdef>
</funcprototype>
</funcsynopsis>
</refsynopsisdiv>
<refsection>
<title>Description</title>
<para>Returns the file size of a band stored in file system. Throws an error if called with an in db band, or if outdb access is not enabled.</para>
<para>This function is typically used in conjunction with ST_BandPath() and ST_BandFileTimestamp() so a client can determine if the filename of a outdb raster as seen by it is the same as the one seen by the server.</para>
<para>Availability: 2.5.0</para>
</refsection>
<refsection>
<title>Examples</title>
<programlisting>SELECT ST_BandFileSize(rast,1) FROM dummy_rast WHERE rid = 1;
st_bandfilesize
-----------------
240574
</programlisting>
</refsection>
</refentry>
<refentry id="RT_ST_BandFileTimestamp">
<refnamediv>
<refname>ST_BandFileTimestamp</refname>
<refpurpose>Returns the file timestamp of a band stored in file system. If no bandnum specified, 1 is assumed.</refpurpose>
</refnamediv>
<refsynopsisdiv>
<funcsynopsis>
<funcprototype>
<funcdef>bigint <function>ST_BandFileTimestamp</function></funcdef>
<paramdef><type>raster </type> <parameter>rast</parameter></paramdef>
<paramdef choice="opt"><type>integer </type> <parameter>bandnum=1</parameter></paramdef>
</funcprototype>
</funcsynopsis>
</refsynopsisdiv>
<refsection>
<title>Description</title>
<para>Returns the file timestamp (number of seconds since Jan 1st 1970 00:00:00 UTC) of a band stored in file system. Throws an error if called with an in db band, or if outdb access is not enabled.</para>
<para>This function is typically used in conjunction with ST_BandPath() and ST_BandFileSize() so a client can determine if the filename of a outdb raster as seen by it is the same as the one seen by the server.</para>
<para>Availability: 2.5.0</para>
</refsection>
<refsection>
<title>Examples</title>
<programlisting>SELECT ST_BandFileTimestamp(rast,1) FROM dummy_rast WHERE rid = 1;
st_bandfiletimestamp
----------------------
1521807257
</programlisting>
</refsection>
</refentry>
<refentry id="RT_ST_BandPixelType">
<refnamediv>
<refname>ST_BandPixelType</refname>
......
......@@ -512,6 +512,26 @@ int rt_band_is_offline(rt_band band);
*/
const char* rt_band_get_ext_path(rt_band band);
/**
* Return file size in bytes.
*
* Only for out-db rasters.
*
* @param band : the band
* @return file size in bytes or 0 in case of error.
*/
uint64_t rt_band_get_file_size(rt_band band);
/**
* Return file timestamp.
*
* Only for out-db rasters.
*
* @param band : the band
* @return file timestamp (Unix time) or 0 in case of error.
*/
uint64_t rt_band_get_file_timestamp(rt_band band);
/**
* Return bands' external band number (only valid when
* rt_band_is_offline returns non-zero).
......
......@@ -28,11 +28,15 @@
*
*/
// For stat64()
#define _LARGEFILE64_SOURCE 1
#include <stdio.h>
#include "librtcore.h"
#include "librtcore_internal.h"
#include "cpl_vsi.h"
#include "gdal_vrt.h"
/**
......@@ -579,6 +583,50 @@ rt_band_load_offline_data(rt_band band) {
return ES_NONE;
}
uint64_t rt_band_get_file_size(rt_band band) {
VSIStatBufL sStat;
assert(NULL != band);
if (!band->offline) {
rterror("rt_band_get_file_size: Band is not offline");
return 0;
}
/* offline_data is disabled */
if (!enable_outdb_rasters) {
rterror("rt_band_get_file_size: Access to offline bands disabled");
return 0;
}
if( VSIStatL(band->data.offline.path, &sStat) != 0 ) {
rterror("rt_band_get_file_size: Cannot access file");
return 0;
}
return sStat.st_size;
}
uint64_t rt_band_get_file_timestamp(rt_band band) {
VSIStatBufL sStat;
assert(NULL != band);
if (!band->offline) {
rterror("rt_band_get_file_timestamp: Band is not offline");
return 0;
}
/* offline_data is disabled */
if (!enable_outdb_rasters) {
rterror("rt_band_get_file_timestamp: Access to offline bands disabled");
return 0;
}
if( VSIStatL(band->data.offline.path, &sStat) != 0 ) {
rterror("rt_band_get_file_timestamp: Cannot access file");
return 0;
}
return sStat.st_mtime;
}
rt_pixtype
rt_band_get_pixtype(rt_band band) {
......
......@@ -27,6 +27,9 @@
*
*/
// For stat64()
#define _LARGEFILE64_SOURCE 1
#include <postgres.h>
#include <fmgr.h>
#include <funcapi.h>
......@@ -43,6 +46,8 @@
#include "rtpostgis.h"
extern char enable_outdb_rasters;
/* Get all the properties of a raster band */
Datum RASTER_getBandPixelType(PG_FUNCTION_ARGS);
Datum RASTER_getBandPixelTypeName(PG_FUNCTION_ARGS);
......@@ -340,6 +345,125 @@ Datum RASTER_getBandPath(PG_FUNCTION_ARGS)
PG_RETURN_TEXT_P(result);
}
/**
* Return the file size of the raster.
*/
PG_FUNCTION_INFO_V1(RASTER_getBandFileSize);
Datum RASTER_getBandFileSize(PG_FUNCTION_ARGS)
{
rt_pgraster *pgraster;
rt_raster raster;
rt_band band = NULL;
int64_t fileSize;
int32_t bandindex;
/* Index is 1-based */
bandindex = PG_GETARG_INT32(1);
if ( bandindex < 1 ) {
elog(NOTICE, "Invalid band index (must use 1-based). Returning NULL");
PG_RETURN_NULL();
}
if (PG_ARGISNULL(0)) PG_RETURN_NULL();
pgraster = (rt_pgraster *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
raster = rt_raster_deserialize(pgraster, FALSE);
if ( ! raster ) {
PG_FREE_IF_COPY(pgraster, 0);
elog(ERROR, "RASTER_getFileSize: Could not deserialize raster");
PG_RETURN_NULL();
}
/* Fetch requested band */
band = rt_raster_get_band(raster, bandindex - 1);
if (!band) {
elog(
NOTICE,
"Could not find raster band of index %d when getting band path. Returning NULL",
bandindex
);
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_NULL();
}
if (!rt_band_is_offline(band)) {
elog(NOTICE, "Band of index %d is not out-db.", bandindex);
rt_band_destroy(band);
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_NULL();
}
fileSize = rt_band_get_file_size(band);
rt_band_destroy(band);
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_INT64(fileSize);
}
/**
* Return the file timestamp of the raster.
*/
PG_FUNCTION_INFO_V1(RASTER_getBandFileTimestamp);
Datum RASTER_getBandFileTimestamp(PG_FUNCTION_ARGS)
{
rt_pgraster *pgraster;
rt_raster raster;
rt_band band = NULL;
int64_t fileSize;
int32_t bandindex;
/* Index is 1-based */
bandindex = PG_GETARG_INT32(1);
if ( bandindex < 1 ) {
elog(NOTICE, "Invalid band index (must use 1-based). Returning NULL");
PG_RETURN_NULL();
}
if (PG_ARGISNULL(0)) PG_RETURN_NULL();
pgraster = (rt_pgraster *)PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
raster = rt_raster_deserialize(pgraster, FALSE);
if ( ! raster ) {
PG_FREE_IF_COPY(pgraster, 0);
elog(ERROR, "RASTER_getBandFileTimestamp: Could not deserialize raster");
PG_RETURN_NULL();
}
/* Fetch requested band */
band = rt_raster_get_band(raster, bandindex - 1);
if (!band) {
elog(
NOTICE,
"Could not find raster band of index %d when getting band path. Returning NULL",
bandindex
);
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_NULL();
}
if (!rt_band_is_offline(band)) {
elog(NOTICE, "Band of index %d is not out-db.", bandindex);
rt_band_destroy(band);
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_NULL();
}
fileSize = rt_band_get_file_timestamp(band);
rt_band_destroy(band);
rt_raster_destroy(raster);
PG_FREE_IF_COPY(pgraster, 0);
PG_RETURN_INT64(fileSize);
}
/**
* Get raster bands' meta data
*/
......@@ -359,6 +483,8 @@ Datum RASTER_bandmetadata(PG_FUNCTION_ARGS)
bool isoutdb;
char *bandpath;
uint8_t extbandnum;
uint64_t filesize;
uint64_t timestamp;
};
struct bandmetadata *bmd = NULL;
struct bandmetadata *bmd2 = NULL;
......@@ -535,6 +661,16 @@ Datum RASTER_bandmetadata(PG_FUNCTION_ARGS)
else
bmd[i].extbandnum = 0;
bmd[i].filesize = 0;
bmd[i].timestamp = 0;
if( bmd[i].bandpath && enable_outdb_rasters ) {
VSIStatBufL sStat;
if( VSIStatL(bmd[i].bandpath, &sStat) == 0 ) {
bmd[i].filesize = sStat.st_size;
bmd[i].timestamp = sStat.st_mtime;
}
}
rt_band_destroy(band);
}
......@@ -575,7 +711,7 @@ Datum RASTER_bandmetadata(PG_FUNCTION_ARGS)
/* do when there is more left to send */
if (call_cntr < max_calls) {
int values_length = 6;
int values_length = 8;
Datum values[values_length];
bool nulls[values_length];
......@@ -599,6 +735,15 @@ Datum RASTER_bandmetadata(PG_FUNCTION_ARGS)
nulls[5] = TRUE;
}
if (bmd2[call_cntr].filesize) {
values[6] = UInt64GetDatum(bmd2[call_cntr].filesize);
values[7] = UInt64GetDatum(bmd2[call_cntr].timestamp);
}
else {
nulls[6] = TRUE;
nulls[7] = TRUE;
}
/* build a tuple */
tuple = heap_form_tuple(tupdesc, values, nulls);
......
......@@ -44,6 +44,8 @@ Datum RASTER_getSRID(PG_FUNCTION_ARGS);
Datum RASTER_getWidth(PG_FUNCTION_ARGS);
Datum RASTER_getHeight(PG_FUNCTION_ARGS);
Datum RASTER_getNumBands(PG_FUNCTION_ARGS);
Datum RASTER_getFileSize(PG_FUNCTION_ARGS);
Datum RASTER_getFileTimestamp(PG_FUNCTION_ARGS);
Datum RASTER_getXScale(PG_FUNCTION_ARGS);
Datum RASTER_getYScale(PG_FUNCTION_ARGS);
Datum RASTER_getXSkew(PG_FUNCTION_ARGS);
......
......@@ -4989,7 +4989,9 @@ CREATE OR REPLACE FUNCTION ST_BandMetaData(
OUT nodatavalue double precision,
OUT isoutdb boolean,
OUT path text,
OUT outdbbandnum integer
OUT outdbbandnum integer,
OUT filesize bigint,
OUT filetimestamp bigint
)
AS 'MODULE_PATHNAME','RASTER_bandmetadata'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
......@@ -5001,11 +5003,27 @@ CREATE OR REPLACE FUNCTION ST_BandMetaData(
OUT nodatavalue double precision,
OUT isoutdb boolean,
OUT path text,
OUT outdbbandnum integer
OUT outdbbandnum integer,
OUT filesize bigint,
OUT filetimestamp bigint
)
AS $$ SELECT pixeltype, nodatavalue, isoutdb, path, outdbbandnum FROM @extschema@.ST_BandMetaData($1, ARRAY[$2]::int[]) LIMIT 1 $$
AS $$ SELECT pixeltype, nodatavalue, isoutdb, path, outdbbandnum, filesize, filetimestamp FROM @extschema@.ST_BandMetaData($1, ARRAY[$2]::int[]) LIMIT 1 $$
LANGUAGE 'sql' IMMUTABLE STRICT _PARALLEL;
-- Availability: 2.5.0
CREATE OR REPLACE FUNCTION ST_BandFileSize(rast raster, band integer DEFAULT 1)
RETURNS bigint
AS 'MODULE_PATHNAME','RASTER_getBandFileSize'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-- Availability: 2.5.0
CREATE OR REPLACE FUNCTION St_BandFileTimestamp(rast raster, band integer DEFAULT 1)
RETURNS bigint
AS 'MODULE_PATHNAME','RASTER_getBandFileTimestamp'
LANGUAGE 'c' IMMUTABLE STRICT _PARALLEL;
-----------------------------------------------------------------------
-- Raster Pixel Accessors
-----------------------------------------------------------------------
......
......@@ -54,6 +54,9 @@ static void test_band_metadata() {
/* isoffline */
CU_ASSERT(!rt_band_is_offline(band));
CU_ASSERT_EQUAL(rt_band_get_file_size(band), 0);
CU_ASSERT_EQUAL(rt_band_get_file_timestamp(band), 0);
/* data */
CU_ASSERT(rt_band_get_data(band) != NULL);
......@@ -118,6 +121,9 @@ static void test_band_metadata() {
/* ext path */
CU_ASSERT_STRING_EQUAL(rt_band_get_ext_path(band), path);
CU_ASSERT_EQUAL(rt_band_get_file_size(band), 13674);
CU_ASSERT_NOT_EQUAL(rt_band_get_file_timestamp(band), 0);
/* ext band number */
CU_ASSERT_EQUAL(rt_band_get_ext_band_num(band, &extband), ES_NONE);
CU_ASSERT_EQUAL(extband, 2);
......
SELECT count(*) FROM raster_outdb_template;
SELECT DISTINCT ST_BandFileSize(rast) FROM raster_outdb_template;
SELECT DISTINCT ST_BandFileTimestamp(rast) FROM raster_outdb_template;
SET postgis.enable_outdb_rasters = true;
SELECT DISTINCT ST_BandFileSize(rast) FROM raster_outdb_template;
SELECT DISTINCT ST_BandFileTimestamp(rast) != 0 FROM raster_outdb_template;
-- error cases
SELECT ST_BandFileSize(''::raster);
SELECT ST_BandFileTimestamp(''::raster);
SELECT ST_BandFileSize(rast,-1) FROM raster_outdb_template WHERE rid = 1;
SELECT ST_BandFileTimestamp(rast,-1) FROM raster_outdb_template WHERE rid = 1;
SELECT ST_BandFileSize(rast,10) FROM raster_outdb_template WHERE rid = 1;
SELECT ST_BandFileTimestamp(rast,10) FROM raster_outdb_template WHERE rid = 1;
-- valid raster, but file does not exist
SELECT ST_BandFileSize('0100000100000000000000F03F000000000000F0BF0000000000000000000000000000000000000000000000000000000000000000000000005A003200840000DEADBEEF00'::raster);
SELECT ST_BandFileTimestamp('0100000100000000000000F03F000000000000F0BF0000000000000000000000000000000000000000000000000000000000000000000000005A003200840000DEADBEEF00'::raster);
4
ERROR: rt_band_get_file_size: Access to offline bands disabled
ERROR: rt_band_get_file_timestamp: Access to offline bands disabled
NOTICE: Band of index 1 is not out-db.
13674
NOTICE: Band of index 1 is not out-db.
t
ERROR: rt_raster_from_wkb: wkb size (0) < min size (61) at character 24
ERROR: rt_raster_from_wkb: wkb size (0) < min size (61) at character 29
NOTICE: Invalid band index (must use 1-based). Returning NULL
NOTICE: Invalid band index (must use 1-based). Returning NULL
NOTICE: Could not find raster band of index 10 when getting band path. Returning NULL
NOTICE: Could not find raster band of index 10 when getting band path. Returning NULL
ERROR: rt_band_get_file_size: Cannot access file
ERROR: rt_band_get_file_timestamp: Cannot access file
......@@ -90,23 +90,23 @@ NOTICE: rt_raster_copy_band: Second raster has no band
NOTICE: RASTER_copyBand: Could not add band to raster. Returning original raster.
1234.5678
1234.567|255
1|4BUI|0|f||
2|8BUI|0|f||
3|16BUI|0|f||
4|32BUI|0|f||
5|64BF|0|f||
1|2BUI|0|f||
2|4BUI|0|f||
3|8BUI|0|f||
4|16BUI|0|f||
5|32BUI|0|f||
6|64BF|0|f||
1|4BUI|0|f||
2|8BUI|0|f||
3|16BUI|0|f||
4|32BUI|0|f||
5|64BF|0|f||
6|2BUI|0|f||
1|4BUI|0|f||||
2|8BUI|0|f||||
3|16BUI|0|f||||
4|32BUI|0|f||||
5|64BF|0|f||||
1|2BUI|0|f||||
2|4BUI|0|f||||
3|8BUI|0|f||||
4|16BUI|0|f||||
5|32BUI|0|f||||
6|64BF|0|f||||
1|4BUI|0|f||||
2|8BUI|0|f||||
3|16BUI|0|f||||
4|32BUI|0|f||||
5|64BF|0|f||||
6|2BUI|0|f||||
90
1|1|t|t
1|2|t|t
......
......@@ -84,8 +84,8 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{200,200,NULL},{200,200,NULL},{NULL,NULL,NULL}}}
NOTICE: pos = [0:1][1:2]={{2,2},{2,2}}
NOTICE: userargs = <NULL>
3|(0,0,0,0,1,-1,0,0,0,0)|(,,,,)|
4|(1,-1,2,2,1,-1,0,0,0,1)|(8BUI,0,f,,)|255
3|(0,0,0,0,1,-1,0,0,0,0)|(,,,,,,)|
4|(1,-1,2,2,1,-1,0,0,0,1)|(8BUI,0,f,,,,)|255
NOTICE: value = {{{NULL,NULL,NULL},{NULL,1,1},{NULL,1,1}}}
NOTICE: pos = [0:1][1:2]={{1,1},{1,1}}
NOTICE: userargs = <NULL>
......@@ -98,7 +98,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{1,1,2},{1,1,2},{10,10,20}}}
NOTICE: pos = [0:1][1:2]={{2,2},{2,2}}
NOTICE: userargs = <NULL>
NOTICE: record = (10,"(0,0,2,2,1,-1,0,0,0,1)","(32BUI,0,f,,)",255)
NOTICE: record = (10,"(0,0,2,2,1,-1,0,0,0,1)","(32BUI,0,f,,,,)",255)
NOTICE: value = {{{1,2,2},{10,20,20},{10,20,20}}}
NOTICE: pos = [0:1][1:2]={{1,1},{3,3}}
NOTICE: userargs = <NULL>
......@@ -111,7 +111,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{20,20,30},{20,20,30},{200,200,300}}}
NOTICE: pos = [0:1][1:2]={{2,2},{4,4}}
NOTICE: userargs = <NULL>
NOTICE: record = (14,"(2,-2,2,2,1,-1,0,0,0,1)","(32BUI,0,f,,)",255)
NOTICE: record = (14,"(2,-2,2,2,1,-1,0,0,0,1)","(32BUI,0,f,,,,)",255)
NOTICE: value = {{{10,20,20},{100,200,200},{100,200,200}}}
NOTICE: pos = [0:1][1:2]={{1,1},{3,3}}
NOTICE: userargs = {1000}
......@@ -124,17 +124,17 @@ NOTICE: userargs = {1000}
NOTICE: value = {{{200,200,300},{200,200,300},{NULL,NULL,NULL}}}
NOTICE: pos = [0:1][1:2]={{2,2},{4,4}}
NOTICE: userargs = {1000}
NOTICE: record = (17,"(2,-4,2,2,1,-1,0,0,0,1)","(32BUI,0,f,,)",1000)
NOTICE: record = (17,"(2,-4,2,2,1,-1,0,0,0,1)","(32BUI,0,f,,,,)",1000)
NOTICE: value = {{{1}},{{2}}}
NOTICE: pos = [0:2][1:2]={{1,1},{2,2},{1,1}}
NOTICE: userargs = <NULL>
20|21|(1,-1,1,1,1,-1,0,0,0,1)|(16BUI,0,f,,)
20|21|(1,-1,1,1,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: Raster provided has no bands
20|22|(0,0,0,0,0,0,0,0,0,0)|(,,,,)
20|22|(0,0,0,0,0,0,0,0,0,0)|(,,,,,,)
NOTICE: value = {{{2}},{{3}}}
NOTICE: pos = [0:2][1:2]={{1,1},{1,2},{2,1}}
NOTICE: userargs = <NULL>
21|22|(1,-2,1,1,1,-1,0,0,0,1)|(16BUI,0,f,,)
21|22|(1,-2,1,1,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{1}},{{NULL}}}
NOTICE: pos = [0:2][1:2]={{1,1},{1,1},{0,0}}
NOTICE: userargs = <NULL>
......@@ -162,7 +162,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{NULL}},{{2}}}
NOTICE: pos = [0:2][1:2]={{3,3},{3,3},{2,2}}
NOTICE: userargs = <NULL>
20|21|(0,0,3,3,1,-1,0,0,0,1)|(16BUI,0,f,,)
20|21|(0,0,3,3,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{1}},{{NULL}}}
NOTICE: pos = [0:2][1:2]={{1,1},{1,1},{1,-1}}
NOTICE: userargs = <NULL>
......@@ -187,7 +187,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{NULL}},{{3}}}
NOTICE: pos = [0:2][1:2]={{2,4},{2,4},{2,2}}
NOTICE: userargs = <NULL>
20|22|(0,0,2,4,1,-1,0,0,0,1)|(16BUI,0,f,,)
20|22|(0,0,2,4,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{1}},{{NULL}},{{NULL}}}
NOTICE: pos = [0:3][1:2]={{1,1},{1,1},{0,0},{1,-1}}
NOTICE: userargs = <NULL>
......@@ -224,7 +224,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{NULL}},{{NULL}},{{NULL}}}
NOTICE: pos = [0:3][1:2]={{3,4},{3,4},{2,3},{3,2}}
NOTICE: userargs = <NULL>
20|21|22|(0,0,3,4,1,-1,0,0,0,1)|(16BUI,0,f,,)
20|21|22|(0,0,3,4,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{1}},{{NULL}},{{NULL}}}
NOTICE: pos = [0:3][1:2]={{1,1},{1,1},{0,0},{1,-1}}
NOTICE: userargs = <NULL>
......@@ -237,7 +237,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{1}},{{2}},{{NULL}}}
NOTICE: pos = [0:3][1:2]={{2,2},{2,2},{1,1},{2,0}}
NOTICE: userargs = <NULL>
20|21|22|(0,0,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,)
20|21|22|(0,0,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{1}},{{2}},{{NULL}}}
NOTICE: pos = [0:3][1:2]={{1,1},{2,2},{1,1},{2,0}}
NOTICE: userargs = <NULL>
......@@ -250,7 +250,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{NULL}},{{2}},{{NULL}}}
NOTICE: pos = [0:3][1:2]={{2,2},{3,3},{2,2},{3,1}}
NOTICE: userargs = <NULL>
20|21|22|(1,-1,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,)
20|21|22|(1,-1,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{NULL}},{{NULL}},{{3}}}
NOTICE: pos = [0:3][1:2]={{1,1},{1,3},{0,2},{1,1}}
NOTICE: userargs = <NULL>
......@@ -263,9 +263,9 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{NULL}},{{NULL}},{{3}}}
NOTICE: pos = [0:3][1:2]={{2,2},{2,4},{1,3},{2,2}}
NOTICE: userargs = <NULL>
20|21|22|(0,-2,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,)
20|21|22|(0,-2,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: Raster provided has no bands
20|21|22|(0,0,0,0,0,0,0,0,0,0)|(,,,,)
20|21|22|(0,0,0,0,0,0,0,0,0,0)|(,,,,,,)
NOTICE: value = {{{1}},{{10}},{{100}}}
NOTICE: pos = [0:3][1:2]={{1,1},{1,1},{1,1},{1,1}}
NOTICE: userargs = <NULL>
......@@ -278,7 +278,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{1}},{{10}},{{100}}}
NOTICE: pos = [0:3][1:2]={{2,2},{2,2},{2,2},{2,2}}
NOTICE: userargs = <NULL>
30|(0,0,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,)
30|(0,0,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{100}},{{1}},{{100}}}
NOTICE: pos = [0:3][1:2]={{1,1},{1,1},{1,1},{1,1}}
NOTICE: userargs = <NULL>
......@@ -291,7 +291,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{100}},{{1}},{{100}}}
NOTICE: pos = [0:3][1:2]={{2,2},{2,2},{2,2},{2,2}}
NOTICE: userargs = <NULL>
30|(0,0,2,2,1,-1,0,0,0,1)|(32BUI,0,f,,)
30|(0,0,2,2,1,-1,0,0,0,1)|(32BUI,0,f,,,,)
NOTICE: value = {{{20}},{{20}}}
NOTICE: pos = [0:2][1:2]={{1,1},{1,1},{1,1}}
NOTICE: userargs = <NULL>
......@@ -304,14 +304,14 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{20}},{{20}}}
NOTICE: pos = [0:2][1:2]={{2,2},{2,2},{2,2}}
NOTICE: userargs = <NULL>
31|(0,1,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,)
31|(0,1,2,2,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{10}},{{2}},{{20}}}
NOTICE: pos = [0:3][1:2]={{1,1},{1,1},{1,2},{1,2}}
NOTICE: userargs = <NULL>
NOTICE: value = {{{10}},{{2}},{{20}}}
NOTICE: pos = [0:3][1:2]={{2,1},{2,1},{2,2},{2,2}}
NOTICE: userargs = <NULL>
30|31|(0,0,2,1,1,-1,0,0,0,1)|(16BUI,0,f,,)
30|31|(0,0,2,1,1,-1,0,0,0,1)|(16BUI,0,f,,,,)
NOTICE: value = {{{100}},{{1}},{{100}}}
NOTICE: pos = [0:3][1:2]={{1,1},{1,1},{1,1},{1,1}}
NOTICE: userargs = <NULL>
......@@ -324,7 +324,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{100}},{{1}},{{100}}}
NOTICE: pos = [0:3][1:2]={{2,2},{2,2},{2,2},{2,2}}
NOTICE: userargs = <NULL>
30|(0,0,2,2,1,-1,0,0,0,1)|(32BUI,0,f,,)
30|(0,0,2,2,1,-1,0,0,0,1)|(32BUI,0,f,,,,)
NOTICE: value = {{{10}}}
NOTICE: pos = [0:1][1:2]={{1,1},{1,1}}
NOTICE: userargs = <NULL>
......@@ -337,7 +337,7 @@ NOTICE: userargs = <NULL>
NOTICE: value = {{{10}}}
NOTICE: pos = [0:1][1:2]={{2,2},{2,2}}
NOTICE: userargs = <NULL>
30|(0,0,2,2,1,-1,0,0,0,1)|(8BUI,0,f,,)
30|(0,0,2,2,1,-1,0,0,0,1)|(8BUI,0,f,,,,)
NOTICE: value = {{{1}}}
NOTICE: pos = [0:1][1:2]={{1,1},{1,1}}
NOTICE: userargs = {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment