PostGIS  3.4.0dev-r@@SVN_REVISION@@

◆ rt_raster_gdal_rasterize()

rt_raster rt_raster_gdal_rasterize ( const unsigned char *  wkb,
uint32_t  wkb_len,
const char *  srs,
uint32_t  num_bands,
rt_pixtype pixtype,
double *  init,
double *  value,
double *  nodata,
uint8_t *  hasnodata,
int *  width,
int *  height,
double *  scale_x,
double *  scale_y,
double *  ul_xw,
double *  ul_yw,
double *  grid_xw,
double *  grid_yw,
double *  skew_x,
double *  skew_y,
char **  options 
)

Return a raster of the provided geometry.

Parameters
wkb: WKB representation of the geometry to convert
wkb_len: length of the WKB representation of the geometry
srs: the geometry's coordinate system in OGC WKT
num_bands: number of bands in the output raster
pixtype: data type of each band
init: array of values to initialize each band with
value: array of values for pixels of geometry
nodata: array of nodata values for each band
hasnodata: array flagging the presence of nodata for each band
width: the number of columns of the raster
height: the number of rows of the raster
scale_x: the pixel width of the raster
scale_y: the pixel height of the raster
ul_xw: the X value of upper-left corner of the raster
ul_yw: the Y value of upper-left corner of the raster
grid_xw: the X value of point on grid to align raster to
grid_yw: the Y value of point on grid to align raster to
skew_x: the X skew of the raster
skew_y: the Y skew of the raster
options: array of options. only option is "ALL_TOUCHED"
Returns
the raster of the provided geometry or NULL

Definition at line 2618 of file rt_raster.c.

2630  {
2631  rt_raster rast = NULL;
2632  uint32_t i = 0;
2633  int err = 0;
2634 
2635  _rti_rasterize_arg arg = NULL;
2636 
2637  int _dim[2] = {0};
2638  double _scale[2] = {0};
2639  double _skew[2] = {0};
2640 
2641  OGRErr ogrerr;
2642  OGRGeometryH src_geom;
2643  OGREnvelope src_env;
2644  rt_envelope extent;
2645  OGRwkbGeometryType wkbtype = wkbUnknown;
2646 
2647  int ul_user = 0;
2648 
2649  CPLErr cplerr;
2650  double _gt[6] = {0};
2651  GDALDriverH _drv = NULL;
2652  int unload_drv = 0;
2653  GDALDatasetH _ds = NULL;
2654  GDALRasterBandH _band = NULL;
2655 
2656  uint16_t _width = 0;
2657  uint16_t _height = 0;
2658 
2659  RASTER_DEBUG(3, "starting");
2660 
2661  assert(NULL != wkb);
2662  assert(0 != wkb_len);
2663 
2664  /* internal variables */
2665  arg = _rti_rasterize_arg_init();
2666  if (arg == NULL) {
2667  rterror("rt_raster_gdal_rasterize: Could not initialize internal variables");
2668  return NULL;
2669  }
2670 
2671  /* no bands, raster is a mask */
2672  if (num_bands < 1) {
2673  arg->noband = 1;
2674  arg->numbands = 1;
2675 
2676  arg->pixtype = (rt_pixtype *) rtalloc(sizeof(rt_pixtype));
2677  arg->pixtype[0] = PT_8BUI;
2678 
2679  arg->init = (double *) rtalloc(sizeof(double));
2680  arg->init[0] = 0;
2681 
2682  arg->nodata = (double *) rtalloc(sizeof(double));
2683  arg->nodata[0] = 0;
2684 
2685  arg->hasnodata = (uint8_t *) rtalloc(sizeof(uint8_t));
2686  arg->hasnodata[0] = 1;
2687 
2688  arg->value = (double *) rtalloc(sizeof(double));
2689  arg->value[0] = 1;
2690  }
2691  else {
2692  arg->noband = 0;
2693  arg->numbands = num_bands;
2694 
2695  arg->pixtype = pixtype;
2696  arg->init = init;
2697  arg->nodata = nodata;
2698  arg->hasnodata = hasnodata;
2699  arg->value = value;
2700  }
2701 
2702  /* OGR spatial reference */
2703  if (NULL != srs && strlen(srs)) {
2704  arg->src_sr = OSRNewSpatialReference(NULL);
2705  if (OSRSetFromUserInput(arg->src_sr, srs) != OGRERR_NONE) {
2706  rterror("rt_raster_gdal_rasterize: Could not create OSR spatial reference using the provided srs: %s", srs);
2708  return NULL;
2709  }
2710  }
2711 
2712  /* convert WKB to OGR Geometry */
2713  ogrerr = OGR_G_CreateFromWkb((unsigned char *) wkb, arg->src_sr, &src_geom, wkb_len);
2714  if (ogrerr != OGRERR_NONE) {
2715  rterror("rt_raster_gdal_rasterize: Could not create OGR Geometry from WKB");
2716 
2718  /* OGRCleanupAll(); */
2719 
2720  return NULL;
2721  }
2722 
2723  /* OGR Geometry is empty */
2724  if (OGR_G_IsEmpty(src_geom)) {
2725  rtinfo("Geometry provided is empty. Returning empty raster");
2726 
2727  OGR_G_DestroyGeometry(src_geom);
2729  /* OGRCleanupAll(); */
2730 
2731  return rt_raster_new(0, 0);
2732  }
2733 
2734  /* get envelope */
2735  OGR_G_GetEnvelope(src_geom, &src_env);
2736  rt_util_from_ogr_envelope(src_env, &extent);
2737 
2738  RASTER_DEBUGF(3, "Suggested raster envelope: %f, %f, %f, %f",
2739  extent.MinX, extent.MinY, extent.MaxX, extent.MaxY);
2740 
2741  /* user-defined scale */
2742  if (
2743  (NULL != scale_x) &&
2744  (NULL != scale_y) &&
2745  (FLT_NEQ(*scale_x, 0.0)) &&
2746  (FLT_NEQ(*scale_y, 0.0))
2747  ) {
2748  /* for now, force scale to be in left-right, top-down orientation */
2749  _scale[0] = fabs(*scale_x);
2750  _scale[1] = fabs(*scale_y);
2751  }
2752  /* user-defined width/height */
2753  else if ((NULL != width) && (NULL != height) && (*width != 0) && (*height != 0))
2754  {
2755  _dim[0] = abs(*width);
2756  _dim[1] = abs(*height);
2757 
2758  if (FLT_NEQ(extent.MaxX, extent.MinX))
2759  _scale[0] = fabs((extent.MaxX - extent.MinX) / _dim[0]);
2760  else
2761  _scale[0] = 1.;
2762 
2763  if (FLT_NEQ(extent.MaxY, extent.MinY))
2764  _scale[1] = fabs((extent.MaxY - extent.MinY) / _dim[1]);
2765  else
2766  _scale[1] = 1.;
2767  }
2768  else {
2769  rterror("rt_raster_gdal_rasterize: Values must be provided for width and height or X and Y of scale");
2770 
2771  OGR_G_DestroyGeometry(src_geom);
2773  /* OGRCleanupAll(); */
2774 
2775  return NULL;
2776  }
2777  RASTER_DEBUGF(3, "scale (x, y) = %f, %f", _scale[0], -1 * _scale[1]);
2778  RASTER_DEBUGF(3, "dim (x, y) = %d, %d", _dim[0], _dim[1]);
2779 
2780  /* user-defined skew */
2781  if (NULL != skew_x) {
2782  _skew[0] = *skew_x;
2783 
2784  /*
2785  negative scale-x affects skew
2786  for now, force skew to be in left-right, top-down orientation
2787  */
2788  if (
2789  NULL != scale_x &&
2790  *scale_x < 0.
2791  ) {
2792  _skew[0] *= -1;
2793  }
2794  }
2795  if (NULL != skew_y) {
2796  _skew[1] = *skew_y;
2797 
2798  /*
2799  positive scale-y affects skew
2800  for now, force skew to be in left-right, top-down orientation
2801  */
2802  if (
2803  NULL != scale_y &&
2804  *scale_y > 0.
2805  ) {
2806  _skew[1] *= -1;
2807  }
2808  }
2809 
2810  /*
2811  if geometry is a point, a linestring or set of either and bounds not set,
2812  increase extent by a pixel to avoid missing points on border
2813 
2814  a whole pixel is used instead of half-pixel due to backward
2815  compatibility with GDAL 1.6, 1.7 and 1.8. 1.9+ works fine with half-pixel.
2816  */
2817  wkbtype = wkbFlatten(OGR_G_GetGeometryType(src_geom));
2818  if ((
2819  (wkbtype == wkbPoint) ||
2820  (wkbtype == wkbMultiPoint) ||
2821  (wkbtype == wkbLineString) ||
2822  (wkbtype == wkbMultiLineString)
2823  ) &&
2824  _dim[0] == 0 &&
2825  _dim[1] == 0
2826  ) {
2827 
2828 #if POSTGIS_GDAL_VERSION > 18
2829 
2830  RASTER_DEBUG(3, "Adjusting extent for GDAL > 1.8 by half the scale on X-axis");
2831  extent.MinX -= (_scale[0] / 2.);
2832  extent.MaxX += (_scale[0] / 2.);
2833 
2834  RASTER_DEBUG(3, "Adjusting extent for GDAL > 1.8 by half the scale on Y-axis");
2835  extent.MinY -= (_scale[1] / 2.);
2836  extent.MaxY += (_scale[1] / 2.);
2837 
2838 #else
2839 
2840  RASTER_DEBUG(3, "Adjusting extent for GDAL <= 1.8 by the scale on X-axis");
2841  extent.MinX -= _scale[0];
2842  extent.MaxX += _scale[0];
2843 
2844  RASTER_DEBUG(3, "Adjusting extent for GDAL <= 1.8 by the scale on Y-axis");
2845  extent.MinY -= _scale[1];
2846  extent.MaxY += _scale[1];
2847 
2848 #endif
2849 
2850 
2851  RASTER_DEBUGF(3, "Adjusted extent: %f, %f, %f, %f",
2852  extent.MinX, extent.MinY, extent.MaxX, extent.MaxY);
2853 
2854  extent.UpperLeftX = extent.MinX;
2855  extent.UpperLeftY = extent.MaxY;
2856  }
2857 
2858  /* reprocess extent if skewed */
2859  if (FLT_NEQ(_skew[0], 0.0) || FLT_NEQ(_skew[1], 0.0))
2860  {
2861  rt_raster skewedrast;
2862 
2863  RASTER_DEBUG(3, "Computing skewed extent's envelope");
2864 
2865  skewedrast = rt_raster_compute_skewed_raster(
2866  extent,
2867  _skew,
2868  _scale,
2869  0.01
2870  );
2871  if (skewedrast == NULL) {
2872  rterror("rt_raster_gdal_rasterize: Could not compute skewed raster");
2873 
2874  OGR_G_DestroyGeometry(src_geom);
2876  /* OGRCleanupAll(); */
2877 
2878  return NULL;
2879  }
2880 
2881  _dim[0] = skewedrast->width;
2882  _dim[1] = skewedrast->height;
2883 
2884  extent.UpperLeftX = skewedrast->ipX;
2885  extent.UpperLeftY = skewedrast->ipY;
2886 
2887  rt_raster_destroy(skewedrast);
2888  }
2889 
2890  /* raster dimensions */
2891  if (!_dim[0])
2892  _dim[0] = (int) fmax((fabs(extent.MaxX - extent.MinX) + (_scale[0] / 2.)) / _scale[0], 1);
2893  if (!_dim[1])
2894  _dim[1] = (int) fmax((fabs(extent.MaxY - extent.MinY) + (_scale[1] / 2.)) / _scale[1], 1);
2895 
2896  /* temporary raster */
2897  rast = rt_raster_new(_dim[0], _dim[1]);
2898  if (rast == NULL) {
2899  rterror("rt_raster_gdal_rasterize: Out of memory allocating temporary raster");
2900 
2901  OGR_G_DestroyGeometry(src_geom);
2903  /* OGRCleanupAll(); */
2904 
2905  return NULL;
2906  }
2907 
2908  /* set raster's spatial attributes */
2910  rt_raster_set_scale(rast, _scale[0], -1 * _scale[1]);
2911  rt_raster_set_skews(rast, _skew[0], _skew[1]);
2912 
2914  RASTER_DEBUGF(3, "Temp raster's geotransform: %f, %f, %f, %f, %f, %f",
2915  _gt[0], _gt[1], _gt[2], _gt[3], _gt[4], _gt[5]);
2916  RASTER_DEBUGF(3, "Temp raster's dimensions (width x height): %d x %d",
2917  _dim[0], _dim[1]);
2918 
2919  /* user-specified upper-left corner */
2920  if (
2921  NULL != ul_xw &&
2922  NULL != ul_yw
2923  ) {
2924  ul_user = 1;
2925 
2926  RASTER_DEBUGF(4, "Using user-specified upper-left corner: %f, %f", *ul_xw, *ul_yw);
2927 
2928  /* set upper-left corner */
2929  rt_raster_set_offsets(rast, *ul_xw, *ul_yw);
2930  extent.UpperLeftX = *ul_xw;
2931  extent.UpperLeftY = *ul_yw;
2932  }
2933  else if (
2934  ((NULL != ul_xw) && (NULL == ul_yw)) ||
2935  ((NULL == ul_xw) && (NULL != ul_yw))
2936  ) {
2937  rterror("rt_raster_gdal_rasterize: Both X and Y upper-left corner values must be provided");
2938 
2940  OGR_G_DestroyGeometry(src_geom);
2942  /* OGRCleanupAll(); */
2943 
2944  return NULL;
2945  }
2946 
2947  /* alignment only considered if upper-left corner not provided */
2948  if (
2949  !ul_user && (
2950  (NULL != grid_xw) || (NULL != grid_yw)
2951  )
2952  ) {
2953 
2954  if (
2955  ((NULL != grid_xw) && (NULL == grid_yw)) ||
2956  ((NULL == grid_xw) && (NULL != grid_yw))
2957  ) {
2958  rterror("rt_raster_gdal_rasterize: Both X and Y alignment values must be provided");
2959 
2961  OGR_G_DestroyGeometry(src_geom);
2963  /* OGRCleanupAll(); */
2964 
2965  return NULL;
2966  }
2967 
2968  RASTER_DEBUGF(4, "Aligning extent to user-specified grid: %f, %f", *grid_xw, *grid_yw);
2969 
2970  do {
2971  double _r[2] = {0};
2972  double _w[2] = {0};
2973 
2974  /* raster is already aligned */
2975  if (DBL_EQ(*grid_xw, extent.UpperLeftX) && DBL_EQ(*grid_yw, extent.UpperLeftY)) {
2976  RASTER_DEBUG(3, "Skipping raster alignment as it is already aligned to grid");
2977  break;
2978  }
2979 
2980  extent.UpperLeftX = rast->ipX;
2981  extent.UpperLeftY = rast->ipY;
2982  rt_raster_set_offsets(rast, *grid_xw, *grid_yw);
2983 
2984  /* process upper-left corner */
2986  rast,
2987  extent.UpperLeftX, extent.UpperLeftY,
2988  &(_r[0]), &(_r[1]),
2989  NULL
2990  ) != ES_NONE) {
2991  rterror("rt_raster_gdal_rasterize: Could not compute raster pixel for spatial coordinates");
2992 
2994  OGR_G_DestroyGeometry(src_geom);
2996  /* OGRCleanupAll(); */
2997 
2998  return NULL;
2999  }
3000 
3002  rast,
3003  _r[0], _r[1],
3004  &(_w[0]), &(_w[1]),
3005  NULL
3006  ) != ES_NONE) {
3007  rterror("rt_raster_gdal_rasterize: Could not compute spatial coordinates for raster pixel");
3008 
3010  OGR_G_DestroyGeometry(src_geom);
3012  /* OGRCleanupAll(); */
3013 
3014  return NULL;
3015  }
3016 
3017  /* shift occurred */
3018  if (FLT_NEQ(_w[0], extent.UpperLeftX)) {
3019  if (NULL == width)
3020  rast->width++;
3021  else if (NULL == scale_x) {
3022  double _c[2] = {0};
3023 
3025 
3026  /* get upper-right corner */
3028  rast,
3029  rast->width, 0,
3030  &(_c[0]), &(_c[1]),
3031  NULL
3032  ) != ES_NONE) {
3033  rterror("rt_raster_gdal_rasterize: Could not compute spatial coordinates for raster pixel");
3034 
3036  OGR_G_DestroyGeometry(src_geom);
3038  /* OGRCleanupAll(); */
3039 
3040  return NULL;
3041  }
3042 
3043  rast->scaleX = fabs((_c[0] - _w[0]) / ((double) rast->width));
3044  }
3045  }
3046  if (FLT_NEQ(_w[1], extent.UpperLeftY)) {
3047  if (NULL == height)
3048  rast->height++;
3049  else if (NULL == scale_y) {
3050  double _c[2] = {0};
3051 
3053 
3054  /* get upper-right corner */
3056  rast,
3057  0, rast->height,
3058  &(_c[0]), &(_c[1]),
3059  NULL
3060  ) != ES_NONE) {
3061  rterror("rt_raster_gdal_rasterize: Could not compute spatial coordinates for raster pixel");
3062 
3064  OGR_G_DestroyGeometry(src_geom);
3066  /* OGRCleanupAll(); */
3067 
3068  return NULL;
3069  }
3070 
3071  rast->scaleY = -1 * fabs((_c[1] - _w[1]) / ((double) rast->height));
3072  }
3073  }
3074 
3075  rt_raster_set_offsets(rast, _w[0], _w[1]);
3076  }
3077  while (0);
3078  }
3079 
3080  /*
3081  after this point, rt_envelope extent is no longer used
3082  */
3083 
3084  /* get key attributes from rast */
3085  _dim[0] = rast->width;
3086  _dim[1] = rast->height;
3088 
3089  /* scale-x is negative or scale-y is positive */
3090  if ((
3091  (NULL != scale_x) && (*scale_x < 0.)
3092  ) || (
3093  (NULL != scale_y) && (*scale_y > 0)
3094  )) {
3095  double _w[2] = {0};
3096 
3097  /* negative scale-x */
3098  if (
3099  (NULL != scale_x) &&
3100  (*scale_x < 0.)
3101  ) {
3102  RASTER_DEBUG(3, "Processing negative scale-x");
3103 
3105  rast,
3106  _dim[0], 0,
3107  &(_w[0]), &(_w[1]),
3108  NULL
3109  ) != ES_NONE) {
3110  rterror("rt_raster_gdal_rasterize: Could not compute spatial coordinates for raster pixel");
3111 
3113  OGR_G_DestroyGeometry(src_geom);
3115  /* OGRCleanupAll(); */
3116 
3117  return NULL;
3118  }
3119 
3120  _gt[0] = _w[0];
3121  _gt[1] = *scale_x;
3122 
3123  /* check for skew */
3124  if (NULL != skew_x && FLT_NEQ(*skew_x, 0.0))
3125  _gt[2] = *skew_x;
3126  }
3127  /* positive scale-y */
3128  if (
3129  (NULL != scale_y) &&
3130  (*scale_y > 0)
3131  ) {
3132  RASTER_DEBUG(3, "Processing positive scale-y");
3133 
3135  rast,
3136  0, _dim[1],
3137  &(_w[0]), &(_w[1]),
3138  NULL
3139  ) != ES_NONE) {
3140  rterror("rt_raster_gdal_rasterize: Could not compute spatial coordinates for raster pixel");
3141 
3143  OGR_G_DestroyGeometry(src_geom);
3145  /* OGRCleanupAll(); */
3146 
3147  return NULL;
3148  }
3149 
3150  _gt[3] = _w[1];
3151  _gt[5] = *scale_y;
3152 
3153  /* check for skew */
3154  if (NULL != skew_y && FLT_NEQ(*skew_y, 0.0))
3155  _gt[4] = *skew_y;
3156  }
3157  }
3158 
3160  rast = NULL;
3161 
3162  RASTER_DEBUGF(3, "Applied geotransform: %f, %f, %f, %f, %f, %f",
3163  _gt[0], _gt[1], _gt[2], _gt[3], _gt[4], _gt[5]);
3164  RASTER_DEBUGF(3, "Raster dimensions (width x height): %d x %d",
3165  _dim[0], _dim[1]);
3166 
3167  /* load GDAL mem */
3168  if (!rt_util_gdal_driver_registered("MEM")) {
3169  RASTER_DEBUG(4, "Registering MEM driver");
3170  GDALRegister_MEM();
3171  unload_drv = 1;
3172  }
3173  _drv = GDALGetDriverByName("MEM");
3174  if (NULL == _drv) {
3175  rterror("rt_raster_gdal_rasterize: Could not load the MEM GDAL driver");
3176 
3177  OGR_G_DestroyGeometry(src_geom);
3179  /* OGRCleanupAll(); */
3180 
3181  return NULL;
3182  }
3183 
3184  /* unload driver from GDAL driver manager */
3185  if (unload_drv) {
3186  RASTER_DEBUG(4, "Deregistering MEM driver");
3187  GDALDeregisterDriver(_drv);
3188  }
3189 
3190  _ds = GDALCreate(_drv, "", _dim[0], _dim[1], 0, GDT_Byte, NULL);
3191  if (NULL == _ds) {
3192  rterror("rt_raster_gdal_rasterize: Could not create a GDALDataset to rasterize the geometry into");
3193 
3194  OGR_G_DestroyGeometry(src_geom);
3196  /* OGRCleanupAll(); */
3197  if (unload_drv) GDALDestroyDriver(_drv);
3198 
3199  return NULL;
3200  }
3201 
3202  /* set geotransform */
3203  cplerr = GDALSetGeoTransform(_ds, _gt);
3204  if (cplerr != CE_None) {
3205  rterror("rt_raster_gdal_rasterize: Could not set geotransform on GDALDataset");
3206 
3207  OGR_G_DestroyGeometry(src_geom);
3209  /* OGRCleanupAll(); */
3210 
3211  GDALClose(_ds);
3212  if (unload_drv) GDALDestroyDriver(_drv);
3213 
3214  return NULL;
3215  }
3216 
3217  /* set SRS */
3218  if (NULL != arg->src_sr) {
3219  char *_srs = NULL;
3220  OSRExportToWkt(arg->src_sr, &_srs);
3221 
3222  cplerr = GDALSetProjection(_ds, _srs);
3223  CPLFree(_srs);
3224  if (cplerr != CE_None) {
3225  rterror("rt_raster_gdal_rasterize: Could not set projection on GDALDataset");
3226 
3227  OGR_G_DestroyGeometry(src_geom);
3229  /* OGRCleanupAll(); */
3230 
3231  GDALClose(_ds);
3232  if (unload_drv) GDALDestroyDriver(_drv);
3233 
3234  return NULL;
3235  }
3236  }
3237 
3238  /* set bands */
3239  for (i = 0; i < arg->numbands; i++) {
3240  err = 0;
3241 
3242  do {
3243  /* add band */
3244  cplerr = GDALAddBand(_ds, rt_util_pixtype_to_gdal_datatype(arg->pixtype[i]), NULL);
3245  if (cplerr != CE_None) {
3246  rterror("rt_raster_gdal_rasterize: Could not add band to GDALDataset");
3247  err = 1;
3248  break;
3249  }
3250 
3251  _band = GDALGetRasterBand(_ds, i + 1);
3252  if (NULL == _band) {
3253  rterror("rt_raster_gdal_rasterize: Could not get band %d from GDALDataset", i + 1);
3254  err = 1;
3255  break;
3256  }
3257 
3258  /* nodata value */
3259  if (arg->hasnodata[i]) {
3260  RASTER_DEBUGF(4, "Setting NODATA value of band %d to %f", i, arg->nodata[i]);
3261  cplerr = GDALSetRasterNoDataValue(_band, arg->nodata[i]);
3262  if (cplerr != CE_None) {
3263  rterror("rt_raster_gdal_rasterize: Could not set nodata value");
3264  err = 1;
3265  break;
3266  }
3267  RASTER_DEBUGF(4, "NODATA value set to %f", GDALGetRasterNoDataValue(_band, NULL));
3268  }
3269 
3270  /* initial value */
3271  cplerr = GDALFillRaster(_band, arg->init[i], 0);
3272  if (cplerr != CE_None) {
3273  rterror("rt_raster_gdal_rasterize: Could not set initial value");
3274  err = 1;
3275  break;
3276  }
3277  }
3278  while (0);
3279 
3280  if (err) {
3281 
3282  OGR_G_DestroyGeometry(src_geom);
3284 
3285  /* OGRCleanupAll(); */
3286 
3287  GDALClose(_ds);
3288  if (unload_drv) GDALDestroyDriver(_drv);
3289 
3290  return NULL;
3291  }
3292  }
3293 
3294  arg->bandlist = (int *) rtalloc(sizeof(int) * arg->numbands);
3295  for (i = 0; i < arg->numbands; i++) arg->bandlist[i] = i + 1;
3296 
3297  /* burn geometry */
3298  cplerr = GDALRasterizeGeometries(
3299  _ds,
3300  arg->numbands, arg->bandlist,
3301  1, &src_geom,
3302  NULL, NULL,
3303  arg->value,
3304  options,
3305  NULL, NULL
3306  );
3307  if (cplerr != CE_None) {
3308  rterror("rt_raster_gdal_rasterize: Could not rasterize geometry");
3309 
3310  OGR_G_DestroyGeometry(src_geom);
3312  /* OGRCleanupAll(); */
3313 
3314  GDALClose(_ds);
3315  if (unload_drv) GDALDestroyDriver(_drv);
3316 
3317  return NULL;
3318  }
3319 
3320  /* convert gdal dataset to raster */
3321  GDALFlushCache(_ds);
3322  RASTER_DEBUG(3, "Converting GDAL dataset to raster");
3324 
3325  OGR_G_DestroyGeometry(src_geom);
3326  /* OGRCleanupAll(); */
3327 
3328  GDALClose(_ds);
3329  if (unload_drv) GDALDestroyDriver(_drv);
3330 
3331  if (NULL == rast) {
3332  rterror("rt_raster_gdal_rasterize: Could not rasterize geometry");
3333  return NULL;
3334  }
3335 
3336  /* width, height */
3337  _width = rt_raster_get_width(rast);
3338  _height = rt_raster_get_height(rast);
3339 
3340  /* check each band for pixtype */
3341  for (i = 0; i < arg->numbands; i++) {
3342  uint8_t *data = NULL;
3343  rt_band band = NULL;
3344  rt_band oldband = NULL;
3345 
3346  double val = 0;
3347  int nodata = 0;
3348  int hasnodata = 0;
3349  double nodataval = 0;
3350  int x = 0;
3351  int y = 0;
3352 
3353  oldband = rt_raster_get_band(rast, i);
3354  if (oldband == NULL) {
3355  rterror("rt_raster_gdal_rasterize: Could not get band %d of output raster", i);
3358  return NULL;
3359  }
3360 
3361  /* band is of user-specified type */
3362  if (rt_band_get_pixtype(oldband) == arg->pixtype[i])
3363  continue;
3364 
3365  /* hasnodata, nodataval */
3366  hasnodata = rt_band_get_hasnodata_flag(oldband);
3367  if (hasnodata)
3368  rt_band_get_nodata(oldband, &nodataval);
3369 
3370  /* allocate data */
3371  data = rtalloc(rt_pixtype_size(arg->pixtype[i]) * _width * _height);
3372  if (data == NULL) {
3373  rterror("rt_raster_gdal_rasterize: Could not allocate memory for band data");
3376  return NULL;
3377  }
3378  memset(data, 0, rt_pixtype_size(arg->pixtype[i]) * _width * _height);
3379 
3380  /* create new band of correct type */
3382  _width, _height,
3383  arg->pixtype[i],
3384  hasnodata, nodataval,
3385  data
3386  );
3387  if (band == NULL) {
3388  rterror("rt_raster_gdal_rasterize: Could not create band");
3389  rtdealloc(data);
3392  return NULL;
3393  }
3394 
3395  /* give ownership of data to band */
3397 
3398  /* copy pixel by pixel */
3399  for (x = 0; x < _width; x++) {
3400  for (y = 0; y < _height; y++) {
3401  err = rt_band_get_pixel(oldband, x, y, &val, &nodata);
3402  if (err != ES_NONE) {
3403  rterror("rt_raster_gdal_rasterize: Could not get pixel value");
3407  return NULL;
3408  }
3409 
3410  if (nodata)
3411  val = nodataval;
3412 
3413  err = rt_band_set_pixel(band, x, y, val, NULL);
3414  if (err != ES_NONE) {
3415  rterror("rt_raster_gdal_rasterize: Could not set pixel value");
3419  return NULL;
3420  }
3421  }
3422  }
3423 
3424  /* replace band */
3425  oldband = rt_raster_replace_band(rast, band, i);
3426  if (oldband == NULL) {
3427  rterror("rt_raster_gdal_rasterize: Could not replace band %d of output raster", i);
3431  return NULL;
3432  }
3433 
3434  /* free oldband */
3435  rt_band_destroy(oldband);
3436  }
3437 
3439 
3440  RASTER_DEBUG(3, "done");
3441 
3442  return rast;
3443 }
rt_band rt_band_new_inline(uint16_t width, uint16_t height, rt_pixtype pixtype, uint32_t hasnodata, double nodataval, uint8_t *data)
Create an in-db rt_band with no data.
Definition: rt_band.c:63
void rt_band_set_ownsdata_flag(rt_band band, int flag)
Definition: rt_band.c:667
void rterror(const char *fmt,...)
Wrappers used for reporting errors and info.
Definition: rt_context.c:219
void * rtalloc(size_t size)
Wrappers used for managing memory.
Definition: rt_context.c:191
#define FLT_NEQ(x, y)
Definition: librtcore.h:2386
#define RASTER_DEBUG(level, msg)
Definition: librtcore.h:302
#define RASTER_DEBUGF(level, msg,...)
Definition: librtcore.h:306
void rtinfo(const char *fmt,...)
Definition: rt_context.c:231
int rt_band_get_hasnodata_flag(rt_band band)
Get hasnodata flag value.
Definition: rt_band.c:674
rt_errorstate rt_band_get_pixel(rt_band band, int x, int y, double *value, int *nodata)
Get pixel value.
Definition: rt_band.c:1376
rt_pixtype
Definition: librtcore.h:187
@ PT_8BUI
Definition: librtcore.h:192
GDALDataType rt_util_pixtype_to_gdal_datatype(rt_pixtype pt)
Convert rt_pixtype to GDALDataType.
Definition: rt_util.c:124
rt_errorstate rt_band_set_pixel(rt_band band, int x, int y, double val, int *converted)
Set single pixel's value.
Definition: rt_band.c:974
@ ES_NONE
Definition: librtcore.h:182
void rt_band_destroy(rt_band band)
Destroy a raster band.
Definition: rt_band.c:340
#define DBL_EQ(x, y)
Definition: librtcore.h:2389
int rt_util_gdal_driver_registered(const char *drv)
Definition: rt_util.c:361
rt_errorstate rt_band_get_nodata(rt_band band, double *nodata)
Get NODATA value.
Definition: rt_band.c:1887
rt_pixtype rt_band_get_pixtype(rt_band band)
Return pixeltype of this band.
Definition: rt_band.c:631
void rtdealloc(void *mem)
Definition: rt_context.c:206
void rt_util_from_ogr_envelope(OGREnvelope env, rt_envelope *ext)
Definition: rt_util.c:457
int rt_pixtype_size(rt_pixtype pixtype)
Return size in bytes of a value in the given pixtype.
Definition: rt_pixel.c:39
int value
Definition: genraster.py:62
band
Definition: ovdump.py:58
data
Definition: ovdump.py:104
rt_errorstate rt_raster_cell_to_geopoint(rt_raster raster, double xr, double yr, double *xw, double *yw, double *gt)
Convert an xr, yr raster point to an xw, yw point on map.
Definition: rt_raster.c:759
void rt_raster_set_scale(rt_raster raster, double scaleX, double scaleY)
Set scale in projection units.
Definition: rt_raster.c:141
rt_errorstate rt_raster_geopoint_to_cell(rt_raster raster, double xw, double yw, double *xr, double *yr, double *igt)
Convert an xw,yw map point to a xr,yr cell coordinate.
Definition: rt_raster.c:808
void rt_raster_destroy(rt_raster raster)
Release memory associated to a raster.
Definition: rt_raster.c:86
void rt_raster_set_skews(rt_raster raster, double skewX, double skewY)
Set skews about the X and Y axis.
Definition: rt_raster.c:172
rt_raster rt_raster_new(uint32_t width, uint32_t height)
Construct a raster with given dimensions.
Definition: rt_raster.c:52
rt_raster rt_raster_compute_skewed_raster(rt_envelope extent, double *skew, double *scale, double tolerance)
Definition: rt_raster.c:991
rt_raster rt_raster_from_gdal_dataset(GDALDatasetH ds)
Return a raster from a GDAL dataset.
Definition: rt_raster.c:2291
static void _rti_rasterize_arg_destroy(_rti_rasterize_arg arg)
Definition: rt_raster.c:2568
rt_band rt_raster_replace_band(rt_raster raster, rt_band band, int index)
Replace band at provided index with new band.
Definition: rt_raster.c:1526
uint16_t rt_raster_get_height(rt_raster raster)
Definition: rt_raster.c:133
rt_band rt_raster_get_band(rt_raster raster, int n)
Return Nth band, or NULL if unavailable.
Definition: rt_raster.c:385
uint16_t rt_raster_get_width(rt_raster raster)
Definition: rt_raster.c:125
static _rti_rasterize_arg _rti_rasterize_arg_init()
Definition: rt_raster.c:2542
void rt_raster_get_geotransform_matrix(rt_raster raster, double *gt)
Get 6-element array of raster geotransform matrix.
Definition: rt_raster.c:710
void rt_raster_set_offsets(rt_raster raster, double x, double y)
Set insertion points in projection units.
Definition: rt_raster.c:203
rt_pixtype * pixtype
Definition: rt_raster.c:2533
OGRSpatialReferenceH src_sr
Definition: rt_raster.c:2531
double MinX
Definition: librtcore.h:167
double UpperLeftY
Definition: librtcore.h:173
double UpperLeftX
Definition: librtcore.h:172
double MaxX
Definition: librtcore.h:168
double MinY
Definition: librtcore.h:169
double MaxY
Definition: librtcore.h:170
uint16_t width
Definition: librtcore.h:2454
double ipX
Definition: librtcore.h:2448
uint16_t height
Definition: librtcore.h:2455
double ipY
Definition: librtcore.h:2449

References _rti_rasterize_arg_destroy(), _rti_rasterize_arg_init(), ovdump::band, _rti_rasterize_arg_t::bandlist, ovdump::data, DBL_EQ, ES_NONE, FLT_NEQ, _rti_rasterize_arg_t::hasnodata, rt_raster_t::height, _rti_rasterize_arg_t::init, rt_raster_t::ipX, rt_raster_t::ipY, rt_envelope::MaxX, rt_envelope::MaxY, rt_envelope::MinX, rt_envelope::MinY, _rti_rasterize_arg_t::noband, _rti_rasterize_arg_t::nodata, _rti_rasterize_arg_t::numbands, _rti_rasterize_arg_t::pixtype, PT_8BUI, rtpixdump::rast, RASTER_DEBUG, RASTER_DEBUGF, rt_band_destroy(), rt_band_get_hasnodata_flag(), rt_band_get_nodata(), rt_band_get_pixel(), rt_band_get_pixtype(), rt_band_new_inline(), rt_band_set_ownsdata_flag(), rt_band_set_pixel(), rt_pixtype_size(), rt_raster_cell_to_geopoint(), rt_raster_compute_skewed_raster(), rt_raster_destroy(), rt_raster_from_gdal_dataset(), rt_raster_geopoint_to_cell(), rt_raster_get_band(), rt_raster_get_geotransform_matrix(), rt_raster_get_height(), rt_raster_get_width(), rt_raster_new(), rt_raster_replace_band(), rt_raster_set_offsets(), rt_raster_set_scale(), rt_raster_set_skews(), rt_util_from_ogr_envelope(), rt_util_gdal_driver_registered(), rt_util_pixtype_to_gdal_datatype(), rtalloc(), rtdealloc(), rterror(), rtinfo(), _rti_rasterize_arg_t::src_sr, rt_envelope::UpperLeftX, rt_envelope::UpperLeftY, _rti_rasterize_arg_t::value, genraster::value, rt_raster_t::width, pixval::x, and pixval::y.

Referenced by RASTER_asRaster(), RASTER_clip(), RASTER_setPixelValuesGeomval(), and test_gdal_rasterize().

Here is the call graph for this function:
Here is the caller graph for this function: