Modifierpixellisation une couche GDAL
Voici la bonne façon de le faire, et le documentation:
import random
from osgeo import gdal, ogr
RASTERIZE_COLOR_FIELD = "__color__"
def rasterize(pixel_size=25)
# Open the data source
orig_data_source = ogr.Open("test.shp")
# Make a copy of the layer's data source because we'll need to
# modify its attributes table
source_ds = ogr.GetDriverByName("Memory").CopyDataSource(
orig_data_source, "")
source_layer = source_ds.GetLayer(0)
source_srs = source_layer.GetSpatialRef()
x_min, x_max, y_min, y_max = source_layer.GetExtent()
# Create a field in the source layer to hold the features colors
field_def = ogr.FieldDefn(RASTERIZE_COLOR_FIELD, ogr.OFTReal)
source_layer.CreateField(field_def)
source_layer_def = source_layer.GetLayerDefn()
field_index = source_layer_def.GetFieldIndex(RASTERIZE_COLOR_FIELD)
# Generate random values for the color field (it's here that the value
# of the attribute should be used, but you get the idea)
for feature in source_layer:
feature.SetField(field_index, random.randint(0, 255))
source_layer.SetFeature(feature)
# Create the destination data source
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,
))
if source_srs:
# Make the target raster have the same projection as the source
target_ds.SetProjection(source_srs.ExportToWkt())
else:
# Source has no projection (needs GDAL >= 1.7.0 to work)
target_ds.SetProjection('LOCAL_CS["arbitrary"]')
# Rasterize
err = gdal.RasterizeLayer(target_ds, (3, 2, 1), source_layer,
burn_values=(0, 0, 0),
options=["ATTRIBUTE=%s" % RASTERIZE_COLOR_FIELD])
if err != 0:
raise Exception("error rasterizing layer: %s" % err)
question originale
Je cherche des informations sur la façon dont pour utiliser osgeo.gdal.RasterizeLayer()
(la docstring est très succinte, et je ne la trouve pas dans les docs d'API C ou C++. Je n'ai trouvé qu'un doc pour le java bindings).
Je me suis adapté et un unit test essayé sur un shp en polygones:
import os
import sys
from osgeo import gdal, gdalconst, ogr, osr
def rasterize():
# Create a raster to rasterize into.
target_ds = gdal.GetDriverByName('GTiff').Create('test.tif', 1280, 1024, 3,
gdal.GDT_Byte)
# Create a layer to rasterize from.
cutline_ds = ogr.Open("data.shp")
# Run the algorithm.
err = gdal.RasterizeLayer(target_ds, [3,2,1], cutline_ds.GetLayer(0),
burn_values=[200,220,240])
if err != 0:
print("error:", err)
if __name__ == '__main__':
rasterize()
Il fonctionne très bien, mais tout ce que j'obtiens est un .tif noir.
À quoi sert le paramètre burn_values
? Peut-on utiliser RasterizeLayer()
pour pixelliser une couche avec des entités colorées différemment en fonction de la valeur d'un attribut?
Si ce n'est pas possible, que dois-je utiliser? Est AGG adapté pour le rendu de données géographiques (je veux non antialiasing et un moteur de rendu très robuste, capable de dessiner correctement de très grandes et très petites fonctionnalités, éventuellement à partir de "données corrompues" (polygones dégénérés, etc ...), et parfois spécifié en grandes coordonnées)?
Par exemple, je veux aller de ceci:
http://i.imagehost.org/0232/from.png http://i.imagehost.org/0232/from.png
à ceci:
http://f.imagehost.org/0012/to_4.png http://f.imagehost.org/0012/to_4.png
Ici, les polygones sont différenciés par la valeur d'un attribut (les couleurs ne comptent pas, Je veux juste en avoir un différent pour chaque valeur de l'attribut).
Merci Luper, c'était très utile pour moi aujourd'hui! La documentation de gdal est très difficile à trouver juste un morceau d'info ... – yosukesabai
Hi @Luper, super! Je cherchais exactement ça! Est-ce que vous donnez l'autorisation d'inclure (des parties de) votre exemple de code dans un projet Open Source sous licence GPLv3, étant donné que j'attribue correctement votre nom et votre lien à cette question? –
@ andreas-h pas de problème. –