Open emlys opened 1 year ago
James shared a link for the gdal rasterization source: https://github.com/OSGeo/gdal/blob/89e3fc244652771ca4f8abc0a6fe5794e2201b26/alg/gdalrasterize.cpp#L759
Dave shared some background from what QGIS is doing: https://github.com/qgis/QGIS/blob/d5626d92360efffb4b8085389c8d64072ef65833/src/analysis/vector/qgszonalstatistics.cpp#L266 Talked about in this SO post: https://gis.stackexchange.com/questions/276794/how-does-qgis-zonal-statistics-handle-partially-overlapping-pixels
We determined that this needs some more information to make a decision -
ALL_TOUCHED=True
, how do we handle the case where two disjoint polygons touch the same pixel?Here's another zonal stats library to keep an eye on. I think python bindings are in the works. https://github.com/isciences/exactextract
Their readme also includes a comparison of other implementations.
Dave shared some background from what QGIS is doing: https://github.com/qgis/QGIS/blob/d5626d92360efffb4b8085389c8d64072ef65833/src/analysis/vector/qgszonalstatistics.cpp#L266 Talked about in this SO post: https://gis.stackexchange.com/questions/276794/how-does-qgis-zonal-statistics-handle-partially-overlapping-pixels
Here's the interesting bit of how QGIS handles very small polygons relative to the grid size:
if ( featureStats.count <= 1 )
{
//the cell resolution is probably larger than the polygon area. We switch to precise pixel - polygon intersection in this case
statisticsFromPreciseIntersection( featureGeometry, offsetX, offsetY, nCellsX, nCellsY, cellsizeX, cellsizeY,
rasterBBox, featureStats );
}
In our discussion today I think the general take aways were:
Also of interest for looking at different rasterization methods, this paper might be of interest: https://searchworks.stanford.edu/articles/edseee__edseee.9942350. I have not yet read this, so this might not end up being relevant at all.. This paper is for smooth surfaces, which isn't immediately applicable to our regular work.
how it works now
zonal_statistics
rasterizes aggregate polygons. GDAL provides two options:ALL_TOUCHED=False
(default): pixels are "burned in" to the raster if their centerpoint falls within the aggregate polygonALL_TOUCHED=True
: pixels are "burned in" to the raster if they touch the aggregate polygon at allzonal_statistics
usesALL_TOUCHED=False
. Some aggregate polygons can end up with no pixels at all (if they don't happen to overlap any pixels' centerpoint).zonal_statistics
handles this case like so:proposed changes
Add a kwarg
all_touched=False
tozonal_statistics
. Pass this value togdal.RasterizeLayer
. Remove the special handling of unset polygons.all_touched=False
, the results will generally be more similar to the current version, but it's possible that some polygons will have no stats calculated (if they don't overlap any pixel centerpoint).all_touched=True
, it's guaranteed that all polygons within the defined area of the raster will have stats calculated.benefits
examples