Return this raster in WKB form.
502 {
503
504#if POSTGIS_DEBUG_LEVEL > 0
505 const uint8_t *wkbend = NULL;
506#endif
507
508 uint8_t *wkb = NULL;
509 uint8_t *ptr = NULL;
510 uint16_t i = 0;
512
513 assert(NULL != raster);
514 assert(NULL != wkbsize);
515
516 RASTER_DEBUG(2,
"rt_raster_to_wkb: about to call rt_raster_wkb_size");
517
519 RASTER_DEBUGF(3,
"rt_raster_to_wkb: found size: %d", *wkbsize);
520
521 wkb = (uint8_t*)
rtalloc(*wkbsize);
522 if (!wkb) {
523 rterror(
"rt_raster_to_wkb: Out of memory allocating WKB for raster");
524 return NULL;
525 }
526
527 ptr = wkb;
528
529#if POSTGIS_DEBUG_LEVEL > 2
530 wkbend = ptr + (*wkbsize);
531#endif
532 RASTER_DEBUGF(3,
"Writing raster header to wkb on position %zu (expected 0)",
533 d_binptr_to_pos(ptr, wkbend, *wkbsize));
534
535
536 *ptr = littleEndian;
537 ptr += 1;
538
539
541
542
545
546 RASTER_DEBUGF(3,
"Writing bands header to wkb position %zu (expected 61)",
547 d_binptr_to_pos(ptr, wkbend, *wkbsize));
548
549
550 for (i = 0; i <
raster->numBands; ++i) {
554
556 RASTER_DEBUGF(3,
"Writing band pixel type to wkb position %zu",
557 d_binptr_to_pos(ptr, wkbend, *wkbsize));
558
559 if (pixbytes < 1) {
560 rterror(
"rt_raster_to_wkb: Corrupted band: unknown pixtype");
562 return NULL;
563 }
564
565
566 *ptr =
band->pixtype;
570 ptr += 1;
571
572#if 0
573
574
575 if (pixbytes > 1) {
576 memset(ptr, '\0', pixbytes - 1);
577 ptr += pixbytes - 1;
578 }
579
580 assert(!(((uint64_t) ptr) % pixbytes));
581#endif
582
584 d_binptr_to_pos(ptr, wkbend, *wkbsize));
585
586
587 switch (pixtype) {
592 uint8_t v =
band->nodataval;
593 *ptr = v;
594 ptr += 1;
595 break;
596 }
598 int8_t v =
band->nodataval;
599 *ptr = (uint8_t)v;
600 ptr += 1;
601 break;
602 }
604 int16_t v =
band->nodataval;
605 memcpy(ptr, &v, 2);
606 ptr += 2;
607 break;
608 }
610 uint16_t v =
band->nodataval;
611 memcpy(ptr, &v, 2);
612 ptr += 2;
613 break;
614 }
616 int32_t v =
band->nodataval;
617 memcpy(ptr, &v, 4);
618 ptr += 4;
619 break;
620 }
622 uint32_t v =
band->nodataval;
623 memcpy(ptr, &v, 4);
624 ptr += 4;
625 break;
626 }
629 memcpy(ptr, &v, 2);
630 ptr += 2;
631 break;
632 }
634 float v =
band->nodataval;
635 memcpy(ptr, &v, 4);
636 ptr += 4;
637 break;
638 }
640 memcpy(ptr, &
band->nodataval, 8);
641 ptr += 8;
642 break;
643 }
644 default:
645 rterror(
"rt_raster_to_wkb: Fatal error caused by unknown pixel type. Aborting.");
647 abort();
648 return 0;
649 }
650
651#if 0
652
653
654 assert(!((uint64_t) ptr % pixbytes));
655#endif
656
657 if (!outasin &&
band->offline) {
658
659 *ptr =
band->data.offline.bandNum;
660 ptr += 1;
661
662
663 strcpy((
char*) ptr,
band->data.offline.path);
664 ptr += strlen(
band->data.offline.path) + 1;
665 }
666 else {
667
668 uint32_t datasize =
raster->width *
raster->height * pixbytes;
669 RASTER_DEBUGF(4,
"rt_raster_to_wkb: Copying %d bytes", datasize);
670
672
673 ptr += datasize;
674 }
675
676#if 0
677
678
679 while ((uint64_t) ptr % 8) {
680 *ptr = 0;
681 ++ptr;
682 }
683
684
685 assert(!((uint64_t) ptr % pixbytes));
686#endif
687 }
688
689 return wkb;
690}
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,...)
uint16_t rt_util_float_to_float16(float value)
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)