Skip to content

Instantly share code, notes, and snippets.

@perrygeo
Created April 30, 2015 19:23
Show Gist options
  • Save perrygeo/f6891eb1da10f0b533f3 to your computer and use it in GitHub Desktop.
Save perrygeo/f6891eb1da10f0b533f3 to your computer and use it in GitHub Desktop.
rasterize gdal vs rasterio
def rasterize_geom(geom, src_offset, new_gt, all_touched):
from rasterio import features
geoms = [(geom, 1)]
rv_array = features.rasterize(
geoms,
out_shape=(src_offset[3], src_offset[2]),
transform=new_gt,
fill=0,
all_touched=all_touched)
return rv_array
def rasterize_geom_gdal(geom, src_offset, new_gt, all_touched, spatial_ref):
"""
deprecated, used rasterize_geom instead
keeping this around as a reference for other gdal->rasterio efforts
and because it's roughly 2x faster than rasterio implementation
"""
from osgeo import ogr, gdal
ogr_geom_type = shapely_to_ogr_type(geom.type)
# Create a temporary vector layer in memory
mem_drv = ogr.GetDriverByName(str("Memory"))
mem_ds = mem_drv.CreateDataSource(str('out'))
mem_layer = mem_ds.CreateLayer(str('out'), spatial_ref, ogr_geom_type)
ogr_feature = ogr.Feature(feature_def=mem_layer.GetLayerDefn())
ogr_geom = ogr.CreateGeometryFromWkt(geom.wkt)
ogr_feature.SetGeometryDirectly(ogr_geom)
mem_layer.CreateFeature(ogr_feature)
# Rasterize it
driver = gdal.GetDriverByName(str('MEM'))
rvds = driver.Create(str('rvds'), src_offset[2], src_offset[3], 1, gdal.GDT_Byte)
rvds.SetGeoTransform(new_gt)
if all_touched:
gdal.RasterizeLayer(rvds, [1], mem_layer, None, None,
burn_values=[1],
options=['ALL_TOUCHED=True'])
else:
gdal.RasterizeLayer(rvds, [1], mem_layer, None, None,
burn_values=[1],
options=['ALL_TOUCHED=False'])
rv_array = rvds.ReadAsArray()
return rv_array
@perrygeo
Copy link
Author

The only downside: rasterize_geom is ~ 1.8x slower than rasterize_geom_gdal. Worth it for the safety and code clarity of the rasterio approach IMO.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment