bearbeiteneine GDAL Schicht
Hier Rastern ist der richtige Weg, es zu tun, und die 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)
Original Frage
Ich bin der Suche nach Informationen darüber, wie zu verwenden osgeo.gdal.RasterizeLayer()
(der Docstring ist sehr kurz und ich kann es nicht in der C oder C++ API-Dokumente finden. Ich fand nur ein Dokument für die java bindings).
ich angepasst, um ein unit test und versuchte es auf einem SHP von Polygonen:
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()
Es fein läuft, aber alles, was ich bekommen ist ein schwarzer .tif.
Was ist der burn_values
Parameter für? Kann RasterizeLayer()
verwendet werden, um eine Ebene mit Features zu rastern, die basierend auf dem Wert eines Attributs unterschiedlich gefärbt sind?
Wenn es nicht kann, was soll ich verwenden? Ist AGG geeignet zum Rendern geografischer Daten (Ich möchte keine Antialiasing und ein sehr robuster Renderer, in der Lage, sehr große und sehr kleine Features richtig zu zeichnen, möglicherweise von "schmutzigen Daten" (degenerierte Polygone, etc ...), und manchmal angegeben in großen Koordinaten)?
Zum Beispiel habe ich von diesem gehen wollen:
http://i.imagehost.org/0232/from.png http://i.imagehost.org/0232/from.png
Um dies:
http://f.imagehost.org/0012/to_4.png http://f.imagehost.org/0012/to_4.png
Hier werden die Polygone durch den Wert eines Attributs unterschieden werden (die Farben sind nicht wichtig, Ich möchte nur einen anderen für jeden Wert des Attributs haben).
Danke Luper, das war sehr hilfreich für mich heute! Gdals Dokumentation ist sehr schwer zu finden, richtige Stück Info ... – yosukesabai
Hallo @Luper, groß! Ich habe genau das gesucht! Erteilen Sie (teilweise) Ihren Beispielcode in ein GPLv3-lizenziertes Open-Source-Projekt, vorausgesetzt, dass ich Ihren Namen und Link ordnungsgemäß dieser Frage zugeordnet habe? –
@ andreas-h sicher kein Problem. –