import random
from osgeo import gdal, ogr
"""http://stackoverflow.com/questions/2220749/rasterizing-a-gdal-layer"""
champs_couleur = "__color__"
def rasterize(pixel_size=25)
# Ouvrir le fichier source
source_orig = ogr.Open("test.shp")
# En faire une copie virtuelle pour modifier la table d'attributs avec l'ajout de couleurs
source_ds = ogr.GetDriverByName("Memory").CopyDataSource(source_orig, "")
couche_virt = source_ds.GetLayer(0)
source_srs = couche_virt.GetSpatialRef()
x_min, x_max, y_min, y_max = couche_virt.GetExtent()
# création d'un champs dans la couche virtuelle pour y placer les couleurs
field_def = ogr.FieldDefn(champs_couleur ogr.OFTReal)
couche_virt.CreateField(field_def)
couche_virt_def = couche_virt.GetLayerDefn()
field_index = couche_virt_def.GetFieldIndex(champs_couleur)
# génération de couleurs aléatoires pour le champs couleur
# c'est ici que la valeur de l'attribut devrait être utilisée
for feature in couche_virt:
feature.SetField(field_index, random.randint(0, 255))
couche_virt.SetFeature(feature)
# Creation de la couche raster au format GeoTiff en fonction du champs couleur
x_res = int((x_max - x_min) / pixel_size)
y_res = int((y_max - y_min) / pixel_size)
target_ds = gdal.GetDriverByName('GTiff').Create('test.tif', x_res,y_res, 3, gdal.GDT_Byte)
target_ds.SetGeoTransform((x_min, pixel_size, 0,y_max, 0, -pixel_size,))
# traitement des projections
if source_srs:
# si la couche shapefile a une projection (.prj), l'attribuer à raster résultant
target_ds.SetProjection(source_srs.ExportToWkt())
else:
# couche shapefile n'a pas de projection
target_ds.SetProjection('LOCAL_CS["arbitrary"]')
# Conversion vecteur - raster
err = gdal.RasterizeLayer(target_ds, (3, 2, 1), couche_virt,burn_values=(0, 0, 0),options=["ATTRIBUTE=%s" % RASTERIZE_COLOR_FIELD])
if err != 0:
raise Exception("erreur en rasterisant la couche: %s" % err)
if __name__ == '__main__':
rasterize()