3

I'd like to know how to use the Python/GDAL function RasterizeLayer to create a raster layer, where each pixel give the maximum value of a integer attribute. According to docs and forums, if I use :

gdal.RasterizeLayer(out_raster_ds, # output to our new dataset
 [1], # output to our new dataset's first band
 layer, # rasterize this layer
 None, None, # don't worry about transformations since we're in same projection
 [0], # burn value 0
 ['ALL_TOUCHED=TRUE', # rasterize all pixels touched by polygons
 'ATTRIBUTE=id'] # put raster values according to the 'id' field values
 )

This will use the value of "id". But in my case, each raster cell intersects many spatial data (from PostGIS), and I want to keep the highest value.

Any idea ?

PolyGeo
65.5k29 gold badges115 silver badges350 bronze badges
asked Nov 28, 2017 at 15:38
1
  • No answers for this question? It's a bit blocking for our processing... It seems a similar question was asked more than a year ago, without answer : gis.stackexchange.com/questions/206120/… Commented Dec 11, 2017 at 10:06

2 Answers 2

1

I would also be very interested in a nice an easy solution for this problem.

We also had to do something similar and ended using a tricky solution because we could not find any other solution using GDAL. Hope this might help...

In our case we also had to output the individual layers in individual GeoTIFF before merging them together using the maximum value where there is overlap.

  1. Create all the individual GeoTIFF, using gdal.RasterizeLayer (No overlap here because you rasterize the individual layers).
  2. Use gdalwarp to reproject the individual GeoTIFF with the same spatial resolution and extent.
  3. Use gdal_calc.py to create a mosaic using the maximum value (gdal_calc.py -A input1.tif -B input2.tif --output=outfile.tif --calc="maximum(A,B)") where there is overlap, in your case where the are many layer values for a pixel.
  4. Use gdal_translate to set 0 value pixels to no data (in my case, 0 is no data).

Note that :

gdal_calc.py takes a maximum of 26 inputs. It is also important to note that gdal_calc.py normally only outputs the overlapping zone of the rasters, this is why we must reproject (with gdalwarp) the GeoTIFF to have them in the same extent.

When reprojecting the rasters with gdalwarp, I use -srcnodata None because gdal_calc.py does not output the raster where there are no data. You can then set your no data value in a final step using gdal_translate if needed.

This solution works, but it's far from been ideal.

If you have gdal 2.2 installed

You could try using vrt build in pixel function. this solution was provided to us by Rutger. See: https://lists.osgeo.org/pipermail/gdal-dev/2017-November/047758.html

answered Dec 12, 2017 at 18:38
1

I have rasterized the maximum or minimum attribute value of overlapping polygons by first sorting the attribute value of interest and then resetting the index using the python package geopandas. GDAL will rasterize the features in ascending index order using whatever attribute value you specify for the cell value. So if you sort ascending the maximum value of any overlapping polygons will be the output raster cell value.

import geopandas as gp
gdf = gp.read_file(shp_path)
gdf.sort_values(by=['your_attribute'], ascending=True, inplace=True) #ascending=False for min
gdf.reset_index(inplace=True)
gdf.to_file(sorted_shp_path) 

After that, you can read the sorted shapefile back in and use the code in your question to perform the rasterization.

answered Nov 19, 2018 at 19:38

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.