Return this raster in WKB form.
497 {
498
499#if POSTGIS_DEBUG_LEVEL > 0
500 const uint8_t *wkbend = NULL;
501#endif
502
503 uint8_t *wkb = NULL;
504 uint8_t *ptr = NULL;
505 uint16_t i = 0;
507
508 assert(NULL != raster);
509 assert(NULL != wkbsize);
510
511 RASTER_DEBUG(2,
"rt_raster_to_wkb: about to call rt_raster_wkb_size");
512
514 RASTER_DEBUGF(3,
"rt_raster_to_wkb: found size: %d", *wkbsize);
515
516 wkb = (uint8_t*)
rtalloc(*wkbsize);
517 if (!wkb) {
518 rterror(
"rt_raster_to_wkb: Out of memory allocating WKB for raster");
519 return NULL;
520 }
521
522 ptr = wkb;
523
524#if POSTGIS_DEBUG_LEVEL > 2
525 wkbend = ptr + (*wkbsize);
526#endif
527 RASTER_DEBUGF(3,
"Writing raster header to wkb on position %zu (expected 0)",
528 d_binptr_to_pos(ptr, wkbend, *wkbsize));
529
530
531 *ptr = littleEndian;
532 ptr += 1;
533
534
536
537
540
541 RASTER_DEBUGF(3,
"Writing bands header to wkb position %zu (expected 61)",
542 d_binptr_to_pos(ptr, wkbend, *wkbsize));
543
544
545 for (i = 0; i <
raster->numBands; ++i) {
549
551 RASTER_DEBUGF(3,
"Writing band pixel type to wkb position %zu",
552 d_binptr_to_pos(ptr, wkbend, *wkbsize));
553
554 if (pixbytes < 1) {
555 rterror(
"rt_raster_to_wkb: Corrupted band: unknown pixtype");
557 return NULL;
558 }
559
560
561 *ptr =
band->pixtype;
565 ptr += 1;
566
567#if 0
568
569
570 if (pixbytes > 1) {
571 memset(ptr, '\0', pixbytes - 1);
572 ptr += pixbytes - 1;
573 }
574
575 assert(!(((uint64_t) ptr) % pixbytes));
576#endif
577
579 d_binptr_to_pos(ptr, wkbend, *wkbsize));
580
581
582 switch (pixtype) {
587 uint8_t v =
band->nodataval;
588 *ptr = v;
589 ptr += 1;
590 break;
591 }
593 int8_t v =
band->nodataval;
594 *ptr = (uint8_t)v;
595 ptr += 1;
596 break;
597 }
599 int16_t v =
band->nodataval;
600 memcpy(ptr, &v, 2);
601 ptr += 2;
602 break;
603 }
605 uint16_t v =
band->nodataval;
606 memcpy(ptr, &v, 2);
607 ptr += 2;
608 break;
609 }
611 int32_t v =
band->nodataval;
612 memcpy(ptr, &v, 4);
613 ptr += 4;
614 break;
615 }
617 uint32_t v =
band->nodataval;
618 memcpy(ptr, &v, 4);
619 ptr += 4;
620 break;
621 }
623 float v =
band->nodataval;
624 memcpy(ptr, &v, 4);
625 ptr += 4;
626 break;
627 }
629 memcpy(ptr, &
band->nodataval, 8);
630 ptr += 8;
631 break;
632 }
633 default:
634 rterror(
"rt_raster_to_wkb: Fatal error caused by unknown pixel type. Aborting.");
636 abort();
637 return 0;
638 }
639
640#if 0
641
642
643 assert(!((uint64_t) ptr % pixbytes));
644#endif
645
646 if (!outasin &&
band->offline) {
647
648 *ptr =
band->data.offline.bandNum;
649 ptr += 1;
650
651
652 strcpy((
char*) ptr,
band->data.offline.path);
653 ptr += strlen(
band->data.offline.path) + 1;
654 }
655 else {
656
657 uint32_t datasize =
raster->width *
raster->height * pixbytes;
658 RASTER_DEBUGF(4,
"rt_raster_to_wkb: Copying %d bytes", datasize);
659
661
662 ptr += datasize;
663 }
664
665#if 0
666
667
668 while ((uint64_t) ptr % 8) {
669 *ptr = 0;
670 ++ptr;
671 }
672
673
674 assert(!((uint64_t) ptr % pixbytes));
675#endif
676 }
677
678 return wkb;
679}
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_DEBUG(level, msg)
#define RASTER_DEBUGF(level, msg,...)
void * rt_band_get_data(rt_band band)
Get pointer to raster band data.
void rtdealloc(void *mem)
int rt_pixtype_size(rt_pixtype pixtype)
Return size in bytes of a value in the given pixtype.
raster
Be careful!! Zeros function's input parameter can be a (height x width) array, not (width x height): ...
uint8_t isMachineLittleEndian(void)
void write_uint16(uint8_t **to, uint8_t littleEndian, uint16_t v)
#define BANDTYPE_FLAG_HASNODATA
#define BANDTYPE_FLAG_OFFDB
#define BANDTYPE_FLAG_ISNODATA
static uint32_t rt_raster_wkb_size(rt_raster raster, int outasin)