mirror of
https://git.osgeo.org/gitea/postgis/postgis
synced 2024-10-23 16:42:35 +00:00
added ST_SummaryStatsAgg(). Ticket #2565
git-svn-id: http://svn.osgeo.org/postgis/trunk@12159 b70326c6-7e19-0410-871a-916f4a2858ee
This commit is contained in:
parent
82f5e88927
commit
acb238da0e
4
NEWS
4
NEWS
|
@ -3,6 +3,9 @@ PostGIS 2.2.0
|
||||||
|
|
||||||
* Important / Breaking Changes *
|
* Important / Breaking Changes *
|
||||||
|
|
||||||
|
- #2565, ST_SummaryStats(tablename, rastercolumn, ...) uses
|
||||||
|
ST_SummaryStatsAgg()
|
||||||
|
|
||||||
* Deprecated signatures *
|
* Deprecated signatures *
|
||||||
|
|
||||||
* New Features *
|
* New Features *
|
||||||
|
@ -12,6 +15,7 @@ PostGIS 2.2.0
|
||||||
- #1678, Added GUC postgis.gdal.datapath to specify GDAL config
|
- #1678, Added GUC postgis.gdal.datapath to specify GDAL config
|
||||||
variable GDAL_DATA
|
variable GDAL_DATA
|
||||||
- #2397, read encoding info automatically in shapefile loader
|
- #2397, read encoding info automatically in shapefile loader
|
||||||
|
- #2565, ST_SummaryStatsAgg()
|
||||||
|
|
||||||
* Enhancements *
|
* Enhancements *
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
* WKTRaster - Raster Types for PostGIS
|
* WKTRaster - Raster Types for PostGIS
|
||||||
* http://www.postgis.org/support/wiki/index.php?WKTRasterHomePage
|
* http://www.postgis.org/support/wiki/index.php?WKTRasterHomePage
|
||||||
*
|
*
|
||||||
|
* Copyright (C) 2013 Bborie Park <dustymugs@gmail.com>
|
||||||
* Copyright (C) 2011-2013 Regents of the University of California
|
* Copyright (C) 2011-2013 Regents of the University of California
|
||||||
* <bkpark@ucdavis.edu>
|
* <bkpark@ucdavis.edu>
|
||||||
* Copyright (C) 2010-2011 Jorge Arevalo <jorge.arevalo@deimos-space.com>
|
* Copyright (C) 2010-2011 Jorge Arevalo <jorge.arevalo@deimos-space.com>
|
||||||
|
@ -49,6 +50,9 @@
|
||||||
Datum RASTER_summaryStats(PG_FUNCTION_ARGS);
|
Datum RASTER_summaryStats(PG_FUNCTION_ARGS);
|
||||||
Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS);
|
Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
|
Datum RASTER_summaryStats_transfn(PG_FUNCTION_ARGS);
|
||||||
|
Datum RASTER_summaryStats_finalfn(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
/* get histogram */
|
/* get histogram */
|
||||||
Datum RASTER_histogram(PG_FUNCTION_ARGS);
|
Datum RASTER_histogram(PG_FUNCTION_ARGS);
|
||||||
Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS);
|
Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS);
|
||||||
|
@ -91,7 +95,7 @@ Datum RASTER_summaryStats(PG_FUNCTION_ARGS)
|
||||||
raster = rt_raster_deserialize(pgraster, FALSE);
|
raster = rt_raster_deserialize(pgraster, FALSE);
|
||||||
if (!raster) {
|
if (!raster) {
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
elog(ERROR, "RASTER_summaryStats: Could not deserialize raster");
|
elog(ERROR, "RASTER_summaryStats: Cannot deserialize raster");
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +132,7 @@ Datum RASTER_summaryStats(PG_FUNCTION_ARGS)
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find band at index %d. Returning NULL", bandindex);
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
|
@ -140,7 +144,7 @@ Datum RASTER_summaryStats(PG_FUNCTION_ARGS)
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
if (NULL == stats) {
|
if (NULL == stats) {
|
||||||
elog(NOTICE, "Could not compute summary statistics for band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot compute summary statistics for band at index %d. Returning NULL", bandindex);
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,7 +281,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
spi_result = SPI_connect();
|
spi_result = SPI_connect();
|
||||||
if (spi_result != SPI_OK_CONNECT) {
|
if (spi_result != SPI_OK_CONNECT) {
|
||||||
pfree(sql);
|
pfree(sql);
|
||||||
elog(ERROR, "RASTER_summaryStatsCoverage: Could not connect to database using SPI");
|
elog(ERROR, "RASTER_summaryStatsCoverage: Cannot connect to database using SPI");
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -287,7 +291,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
if (NULL == sql) {
|
if (NULL == sql) {
|
||||||
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
elog(ERROR, "RASTER_summaryStatsCoverage: Could not allocate memory for sql");
|
elog(ERROR, "RASTER_summaryStatsCoverage: Cannot allocate memory for sql");
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,7 +321,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
if (NULL != rtn) pfree(rtn);
|
if (NULL != rtn) pfree(rtn);
|
||||||
elog(ERROR, "RASTER_summaryStatsCoverage: Could not get raster of coverage");
|
elog(ERROR, "RASTER_summaryStatsCoverage: Cannot get raster of coverage");
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
else if (isNull) {
|
else if (isNull) {
|
||||||
|
@ -335,7 +339,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
if (NULL != rtn) pfree(rtn);
|
if (NULL != rtn) pfree(rtn);
|
||||||
elog(ERROR, "RASTER_summaryStatsCoverage: Could not deserialize raster");
|
elog(ERROR, "RASTER_summaryStatsCoverage: Cannot deserialize raster");
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -357,7 +361,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find band at index %d. Returning NULL", bandindex);
|
||||||
|
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
|
|
||||||
|
@ -376,7 +380,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
|
|
||||||
if (NULL == stats) {
|
if (NULL == stats) {
|
||||||
elog(NOTICE, "Could not compute summary statistics for band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot compute summary statistics for band at index %d. Returning NULL", bandindex);
|
||||||
|
|
||||||
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
||||||
SPI_cursor_close(portal);
|
SPI_cursor_close(portal);
|
||||||
|
@ -396,7 +400,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_cursor_close(portal);
|
SPI_cursor_close(portal);
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
elog(ERROR, "RASTER_summaryStatsCoverage: Could not allocate memory for summary stats of coverage");
|
elog(ERROR, "RASTER_summaryStatsCoverage: Cannot allocate memory for summary stats of coverage");
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,7 +437,7 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
if (NULL == rtn) {
|
if (NULL == rtn) {
|
||||||
elog(ERROR, "RASTER_summaryStatsCoverage: Could not compute coverage summary stats");
|
elog(ERROR, "RASTER_summaryStatsCoverage: Cannot compute coverage summary stats");
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,6 +493,426 @@ Datum RASTER_summaryStatsCoverage(PG_FUNCTION_ARGS)
|
||||||
PG_RETURN_DATUM(result);
|
PG_RETURN_DATUM(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* Aggregate ST_SummaryStats */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
|
typedef struct rtpg_summarystats_arg_t *rtpg_summarystats_arg;
|
||||||
|
struct rtpg_summarystats_arg_t {
|
||||||
|
rt_bandstats stats;
|
||||||
|
|
||||||
|
/* coefficients for one-pass standard deviation */
|
||||||
|
uint64_t cK;
|
||||||
|
double cM;
|
||||||
|
double cQ;
|
||||||
|
|
||||||
|
int32_t band_index; /* one-based */
|
||||||
|
bool exclude_nodata_value;
|
||||||
|
double sample; /* value between 0 and 1 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
rtpg_summarystats_arg_destroy(rtpg_summarystats_arg arg) {
|
||||||
|
if (arg->stats != NULL)
|
||||||
|
pfree(arg->stats);
|
||||||
|
|
||||||
|
pfree(arg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static rtpg_summarystats_arg
|
||||||
|
rtpg_summarystats_arg_init() {
|
||||||
|
rtpg_summarystats_arg arg = NULL;
|
||||||
|
|
||||||
|
arg = palloc(sizeof(struct rtpg_summarystats_arg_t));
|
||||||
|
if (arg == NULL) {
|
||||||
|
elog(
|
||||||
|
ERROR,
|
||||||
|
"rtpg_summarystats_arg_init: Cannot allocate memory for function arguments"
|
||||||
|
);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
arg->stats = (rt_bandstats) palloc(sizeof(struct rt_bandstats_t));
|
||||||
|
if (arg->stats == NULL) {
|
||||||
|
rtpg_summarystats_arg_destroy(arg);
|
||||||
|
elog(
|
||||||
|
ERROR,
|
||||||
|
"rtpg_summarystats_arg_init: Cannot allocate memory for stats function argument"
|
||||||
|
);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
arg->stats->sample = 0;
|
||||||
|
arg->stats->count = 0;
|
||||||
|
arg->stats->min = 0;
|
||||||
|
arg->stats->max = 0;
|
||||||
|
arg->stats->sum = 0;
|
||||||
|
arg->stats->mean = 0;
|
||||||
|
arg->stats->stddev = -1;
|
||||||
|
arg->stats->values = NULL;
|
||||||
|
arg->stats->sorted = 0;
|
||||||
|
|
||||||
|
arg->cK = 0;
|
||||||
|
arg->cM = 0;
|
||||||
|
arg->cQ = 0;
|
||||||
|
|
||||||
|
arg->band_index = 1;
|
||||||
|
arg->exclude_nodata_value = TRUE;
|
||||||
|
arg->sample = 1;
|
||||||
|
|
||||||
|
return arg;
|
||||||
|
}
|
||||||
|
|
||||||
|
PG_FUNCTION_INFO_V1(RASTER_summaryStats_transfn);
|
||||||
|
Datum RASTER_summaryStats_transfn(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
MemoryContext aggcontext;
|
||||||
|
MemoryContext oldcontext;
|
||||||
|
rtpg_summarystats_arg state = NULL;
|
||||||
|
bool skiparg = FALSE;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
rt_pgraster *pgraster = NULL;
|
||||||
|
rt_raster raster = NULL;
|
||||||
|
rt_band band = NULL;
|
||||||
|
int num_bands = 0;
|
||||||
|
rt_bandstats stats = NULL;
|
||||||
|
|
||||||
|
POSTGIS_RT_DEBUG(3, "Starting...");
|
||||||
|
|
||||||
|
/* cannot be called directly as this is exclusive aggregate function */
|
||||||
|
if (!AggCheckCallContext(fcinfo, &aggcontext)) {
|
||||||
|
elog(
|
||||||
|
ERROR,
|
||||||
|
"RASTER_summaryStats_transfn: Cannot be called in a non-aggregate context"
|
||||||
|
);
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* switch to aggcontext */
|
||||||
|
oldcontext = MemoryContextSwitchTo(aggcontext);
|
||||||
|
|
||||||
|
if (PG_ARGISNULL(0)) {
|
||||||
|
POSTGIS_RT_DEBUG(3, "Creating state variable");
|
||||||
|
|
||||||
|
state = rtpg_summarystats_arg_init();
|
||||||
|
if (state == NULL) {
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
elog(
|
||||||
|
ERROR,
|
||||||
|
"RASTER_summaryStats_transfn: Cannot allocate memory for state variable"
|
||||||
|
);
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
skiparg = FALSE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
POSTGIS_RT_DEBUG(3, "State variable already exists");
|
||||||
|
state = (rtpg_summarystats_arg) PG_GETARG_POINTER(0);
|
||||||
|
skiparg = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* raster arg is NOT NULL */
|
||||||
|
if (!PG_ARGISNULL(1)) {
|
||||||
|
/* deserialize raster */
|
||||||
|
pgraster = (rt_pgraster *) PG_DETOAST_DATUM(PG_GETARG_DATUM(1));
|
||||||
|
|
||||||
|
/* Get raster object */
|
||||||
|
raster = rt_raster_deserialize(pgraster, FALSE);
|
||||||
|
if (raster == NULL) {
|
||||||
|
|
||||||
|
rtpg_summarystats_arg_destroy(state);
|
||||||
|
PG_FREE_IF_COPY(pgraster, 1);
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
elog(ERROR, "RASTER_summaryStats_transfn: Cannot deserialize raster");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
Oid calltype;
|
||||||
|
int nargs = 0;
|
||||||
|
|
||||||
|
if (skiparg)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* 4 or 5 total possible args */
|
||||||
|
nargs = PG_NARGS();
|
||||||
|
POSTGIS_RT_DEBUGF(4, "nargs = %d", nargs);
|
||||||
|
|
||||||
|
for (i = 2; i < nargs; i++) {
|
||||||
|
if (PG_ARGISNULL(i))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
calltype = get_fn_expr_argtype(fcinfo->flinfo, i);
|
||||||
|
|
||||||
|
/* band index */
|
||||||
|
if (
|
||||||
|
(calltype == INT2OID || calltype == INT4OID) &&
|
||||||
|
i == 2
|
||||||
|
) {
|
||||||
|
if (calltype == INT2OID)
|
||||||
|
state->band_index = PG_GETARG_INT16(i);
|
||||||
|
else
|
||||||
|
state->band_index = PG_GETARG_INT32(i);
|
||||||
|
|
||||||
|
/* basic check, > 0 */
|
||||||
|
if (state->band_index < 1) {
|
||||||
|
|
||||||
|
rtpg_summarystats_arg_destroy(state);
|
||||||
|
if (raster != NULL) {
|
||||||
|
rt_raster_destroy(raster);
|
||||||
|
PG_FREE_IF_COPY(pgraster, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
elog(
|
||||||
|
ERROR,
|
||||||
|
"RASTER_summaryStats_transfn: Invalid band index (must use 1-based). Returning NULL"
|
||||||
|
);
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* exclude_nodata_value */
|
||||||
|
else if (
|
||||||
|
calltype == BOOLOID && (
|
||||||
|
i == 2 || i == 3
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
state->exclude_nodata_value = PG_GETARG_BOOL(i);
|
||||||
|
}
|
||||||
|
/* sample rate */
|
||||||
|
else if (
|
||||||
|
(calltype == FLOAT4OID || calltype == FLOAT8OID) &&
|
||||||
|
(i == 3 || i == 4)
|
||||||
|
) {
|
||||||
|
if (calltype == FLOAT4OID)
|
||||||
|
state->sample = PG_GETARG_FLOAT4(i);
|
||||||
|
else
|
||||||
|
state->sample = PG_GETARG_FLOAT8(i);
|
||||||
|
|
||||||
|
/* basic check, 0 <= sample <= 1 */
|
||||||
|
if (state->sample < 0. || state->sample > 1.) {
|
||||||
|
|
||||||
|
rtpg_summarystats_arg_destroy(state);
|
||||||
|
if (raster != NULL) {
|
||||||
|
rt_raster_destroy(raster);
|
||||||
|
PG_FREE_IF_COPY(pgraster, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
elog(
|
||||||
|
ERROR,
|
||||||
|
"Invalid sample percentage (must be between 0 and 1). Returning NULL"
|
||||||
|
);
|
||||||
|
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
else if (FLT_EQ(state->sample, 0.0))
|
||||||
|
state->sample = 1;
|
||||||
|
}
|
||||||
|
/* unknown arg */
|
||||||
|
else {
|
||||||
|
rtpg_summarystats_arg_destroy(state);
|
||||||
|
if (raster != NULL) {
|
||||||
|
rt_raster_destroy(raster);
|
||||||
|
PG_FREE_IF_COPY(pgraster, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
elog(
|
||||||
|
ERROR,
|
||||||
|
"RASTER_summaryStats_transfn: Unknown function parameter at index %d",
|
||||||
|
i
|
||||||
|
);
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (0);
|
||||||
|
|
||||||
|
/* null raster, return */
|
||||||
|
if (PG_ARGISNULL(1)) {
|
||||||
|
POSTGIS_RT_DEBUG(4, "NULL raster so processing required");
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
PG_RETURN_POINTER(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* inspect number of bands */
|
||||||
|
num_bands = rt_raster_get_num_bands(raster);
|
||||||
|
if (state->band_index > num_bands) {
|
||||||
|
elog(
|
||||||
|
NOTICE,
|
||||||
|
"Raster does not have band at index %d. Skipping raster",
|
||||||
|
state->band_index
|
||||||
|
);
|
||||||
|
|
||||||
|
rt_raster_destroy(raster);
|
||||||
|
PG_FREE_IF_COPY(pgraster, 1);
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
PG_RETURN_POINTER(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get band */
|
||||||
|
band = rt_raster_get_band(raster, state->band_index - 1);
|
||||||
|
if (!band) {
|
||||||
|
elog(
|
||||||
|
NOTICE, "Cannot find band at index %d. Skipping raster",
|
||||||
|
state->band_index
|
||||||
|
);
|
||||||
|
|
||||||
|
rt_raster_destroy(raster);
|
||||||
|
PG_FREE_IF_COPY(pgraster, 1);
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
PG_RETURN_POINTER(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we don't need the raw values, hence the zero parameter */
|
||||||
|
stats = rt_band_get_summary_stats(
|
||||||
|
band, (int) state->exclude_nodata_value,
|
||||||
|
state->sample, 0,
|
||||||
|
&(state->cK), &(state->cM), &(state->cQ)
|
||||||
|
);
|
||||||
|
|
||||||
|
rt_band_destroy(band);
|
||||||
|
rt_raster_destroy(raster);
|
||||||
|
PG_FREE_IF_COPY(pgraster, 1);
|
||||||
|
|
||||||
|
if (NULL == stats) {
|
||||||
|
elog(
|
||||||
|
NOTICE,
|
||||||
|
"Cannot compute summary statistics for band at index %d. Returning NULL",
|
||||||
|
state->band_index
|
||||||
|
);
|
||||||
|
|
||||||
|
rtpg_summarystats_arg_destroy(state);
|
||||||
|
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stats->count > 0) {
|
||||||
|
if (state->stats->count < 1) {
|
||||||
|
state->stats->sample = stats->sample;
|
||||||
|
state->stats->count = stats->count;
|
||||||
|
state->stats->min = stats->min;
|
||||||
|
state->stats->max = stats->max;
|
||||||
|
state->stats->sum = stats->sum;
|
||||||
|
state->stats->mean = stats->mean;
|
||||||
|
state->stats->stddev = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
state->stats->count += stats->count;
|
||||||
|
state->stats->sum += stats->sum;
|
||||||
|
|
||||||
|
if (stats->min < state->stats->min)
|
||||||
|
state->stats->min = stats->min;
|
||||||
|
if (stats->max > state->stats->max)
|
||||||
|
state->stats->max = stats->max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pfree(stats);
|
||||||
|
|
||||||
|
/* switch back to local context */
|
||||||
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
|
||||||
|
POSTGIS_RT_DEBUG(3, "Finished");
|
||||||
|
|
||||||
|
PG_RETURN_POINTER(state);
|
||||||
|
}
|
||||||
|
|
||||||
|
PG_FUNCTION_INFO_V1(RASTER_summaryStats_finalfn);
|
||||||
|
Datum RASTER_summaryStats_finalfn(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
rtpg_summarystats_arg state = NULL;
|
||||||
|
|
||||||
|
TupleDesc tupdesc;
|
||||||
|
HeapTuple tuple;
|
||||||
|
int values_length = 6;
|
||||||
|
Datum values[values_length];
|
||||||
|
bool nulls[values_length];
|
||||||
|
Datum result;
|
||||||
|
|
||||||
|
POSTGIS_RT_DEBUG(3, "Starting...");
|
||||||
|
|
||||||
|
/* cannot be called directly as this is exclusive aggregate function */
|
||||||
|
if (!AggCheckCallContext(fcinfo, NULL)) {
|
||||||
|
elog(ERROR, "RASTER_summaryStats_finalfn: Cannot be called in a non-aggregate context");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* NULL, return null */
|
||||||
|
if (PG_ARGISNULL(0))
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
|
||||||
|
state = (rtpg_summarystats_arg) PG_GETARG_POINTER(0);
|
||||||
|
|
||||||
|
if (NULL == state) {
|
||||||
|
elog(ERROR, "RASTER_summaryStats_finalfn: Cannot compute coverage summary stats");
|
||||||
|
PG_RETURN_NULL();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* coverage mean and deviation */
|
||||||
|
if (state->stats->count > 0) {
|
||||||
|
state->stats->mean = state->stats->sum / state->stats->count;
|
||||||
|
/* sample deviation */
|
||||||
|
if (state->stats->sample > 0 && state->stats->sample < 1)
|
||||||
|
state->stats->stddev = sqrt(state->cQ / (state->stats->count - 1));
|
||||||
|
/* standard deviation */
|
||||||
|
else
|
||||||
|
state->stats->stddev = sqrt(state->cQ / state->stats->count);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Build a tuple descriptor for our result type */
|
||||||
|
if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) {
|
||||||
|
rtpg_summarystats_arg_destroy(state);
|
||||||
|
ereport(ERROR, (
|
||||||
|
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
|
||||||
|
errmsg(
|
||||||
|
"function returning record called in context "
|
||||||
|
"that cannot accept type record"
|
||||||
|
)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
BlessTupleDesc(tupdesc);
|
||||||
|
|
||||||
|
memset(nulls, FALSE, sizeof(bool) * values_length);
|
||||||
|
|
||||||
|
values[0] = Int64GetDatum(state->stats->count);
|
||||||
|
if (state->stats->count > 0) {
|
||||||
|
values[1] = Float8GetDatum(state->stats->sum);
|
||||||
|
values[2] = Float8GetDatum(state->stats->mean);
|
||||||
|
values[3] = Float8GetDatum(state->stats->stddev);
|
||||||
|
values[4] = Float8GetDatum(state->stats->min);
|
||||||
|
values[5] = Float8GetDatum(state->stats->max);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
nulls[1] = TRUE;
|
||||||
|
nulls[2] = TRUE;
|
||||||
|
nulls[3] = TRUE;
|
||||||
|
nulls[4] = TRUE;
|
||||||
|
nulls[5] = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* build a tuple */
|
||||||
|
tuple = heap_form_tuple(tupdesc, values, nulls);
|
||||||
|
|
||||||
|
/* make the tuple into a datum */
|
||||||
|
result = HeapTupleGetDatum(tuple);
|
||||||
|
|
||||||
|
/* clean up */
|
||||||
|
rtpg_summarystats_arg_destroy(state);
|
||||||
|
|
||||||
|
PG_RETURN_DATUM(result);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns histogram for a band
|
* Returns histogram for a band
|
||||||
*/
|
*/
|
||||||
|
@ -555,7 +979,7 @@ Datum RASTER_histogram(PG_FUNCTION_ARGS)
|
||||||
if (!raster) {
|
if (!raster) {
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogram: Could not deserialize raster");
|
elog(ERROR, "RASTER_histogram: Cannot deserialize raster");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -666,7 +1090,7 @@ Datum RASTER_histogram(PG_FUNCTION_ARGS)
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find band at index %d. Returning NULL", bandindex);
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
@ -679,12 +1103,12 @@ Datum RASTER_histogram(PG_FUNCTION_ARGS)
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
if (NULL == stats || NULL == stats->values) {
|
if (NULL == stats || NULL == stats->values) {
|
||||||
elog(NOTICE, "Could not compute summary statistics for band at index %d", bandindex);
|
elog(NOTICE, "Cannot compute summary statistics for band at index %d", bandindex);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
else if (stats->count < 1) {
|
else if (stats->count < 1) {
|
||||||
elog(NOTICE, "Could not compute histogram for band at index %d as the band has no values", bandindex);
|
elog(NOTICE, "Cannot compute histogram for band at index %d as the band has no values", bandindex);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
@ -694,7 +1118,7 @@ Datum RASTER_histogram(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
pfree(stats);
|
pfree(stats);
|
||||||
if (NULL == hist || !count) {
|
if (NULL == hist || !count) {
|
||||||
elog(NOTICE, "Could not compute histogram for band at index %d", bandindex);
|
elog(NOTICE, "Cannot compute histogram for band at index %d", bandindex);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
@ -959,7 +1383,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not connect to database using SPI");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot connect to database using SPI");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -974,7 +1398,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not allocate memory for sql");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot allocate memory for sql");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -991,7 +1415,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not get summary stats of coverage");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot get summary stats of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1008,7 +1432,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not get summary stats of coverage");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot get summary stats of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
min = strtod(tmp, NULL);
|
min = strtod(tmp, NULL);
|
||||||
|
@ -1024,7 +1448,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not get summary stats of coverage");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot get summary stats of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
max = strtod(tmp, NULL);
|
max = strtod(tmp, NULL);
|
||||||
|
@ -1043,7 +1467,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not allocate memory for sql");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot allocate memory for sql");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1077,7 +1501,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not get raster of coverage");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot get raster of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
else if (isNull) {
|
else if (isNull) {
|
||||||
|
@ -1098,7 +1522,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not deserialize raster");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot deserialize raster");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1123,7 +1547,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find band at index %d. Returning NULL", bandindex);
|
||||||
|
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
|
|
||||||
|
@ -1145,7 +1569,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
|
|
||||||
if (NULL == stats) {
|
if (NULL == stats) {
|
||||||
elog(NOTICE, "Could not compute summary statistics for band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot compute summary statistics for band at index %d. Returning NULL", bandindex);
|
||||||
|
|
||||||
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
||||||
SPI_cursor_close(portal);
|
SPI_cursor_close(portal);
|
||||||
|
@ -1163,7 +1587,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
hist = rt_band_get_histogram(stats, bin_count, bin_width, bin_width_count, right, min, max, &count);
|
hist = rt_band_get_histogram(stats, bin_count, bin_width, bin_width_count, right, min, max, &count);
|
||||||
pfree(stats);
|
pfree(stats);
|
||||||
if (NULL == hist || !count) {
|
if (NULL == hist || !count) {
|
||||||
elog(NOTICE, "Could not compute histogram for band at index %d", bandindex);
|
elog(NOTICE, "Cannot compute histogram for band at index %d", bandindex);
|
||||||
|
|
||||||
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
||||||
SPI_cursor_close(portal);
|
SPI_cursor_close(portal);
|
||||||
|
@ -1191,7 +1615,7 @@ Datum RASTER_histogramCoverage(PG_FUNCTION_ARGS)
|
||||||
if (bin_width_count) pfree(bin_width);
|
if (bin_width_count) pfree(bin_width);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_histogramCoverage: Could not allocate memory for histogram of coverage");
|
elog(ERROR, "RASTER_histogramCoverage: Cannot allocate memory for histogram of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1355,7 +1779,7 @@ Datum RASTER_quantile(PG_FUNCTION_ARGS)
|
||||||
if (!raster) {
|
if (!raster) {
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantile: Could not deserialize raster");
|
elog(ERROR, "RASTER_quantile: Cannot deserialize raster");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1449,7 +1873,7 @@ Datum RASTER_quantile(PG_FUNCTION_ARGS)
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find band at index %d. Returning NULL", bandindex);
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
@ -1462,12 +1886,12 @@ Datum RASTER_quantile(PG_FUNCTION_ARGS)
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
if (NULL == stats || NULL == stats->values) {
|
if (NULL == stats || NULL == stats->values) {
|
||||||
elog(NOTICE, "Could not retrieve summary statistics for band at index %d", bandindex);
|
elog(NOTICE, "Cannot retrieve summary statistics for band at index %d", bandindex);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
else if (stats->count < 1) {
|
else if (stats->count < 1) {
|
||||||
elog(NOTICE, "Could not compute quantiles for band at index %d as the band has no values", bandindex);
|
elog(NOTICE, "Cannot compute quantiles for band at index %d as the band has no values", bandindex);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
@ -1477,7 +1901,7 @@ Datum RASTER_quantile(PG_FUNCTION_ARGS)
|
||||||
if (quantiles_count) pfree(quantiles);
|
if (quantiles_count) pfree(quantiles);
|
||||||
pfree(stats);
|
pfree(stats);
|
||||||
if (NULL == quant || !count) {
|
if (NULL == quant || !count) {
|
||||||
elog(NOTICE, "Could not compute quantiles for band at index %d", bandindex);
|
elog(NOTICE, "Cannot compute quantiles for band at index %d", bandindex);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
@ -1724,7 +2148,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
spi_result = SPI_connect();
|
spi_result = SPI_connect();
|
||||||
if (spi_result != SPI_OK_CONNECT) {
|
if (spi_result != SPI_OK_CONNECT) {
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantileCoverage: Could not connect to database using SPI");
|
elog(ERROR, "RASTER_quantileCoverage: Cannot connect to database using SPI");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1736,7 +2160,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantileCoverage: Could not allocate memory for sql");
|
elog(ERROR, "RASTER_quantileCoverage: Cannot allocate memory for sql");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1751,7 +2175,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantileCoverage: Could not get summary stats of coverage");
|
elog(ERROR, "RASTER_quantileCoverage: Cannot get summary stats of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1766,7 +2190,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantileCoverage: Could not get summary stats of coverage");
|
elog(ERROR, "RASTER_quantileCoverage: Cannot get summary stats of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
cov_count = strtol(tmp, NULL, 10);
|
cov_count = strtol(tmp, NULL, 10);
|
||||||
|
@ -1783,7 +2207,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantileCoverage: Could not allocate memory for sql");
|
elog(ERROR, "RASTER_quantileCoverage: Cannot allocate memory for sql");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1816,7 +2240,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantileCoverage: Could not get raster of coverage");
|
elog(ERROR, "RASTER_quantileCoverage: Cannot get raster of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
else if (isNull) {
|
else if (isNull) {
|
||||||
|
@ -1834,7 +2258,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
SPI_finish();
|
SPI_finish();
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_quantileCoverage: Could not deserialize raster");
|
elog(ERROR, "RASTER_quantileCoverage: Cannot deserialize raster");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1856,7 +2280,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find raster band of index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find raster band of index %d. Returning NULL", bandindex);
|
||||||
|
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
|
|
||||||
|
@ -1880,7 +2304,7 @@ Datum RASTER_quantileCoverage(PG_FUNCTION_ARGS)
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
|
|
||||||
if (NULL == covquant || !count) {
|
if (NULL == covquant || !count) {
|
||||||
elog(NOTICE, "Could not compute quantiles for band at index %d", bandindex);
|
elog(NOTICE, "Cannot compute quantiles for band at index %d", bandindex);
|
||||||
|
|
||||||
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
||||||
SPI_cursor_close(portal);
|
SPI_cursor_close(portal);
|
||||||
|
@ -2033,7 +2457,7 @@ Datum RASTER_valueCount(PG_FUNCTION_ARGS) {
|
||||||
if (!raster) {
|
if (!raster) {
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_valueCount: Could not deserialize raster");
|
elog(ERROR, "RASTER_valueCount: Cannot deserialize raster");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2107,7 +2531,7 @@ Datum RASTER_valueCount(PG_FUNCTION_ARGS) {
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find band at index %d. Returning NULL", bandindex);
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
|
@ -2120,7 +2544,7 @@ Datum RASTER_valueCount(PG_FUNCTION_ARGS) {
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
PG_FREE_IF_COPY(pgraster, 0);
|
PG_FREE_IF_COPY(pgraster, 0);
|
||||||
if (NULL == vcnts || !count) {
|
if (NULL == vcnts || !count) {
|
||||||
elog(NOTICE, "Could not count the values for band at index %d", bandindex);
|
elog(NOTICE, "Cannot count the values for band at index %d", bandindex);
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
@ -2349,7 +2773,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
if (search_values_count) pfree(search_values);
|
if (search_values_count) pfree(search_values);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_valueCountCoverage: Could not connect to database using SPI");
|
elog(ERROR, "RASTER_valueCountCoverage: Cannot connect to database using SPI");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2364,7 +2788,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
if (search_values_count) pfree(search_values);
|
if (search_values_count) pfree(search_values);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_valueCountCoverage: Could not allocate memory for sql");
|
elog(ERROR, "RASTER_valueCountCoverage: Cannot allocate memory for sql");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2398,7 +2822,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
if (search_values_count) pfree(search_values);
|
if (search_values_count) pfree(search_values);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_valueCountCoverage: Could not get raster of coverage");
|
elog(ERROR, "RASTER_valueCountCoverage: Cannot get raster of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
else if (isNull) {
|
else if (isNull) {
|
||||||
|
@ -2419,7 +2843,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
if (search_values_count) pfree(search_values);
|
if (search_values_count) pfree(search_values);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_valueCountCoverage: Could not deserialize raster");
|
elog(ERROR, "RASTER_valueCountCoverage: Cannot deserialize raster");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2444,7 +2868,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
/* get band */
|
/* get band */
|
||||||
band = rt_raster_get_band(raster, bandindex - 1);
|
band = rt_raster_get_band(raster, bandindex - 1);
|
||||||
if (!band) {
|
if (!band) {
|
||||||
elog(NOTICE, "Could not find band at index %d. Returning NULL", bandindex);
|
elog(NOTICE, "Cannot find band at index %d. Returning NULL", bandindex);
|
||||||
|
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
|
|
||||||
|
@ -2464,7 +2888,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
rt_band_destroy(band);
|
rt_band_destroy(band);
|
||||||
rt_raster_destroy(raster);
|
rt_raster_destroy(raster);
|
||||||
if (NULL == vcnts || !count) {
|
if (NULL == vcnts || !count) {
|
||||||
elog(NOTICE, "Could not count the values for band at index %d", bandindex);
|
elog(NOTICE, "Cannot count the values for band at index %d", bandindex);
|
||||||
|
|
||||||
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
if (SPI_tuptable) SPI_freetuptable(tuptable);
|
||||||
SPI_cursor_close(portal);
|
SPI_cursor_close(portal);
|
||||||
|
@ -2490,7 +2914,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
if (search_values_count) pfree(search_values);
|
if (search_values_count) pfree(search_values);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_valueCountCoverage: Could not allocate memory for value counts of coverage");
|
elog(ERROR, "RASTER_valueCountCoverage: Cannot allocate memory for value counts of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2529,7 +2953,7 @@ Datum RASTER_valueCountCoverage(PG_FUNCTION_ARGS) {
|
||||||
if (NULL != covvcnts) free(covvcnts);
|
if (NULL != covvcnts) free(covvcnts);
|
||||||
|
|
||||||
MemoryContextSwitchTo(oldcontext);
|
MemoryContextSwitchTo(oldcontext);
|
||||||
elog(ERROR, "RASTER_valueCountCoverage: Could not change allocated memory for value counts of coverage");
|
elog(ERROR, "RASTER_valueCountCoverage: Cannot change allocated memory for value counts of coverage");
|
||||||
SRF_RETURN_DONE(funcctx);
|
SRF_RETURN_DONE(funcctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
-- Copyright (c) 2010 David Zwarg <dzwarg@azavea.com>
|
-- Copyright (c) 2010 David Zwarg <dzwarg@azavea.com>
|
||||||
-- Copyright (C) 2011-2013 Regents of the University of California
|
-- Copyright (C) 2011-2013 Regents of the University of California
|
||||||
-- <bkpark@ucdavis.edu>
|
-- <bkpark@ucdavis.edu>
|
||||||
|
-- Copyright (C) 2013 Bborie Park <dustymugs@gmail.com>
|
||||||
--
|
--
|
||||||
-- This program is free software; you can redistribute it and/or
|
-- This program is free software; you can redistribute it and/or
|
||||||
-- modify it under the terms of the GNU General Public License
|
-- modify it under the terms of the GNU General Public License
|
||||||
|
@ -408,45 +409,40 @@ CREATE OR REPLACE FUNCTION st_band(rast raster, nbands text, delimiter char DEFA
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
-- ST_SummaryStats and ST_ApproxSummaryStats
|
-- ST_SummaryStats and ST_ApproxSummaryStats
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE TYPE summarystats AS (
|
||||||
|
count bigint,
|
||||||
|
sum double precision,
|
||||||
|
mean double precision,
|
||||||
|
stddev double precision,
|
||||||
|
min double precision,
|
||||||
|
max double precision
|
||||||
|
);
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION _st_summarystats(
|
CREATE OR REPLACE FUNCTION _st_summarystats(
|
||||||
rast raster,
|
rast raster,
|
||||||
nband int DEFAULT 1,
|
nband int DEFAULT 1,
|
||||||
exclude_nodata_value boolean DEFAULT TRUE,
|
exclude_nodata_value boolean DEFAULT TRUE,
|
||||||
sample_percent double precision DEFAULT 1,
|
sample_percent double precision DEFAULT 1
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS 'MODULE_PATHNAME','RASTER_summaryStats'
|
AS 'MODULE_PATHNAME','RASTER_summaryStats'
|
||||||
LANGUAGE 'c' IMMUTABLE;
|
LANGUAGE 'c' IMMUTABLE;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_summarystats(
|
CREATE OR REPLACE FUNCTION st_summarystats(
|
||||||
rast raster,
|
rast raster,
|
||||||
nband int DEFAULT 1,
|
nband int DEFAULT 1,
|
||||||
exclude_nodata_value boolean DEFAULT TRUE,
|
exclude_nodata_value boolean DEFAULT TRUE
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, $3, 1) $$
|
AS $$ SELECT _st_summarystats($1, $2, $3, 1) $$
|
||||||
LANGUAGE 'sql' IMMUTABLE STRICT;
|
LANGUAGE 'sql' IMMUTABLE STRICT;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_summarystats(
|
CREATE OR REPLACE FUNCTION st_summarystats(
|
||||||
rast raster,
|
rast raster,
|
||||||
exclude_nodata_value boolean,
|
exclude_nodata_value boolean
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, 1, $2, 1) $$
|
AS $$ SELECT _st_summarystats($1, 1, $2, 1) $$
|
||||||
LANGUAGE 'sql' IMMUTABLE STRICT;
|
LANGUAGE 'sql' IMMUTABLE STRICT;
|
||||||
|
|
||||||
|
@ -454,100 +450,134 @@ CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rast raster,
|
rast raster,
|
||||||
nband int DEFAULT 1,
|
nband int DEFAULT 1,
|
||||||
exclude_nodata_value boolean DEFAULT TRUE,
|
exclude_nodata_value boolean DEFAULT TRUE,
|
||||||
sample_percent double precision DEFAULT 0.1,
|
sample_percent double precision DEFAULT 0.1
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, $3, $4) $$
|
AS $$ SELECT _st_summarystats($1, $2, $3, $4) $$
|
||||||
LANGUAGE 'sql' IMMUTABLE STRICT;
|
LANGUAGE 'sql' IMMUTABLE STRICT;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rast raster,
|
rast raster,
|
||||||
nband int,
|
nband int,
|
||||||
sample_percent double precision,
|
sample_percent double precision
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, TRUE, $3) $$
|
AS $$ SELECT _st_summarystats($1, $2, TRUE, $3) $$
|
||||||
LANGUAGE 'sql' IMMUTABLE STRICT;
|
LANGUAGE 'sql' IMMUTABLE STRICT;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rast raster,
|
rast raster,
|
||||||
exclude_nodata_value boolean,
|
exclude_nodata_value boolean,
|
||||||
sample_percent double precision DEFAULT 0.1,
|
sample_percent double precision DEFAULT 0.1
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, 1, $2, $3) $$
|
AS $$ SELECT _st_summarystats($1, 1, $2, $3) $$
|
||||||
LANGUAGE 'sql' IMMUTABLE STRICT;
|
LANGUAGE 'sql' IMMUTABLE STRICT;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rast raster,
|
rast raster,
|
||||||
sample_percent double precision,
|
sample_percent double precision
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, 1, TRUE, $2) $$
|
AS $$ SELECT _st_summarystats($1, 1, TRUE, $2) $$
|
||||||
LANGUAGE 'sql' IMMUTABLE STRICT;
|
LANGUAGE 'sql' IMMUTABLE STRICT;
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
-- ST_SummaryStatsAgg
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION _st_summarystats_finalfn(internal)
|
||||||
|
RETURNS summarystats
|
||||||
|
AS 'MODULE_PATHNAME', 'RASTER_summaryStats_finalfn'
|
||||||
|
LANGUAGE 'c' IMMUTABLE;
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION _st_summarystats_transfn(
|
||||||
|
internal,
|
||||||
|
raster, integer,
|
||||||
|
boolean, double precision
|
||||||
|
)
|
||||||
|
RETURNS internal
|
||||||
|
AS 'MODULE_PATHNAME', 'RASTER_summaryStats_transfn'
|
||||||
|
LANGUAGE 'c' IMMUTABLE;
|
||||||
|
|
||||||
|
CREATE AGGREGATE st_summarystatsagg(raster, integer, boolean, double precision) (
|
||||||
|
SFUNC = _st_summarystats_transfn,
|
||||||
|
STYPE = internal,
|
||||||
|
FINALFUNC = _st_summarystats_finalfn
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION _st_summarystats_transfn(
|
||||||
|
internal,
|
||||||
|
raster, boolean, double precision
|
||||||
|
)
|
||||||
|
RETURNS internal
|
||||||
|
AS 'MODULE_PATHNAME', 'RASTER_summaryStats_transfn'
|
||||||
|
LANGUAGE 'c' IMMUTABLE;
|
||||||
|
|
||||||
|
CREATE AGGREGATE st_summarystatsagg(raster, boolean, double precision) (
|
||||||
|
SFUNC = _st_summarystats_transfn,
|
||||||
|
STYPE = internal,
|
||||||
|
FINALFUNC = _st_summarystats_finalfn
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION _st_summarystats_transfn(
|
||||||
|
internal,
|
||||||
|
raster, int, boolean
|
||||||
|
)
|
||||||
|
RETURNS internal
|
||||||
|
AS 'MODULE_PATHNAME', 'RASTER_summaryStats_transfn'
|
||||||
|
LANGUAGE 'c' IMMUTABLE;
|
||||||
|
|
||||||
|
CREATE AGGREGATE st_summarystatsagg(raster, int, boolean) (
|
||||||
|
SFUNC = _st_summarystats_transfn,
|
||||||
|
STYPE = internal,
|
||||||
|
FINALFUNC = _st_summarystats_finalfn
|
||||||
|
);
|
||||||
|
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
-- ST_SummaryStats for table
|
||||||
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION _st_summarystats(
|
CREATE OR REPLACE FUNCTION _st_summarystats(
|
||||||
rastertable text,
|
rastertable text,
|
||||||
rastercolumn text,
|
rastercolumn text,
|
||||||
nband integer DEFAULT 1,
|
nband integer DEFAULT 1,
|
||||||
exclude_nodata_value boolean DEFAULT TRUE,
|
exclude_nodata_value boolean DEFAULT TRUE,
|
||||||
sample_percent double precision DEFAULT 1,
|
sample_percent double precision DEFAULT 1
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
AS 'MODULE_PATHNAME','RASTER_summaryStatsCoverage'
|
RETURNS summarystats
|
||||||
LANGUAGE 'c' IMMUTABLE;
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
stats summarystats;
|
||||||
|
BEGIN
|
||||||
|
EXECUTE 'SELECT (stats).* FROM (SELECT ST_SummaryStatsAgg('
|
||||||
|
|| $2 || ', '
|
||||||
|
|| $3 || ', '
|
||||||
|
|| $4 || ', '
|
||||||
|
|| $5 || ') AS stats '
|
||||||
|
|| 'FROM ' || quote_ident($1)
|
||||||
|
|| ') foo'
|
||||||
|
INTO stats;
|
||||||
|
RETURN stats;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE 'plpgsql' IMMUTABLE;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_summarystats(
|
CREATE OR REPLACE FUNCTION st_summarystats(
|
||||||
rastertable text,
|
rastertable text,
|
||||||
rastercolumn text,
|
rastercolumn text,
|
||||||
nband integer DEFAULT 1,
|
nband integer DEFAULT 1,
|
||||||
exclude_nodata_value boolean DEFAULT TRUE,
|
exclude_nodata_value boolean DEFAULT TRUE
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, $3, $4, 1) $$
|
AS $$ SELECT _st_summarystats($1, $2, $3, $4, 1) $$
|
||||||
LANGUAGE 'sql' STABLE STRICT;
|
LANGUAGE 'sql' STABLE STRICT;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_summarystats(
|
CREATE OR REPLACE FUNCTION st_summarystats(
|
||||||
rastertable text,
|
rastertable text,
|
||||||
rastercolumn text,
|
rastercolumn text,
|
||||||
exclude_nodata_value boolean,
|
exclude_nodata_value boolean
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, 1, $3, 1) $$
|
AS $$ SELECT _st_summarystats($1, $2, 1, $3, 1) $$
|
||||||
LANGUAGE 'sql' STABLE STRICT;
|
LANGUAGE 'sql' STABLE STRICT;
|
||||||
|
|
||||||
|
@ -556,14 +586,9 @@ CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rastercolumn text,
|
rastercolumn text,
|
||||||
nband integer DEFAULT 1,
|
nband integer DEFAULT 1,
|
||||||
exclude_nodata_value boolean DEFAULT TRUE,
|
exclude_nodata_value boolean DEFAULT TRUE,
|
||||||
sample_percent double precision DEFAULT 0.1,
|
sample_percent double precision DEFAULT 0.1
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, $3, $4, $5) $$
|
AS $$ SELECT _st_summarystats($1, $2, $3, $4, $5) $$
|
||||||
LANGUAGE 'sql' STABLE STRICT;
|
LANGUAGE 'sql' STABLE STRICT;
|
||||||
|
|
||||||
|
@ -571,45 +596,31 @@ CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rastertable text,
|
rastertable text,
|
||||||
rastercolumn text,
|
rastercolumn text,
|
||||||
nband integer,
|
nband integer,
|
||||||
sample_percent double precision,
|
sample_percent double precision
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, $3, TRUE, $4) $$
|
AS $$ SELECT _st_summarystats($1, $2, $3, TRUE, $4) $$
|
||||||
LANGUAGE 'sql' STABLE STRICT;
|
LANGUAGE 'sql' STABLE STRICT;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rastertable text,
|
rastertable text,
|
||||||
rastercolumn text,
|
rastercolumn text,
|
||||||
exclude_nodata_value boolean,
|
exclude_nodata_value boolean
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, 1, $3, 0.1) $$
|
AS $$ SELECT _st_summarystats($1, $2, 1, $3, 0.1) $$
|
||||||
LANGUAGE 'sql' STABLE STRICT;
|
LANGUAGE 'sql' STABLE STRICT;
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
CREATE OR REPLACE FUNCTION st_approxsummarystats(
|
||||||
rastertable text,
|
rastertable text,
|
||||||
rastercolumn text,
|
rastercolumn text,
|
||||||
sample_percent double precision,
|
sample_percent double precision
|
||||||
OUT count bigint,
|
|
||||||
OUT sum double precision,
|
|
||||||
OUT mean double precision,
|
|
||||||
OUT stddev double precision,
|
|
||||||
OUT min double precision,
|
|
||||||
OUT max double precision
|
|
||||||
)
|
)
|
||||||
|
RETURNS summarystats
|
||||||
AS $$ SELECT _st_summarystats($1, $2, 1, TRUE, $3) $$
|
AS $$ SELECT _st_summarystats($1, $2, 1, TRUE, $3) $$
|
||||||
LANGUAGE 'sql' STABLE STRICT;
|
LANGUAGE 'sql' STABLE STRICT;
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
-- ST_Count and ST_ApproxCount
|
-- ST_Count and ST_ApproxCount
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
|
|
@ -218,7 +218,6 @@ DROP FUNCTION IF EXISTS st_approxsummarystats(text, text, boolean);
|
||||||
DROP FUNCTION IF EXISTS st_approxsummarystats(text, text, double precision);
|
DROP FUNCTION IF EXISTS st_approxsummarystats(text, text, double precision);
|
||||||
DROP FUNCTION IF EXISTS _st_summarystats(raster,int, boolean, double precision);
|
DROP FUNCTION IF EXISTS _st_summarystats(raster,int, boolean, double precision);
|
||||||
DROP FUNCTION IF EXISTS _st_summarystats(text, text,integer, boolean, double precision);
|
DROP FUNCTION IF EXISTS _st_summarystats(text, text,integer, boolean, double precision);
|
||||||
DROP TYPE IF EXISTS summarystats;
|
|
||||||
|
|
||||||
-- remove TYPE quantile
|
-- remove TYPE quantile
|
||||||
DROP FUNCTION IF EXISTS st_quantile(raster, int, boolean, double precision[]);
|
DROP FUNCTION IF EXISTS st_quantile(raster, int, boolean, double precision[]);
|
||||||
|
@ -507,3 +506,8 @@ DROP FUNCTION IF EXISTS _st_mapalgebra4unionstate(raster, raster, text);
|
||||||
DROP FUNCTION IF EXISTS _st_mapalgebra4unionstate(raster, raster, int4, text);
|
DROP FUNCTION IF EXISTS _st_mapalgebra4unionstate(raster, raster, int4, text);
|
||||||
DROP FUNCTION IF EXISTS _st_mapalgebra4unionstate(raster, raster, text, text, text, float8, text, text, text, float8);
|
DROP FUNCTION IF EXISTS _st_mapalgebra4unionstate(raster, raster, text, text, text, float8, text, text, text, float8);
|
||||||
DROP FUNCTION IF EXISTS _st_slope4ma(float8[], text, text[]);
|
DROP FUNCTION IF EXISTS _st_slope4ma(float8[], text, text[]);
|
||||||
|
|
||||||
|
-- drop aggregates
|
||||||
|
DROP AGGREGATE IF EXISTS ST_SummaryStatsAgg(raster, integer, boolean, double precision);
|
||||||
|
DROP AGGREGATE IF EXISTS ST_SummaryStatsAgg(raster, boolean, double precision);
|
||||||
|
DROP AGGREGATE IF EXISTS ST_SummaryStatsAgg(raster, integer, boolean);
|
||||||
|
|
|
@ -138,6 +138,20 @@ BEGIN
|
||||||
);
|
);
|
||||||
END IF;
|
END IF;
|
||||||
|
|
||||||
|
-- create summarystats type if it does not exist
|
||||||
|
IF NOT EXISTS(SELECT typname
|
||||||
|
FROM pg_type
|
||||||
|
WHERE typname = 'summarystats') THEN
|
||||||
|
CREATE TYPE summarystats AS (
|
||||||
|
count bigint,
|
||||||
|
sum double precision,
|
||||||
|
mean double precision,
|
||||||
|
stddev double precision,
|
||||||
|
min double precision,
|
||||||
|
max double precision
|
||||||
|
);
|
||||||
|
END IF;
|
||||||
|
|
||||||
END$$;
|
END$$;
|
||||||
|
|
||||||
-- make geometry cast ASSIGNMENT
|
-- make geometry cast ASSIGNMENT
|
||||||
|
|
|
@ -76,16 +76,25 @@ BEGIN
|
||||||
-5.619|-1.239|0|0.000
|
-5.619|-1.239|0|0.000
|
||||||
-1.239|3.142|10|0.500
|
-1.239|3.142|10|0.500
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
NOTICE: Invalid band index (must use 1-based). Returning NULL
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
ERROR: RASTER_histogramCoverage: Could not get summary stats of coverage
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
ERROR: RASTER_histogramCoverage: Cannot get summary stats of coverage
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
ERROR: relation "test1" does not exist at character 20
|
ERROR: relation "test1" does not exist at character 82
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
ERROR: column "rast1" does not exist at character 8
|
ERROR: column "rast1" does not exist at character 50
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
|
@ -95,16 +95,17 @@ BEGIN
|
||||||
3.142
|
3.142
|
||||||
3.142
|
3.142
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
NOTICE: Invalid band index (must use 1-based). Returning NULL
|
NOTICE: Invalid band index (must use 1-based). Returning NULL
|
||||||
ERROR: RASTER_quantileCoverage: Could not get summary stats of coverage
|
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
ERROR: relation "test_quantile1" does not exist at character 20
|
ERROR: relation "test_quantile1" does not exist at character 82
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
ERROR: column "rast2" does not exist at character 8
|
ERROR: column "rast2" does not exist at character 50
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
|
|
|
@ -227,6 +227,142 @@ SELECT
|
||||||
round(min::numeric, 3),
|
round(min::numeric, 3),
|
||||||
round(max::numeric, 3)
|
round(max::numeric, 3)
|
||||||
FROM ST_SummaryStats('test_summarystats', 'rast1');
|
FROM ST_SummaryStats('test_summarystats', 'rast1');
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, 1, TRUE, 1) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, TRUE, 1) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, 1, TRUE) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, 1, FALSE, 1) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, FALSE, 1) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, 1, FALSE) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, 1, TRUE, 2) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
|
ROLLBACK TO SAVEPOINT test;
|
||||||
|
RELEASE SAVEPOINT test;
|
||||||
|
SAVEPOINT test;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
(stats).count,
|
||||||
|
round((stats).sum::numeric, 3),
|
||||||
|
round((stats).mean::numeric, 3),
|
||||||
|
round((stats).stddev::numeric, 3),
|
||||||
|
round((stats).min::numeric, 3),
|
||||||
|
round((stats).max::numeric, 3)
|
||||||
|
FROM (
|
||||||
|
SELECT
|
||||||
|
ST_SummaryStatsAgg(rast, 2, TRUE, 1) AS stats
|
||||||
|
FROM test_summarystats
|
||||||
|
) foo;
|
||||||
|
|
||||||
ROLLBACK TO SAVEPOINT test;
|
ROLLBACK TO SAVEPOINT test;
|
||||||
RELEASE SAVEPOINT test;
|
RELEASE SAVEPOINT test;
|
||||||
ROLLBACK;
|
ROLLBACK;
|
||||||
|
|
|
@ -16,16 +16,67 @@ BEGIN
|
||||||
20|-68.584|-3.429|6.571|-10.000|3.142
|
20|-68.584|-3.429|6.571|-10.000|3.142
|
||||||
20|-68.584|-3.429|6.571|-10.000|3.142
|
20|-68.584|-3.429|6.571|-10.000|3.142
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
NOTICE: Invalid band index (must use 1-based). Returning NULL
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
0|||||
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
ERROR: relation "test1" does not exist at character 20
|
ERROR: relation "test1" does not exist at character 82
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
SAVEPOINT
|
SAVEPOINT
|
||||||
ERROR: column "rast1" does not exist at character 8
|
ERROR: column "rast1" does not exist at character 50
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
20|-68.584|-3.429|6.571|-10.000|3.142
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
20|-68.584|-3.429|6.571|-10.000|3.142
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
20|-68.584|-3.429|6.571|-10.000|3.142
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
1000|-68.584|-0.069|1.046|-10.000|3.142
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
1000|-68.584|-0.069|1.046|-10.000|3.142
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
1000|-68.584|-0.069|1.046|-10.000|3.142
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
ERROR: Invalid sample percentage (must be between 0 and 1). Returning NULL
|
||||||
|
COMMIT
|
||||||
|
RELEASE
|
||||||
|
SAVEPOINT
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
NOTICE: Raster does not have band at index 2. Skipping raster
|
||||||
|
0|||||
|
||||||
COMMIT
|
COMMIT
|
||||||
RELEASE
|
RELEASE
|
||||||
COMMIT
|
COMMIT
|
||||||
|
|
Loading…
Reference in a new issue