PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ rtpg_nmapalgebraexpr_callback()

static int rtpg_nmapalgebraexpr_callback ( rt_iterator_arg  arg,
void *  userarg,
double *  value,
int *  nodata 
)
static

Definition at line 1106 of file rtpg_mapalgebra.c.

1109 {
1111 SPIPlanPtr plan = NULL;
1112 int i = 0;
1113 uint8_t id = 0;
1114
1115 if (arg == NULL)
1116 return 0;
1117
1118 *value = 0;
1119 *nodata = 0;
1120
1121 /* 2 raster */
1122 if (arg->rasters > 1) {
1123 /* nodata1 = 1 AND nodata2 = 1, nodatanodataval */
1124 if (arg->nodata[0][0][0] && arg->nodata[1][0][0]) {
1125 if (callback->nodatanodata.hasval)
1126 *value = callback->nodatanodata.val;
1127 else
1128 *nodata = 1;
1129 }
1130 /* nodata1 = 1 AND nodata2 != 1, nodata1expr */
1131 else if (arg->nodata[0][0][0] && !arg->nodata[1][0][0]) {
1132 id = 1;
1133 if (callback->expr[id].hasval)
1134 *value = callback->expr[id].val;
1135 else if (callback->expr[id].spi_plan)
1136 plan = callback->expr[id].spi_plan;
1137 else
1138 *nodata = 1;
1139 }
1140 /* nodata1 != 1 AND nodata2 = 1, nodata2expr */
1141 else if (!arg->nodata[0][0][0] && arg->nodata[1][0][0]) {
1142 id = 2;
1143 if (callback->expr[id].hasval)
1144 *value = callback->expr[id].val;
1145 else if (callback->expr[id].spi_plan)
1146 plan = callback->expr[id].spi_plan;
1147 else
1148 *nodata = 1;
1149 }
1150 /* expression */
1151 else {
1152 id = 0;
1153 if (callback->expr[id].hasval)
1154 *value = callback->expr[id].val;
1155 else if (callback->expr[id].spi_plan)
1156 plan = callback->expr[id].spi_plan;
1157 else {
1158 if (callback->nodatanodata.hasval)
1159 *value = callback->nodatanodata.val;
1160 else
1161 *nodata = 1;
1162 }
1163 }
1164 }
1165 /* 1 raster */
1166 else {
1167 /* nodata = 1, nodata1expr */
1168 if (arg->nodata[0][0][0]) {
1169 id = 1;
1170 if (callback->expr[id].hasval)
1171 *value = callback->expr[id].val;
1172 else if (callback->expr[id].spi_plan)
1173 plan = callback->expr[id].spi_plan;
1174 else
1175 *nodata = 1;
1176 }
1177 /* expression */
1178 else {
1179 id = 0;
1180 if (callback->expr[id].hasval)
1181 *value = callback->expr[id].val;
1182 else if (callback->expr[id].spi_plan)
1183 plan = callback->expr[id].spi_plan;
1184 else {
1185 /* see if nodata1expr is available */
1186 id = 1;
1187 if (callback->expr[id].hasval)
1188 *value = callback->expr[id].val;
1189 else if (callback->expr[id].spi_plan)
1190 plan = callback->expr[id].spi_plan;
1191 else
1192 *nodata = 1;
1193 }
1194 }
1195 }
1196
1197 /* run prepared plan */
1198 if (plan != NULL) {
1199 Datum values[12];
1200 char nulls[12];
1201 int err = 0;
1202
1203 TupleDesc tupdesc;
1204 SPITupleTable *tuptable = NULL;
1205 HeapTuple tuple;
1206 Datum datum;
1207 bool isnull = FALSE;
1208
1209 POSTGIS_RT_DEBUGF(4, "Running plan %d", id);
1210
1211 /* init values and nulls */
1212 memset(values, (Datum) NULL, sizeof(Datum) * callback->kw.count);
1213 memset(nulls, FALSE, sizeof(char) * callback->kw.count);
1214
1215 if (callback->expr[id].spi_argcount) {
1216 int idx = 0;
1217
1218 for (i = 0; i < callback->kw.count; i++) {
1219 idx = callback->expr[id].spi_argpos[i];
1220 if (idx < 1) continue;
1221 idx--; /* 1-based now 0-based */
1222
1223 switch (i) {
1224 /* [rast.x] */
1225 case 0:
1226 values[idx] = Int32GetDatum(arg->src_pixel[0][0] + 1);
1227 break;
1228 /* [rast.y] */
1229 case 1:
1230 values[idx] = Int32GetDatum(arg->src_pixel[0][1] + 1);
1231 break;
1232 /* [rast.val] */
1233 case 2:
1234 /* [rast] */
1235 case 3:
1236 if (!arg->nodata[0][0][0])
1237 values[idx] = Float8GetDatum(arg->values[0][0][0]);
1238 else
1239 nulls[idx] = TRUE;
1240 break;
1241
1242 /* [rast1.x] */
1243 case 4:
1244 values[idx] = Int32GetDatum(arg->src_pixel[0][0] + 1);
1245 break;
1246 /* [rast1.y] */
1247 case 5:
1248 values[idx] = Int32GetDatum(arg->src_pixel[0][1] + 1);
1249 break;
1250 /* [rast1.val] */
1251 case 6:
1252 /* [rast1] */
1253 case 7:
1254 if (!arg->nodata[0][0][0])
1255 values[idx] = Float8GetDatum(arg->values[0][0][0]);
1256 else
1257 nulls[idx] = TRUE;
1258 break;
1259
1260 /* [rast2.x] */
1261 case 8:
1262 values[idx] = Int32GetDatum(arg->src_pixel[1][0] + 1);
1263 break;
1264 /* [rast2.y] */
1265 case 9:
1266 values[idx] = Int32GetDatum(arg->src_pixel[1][1] + 1);
1267 break;
1268 /* [rast2.val] */
1269 case 10:
1270 /* [rast2] */
1271 case 11:
1272 if (!arg->nodata[1][0][0])
1273 values[idx] = Float8GetDatum(arg->values[1][0][0]);
1274 else
1275 nulls[idx] = TRUE;
1276 break;
1277 }
1278
1279 }
1280 }
1281
1282 /* run prepared plan */
1283 err = SPI_execute_plan(plan, values, nulls, TRUE, 1);
1284 if (err != SPI_OK_SELECT || SPI_tuptable == NULL || SPI_processed != 1) {
1285 elog(ERROR, "rtpg_nmapalgebraexpr_callback: Unexpected error when running prepared statement %d", id);
1286 return 0;
1287 }
1288
1289 /* get output of prepared plan */
1290 tupdesc = SPI_tuptable->tupdesc;
1291 tuptable = SPI_tuptable;
1292 tuple = tuptable->vals[0];
1293
1294 datum = SPI_getbinval(tuple, tupdesc, 1, &isnull);
1295 if (SPI_result == SPI_ERROR_NOATTRIBUTE) {
1296 if (SPI_tuptable) SPI_freetuptable(tuptable);
1297 elog(ERROR, "rtpg_nmapalgebraexpr_callback: Could not get result of prepared statement %d", id);
1298 return 0;
1299 }
1300
1301 if (!isnull) {
1302 *value = DatumGetFloat8(datum);
1303 POSTGIS_RT_DEBUG(4, "Getting value from Datum");
1304 }
1305 else {
1306 /* 2 raster, check nodatanodataval */
1307 if (arg->rasters > 1) {
1308 if (callback->nodatanodata.hasval)
1309 *value = callback->nodatanodata.val;
1310 else
1311 *nodata = 1;
1312 }
1313 /* 1 raster, check nodataval */
1314 else {
1315 if (callback->expr[1].hasval)
1316 *value = callback->expr[1].val;
1317 else
1318 *nodata = 1;
1319 }
1320 }
1321
1322 if (SPI_tuptable) SPI_freetuptable(tuptable);
1323 }
1324
1325 POSTGIS_RT_DEBUGF(4, "(value, nodata) = (%f, %d)", *value, *nodata);
1326 return 1;
1327}
#define TRUE
Definition dbfopen.c:169
#define FALSE
Definition dbfopen.c:168
int value
Definition genraster.py:62
#define POSTGIS_RT_DEBUG(level, msg)
Definition rtpostgis.h:61
#define POSTGIS_RT_DEBUGF(level, msg,...)
Definition rtpostgis.h:65
double *** values
Definition librtcore.h:2460
struct rtpg_nmapalgebraexpr_callback_arg::@18 expr[3]
struct rtpg_nmapalgebraexpr_callback_arg::@20 kw
struct rtpg_nmapalgebraexpr_callback_arg::@19 nodatanodata

References rtpg_nmapalgebraexpr_callback_arg::count, rtpg_nmapalgebraexpr_callback_arg::expr, FALSE, rtpg_nmapalgebraexpr_callback_arg::hasval, rtpg_nmapalgebraexpr_callback_arg::kw, rt_iterator_arg_t::nodata, rtpg_nmapalgebraexpr_callback_arg::nodatanodata, POSTGIS_RT_DEBUG, POSTGIS_RT_DEBUGF, rt_iterator_arg_t::rasters, rtpg_nmapalgebraexpr_callback_arg::spi_argcount, rtpg_nmapalgebraexpr_callback_arg::spi_argpos, rtpg_nmapalgebraexpr_callback_arg::spi_plan, rt_iterator_arg_t::src_pixel, TRUE, rtpg_nmapalgebraexpr_callback_arg::val, and rt_iterator_arg_t::values.

Referenced by RASTER_nMapAlgebraExpr().

Here is the caller graph for this function: