Construct an rt_raster from a binary WKB representation.
283 {
284 const uint8_t *ptr = wkb;
285 const uint8_t *wkbend = NULL;
287 uint8_t endian = 0;
288 uint16_t version = 0;
289 uint16_t i = 0;
290 uint16_t j = 0;
291
292 assert(NULL != ptr);
293
294
296 rterror(
"rt_raster_from_wkb: wkb size (%" PRIu32
297 ") < min size (%zu)",
299 return NULL;
300 }
301 wkbend = wkb + wkbsize;
302
303 RASTER_DEBUGF(3,
"Parsing header from wkb position %zu (expected 0)",
304 d_binptr_to_pos(ptr, wkbend, wkbsize));
305
307
308
309 endian = *ptr;
310 ptr += 1;
311
312
314 if (version != 0) {
315 rterror(
"rt_raster_from_wkb: WKB version %d unsupported", version);
316 return NULL;
317 }
318
319
321 if (!rast) {
322 rterror(
"rt_raster_from_wkb: Out of memory allocating raster for wkb input");
323 return NULL;
324 }
325
336
337
338 assert(ptr <= wkbend);
339
352 RASTER_DEBUGF(3,
"Parsing raster header finished at wkb position %zu (expected 61)",
353 d_binptr_to_pos(ptr, wkbend, wkbsize));
354
356
357
358 if (!
rast->numBands) {
359
360 if (ptr < wkbend) {
361 rtwarn(
"%zu bytes of WKB remained unparsed", wkbend - ptr);
362 }
363 else if (ptr > wkbend) {
364
365 rtwarn(
"We parsed %zu bytes more then available!", ptr - wkbend);
366 }
367
370 }
371
372
375 rterror(
"rt_raster_from_wkb: Out of memory allocating bands for WKB raster decoding");
377 return NULL;
378 }
379
380
381
382 assert(ptr <= wkbend);
383
384 for (i = 0; i <
rast->numBands; ++i) {
386 d_binptr_to_pos(ptr, wkbend, wkbsize));
387
389 &ptr, wkbend, endian);
390 if (!band) {
391 rterror(
"rt_raster_from_wkb: Error reading WKB form of band %d", i);
394 return NULL;
395 }
396
399 }
400
401
402 if (ptr < wkbend) {
403 rtwarn(
"%zu bytes of WKB remained unparsed", wkbend - ptr);
404 }
405 else if (ptr > wkbend) {
406
407 rtwarn(
"We parsed %zu bytes more then available!", ptr - wkbend);
408 }
409
411}
int32_t clamp_srid(int32_t srid)
Return a valid SRID from an arbitrary integer Raises a notice if what comes out is different from wha...
void rterror(const char *fmt,...) __attribute__((format(printf
Wrappers used for reporting errors and info.
void * rtalloc(size_t size)
Wrappers used for managing memory.
#define RASTER_DEBUGF(level, msg,...)
void void void rtwarn(const char *fmt,...) __attribute__((format(printf
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
void rt_band_destroy(rt_band band)
Destroy a raster band.
struct rt_raster_t * rt_raster
Types definitions.
double read_float64(const uint8_t **from, uint8_t littleEndian)
int32_t read_int32(const uint8_t **from, uint8_t littleEndian)
uint16_t read_uint16(const uint8_t **from, uint8_t littleEndian)
#define CHECK_BINPTR_POSITION(ptr, end, size, pos)
static rt_band rt_band_from_wkb(uint16_t width, uint16_t height, const uint8_t **ptr, const uint8_t *end, uint8_t littleEndian)