Mehr

So konvertieren Sie Float-Raster in Vektoren mit Python GDAL


Ich habe ein Float-Raster und möchte es jetzt in Vektor umwandeln. Wie ist das mit der Python GDAL-Bibliothek möglich?

ich habe es versucht mitgdal_polygonize.pyvon GDAL-Dienstprogrammen auf der Befehlszeile und es funktionierte ausgezeichnet. Aber dieses Dienstprogramm basiert aufGDALPolygonisieren()der C++-Bibliothek und ich möchte die C++-MethodeGDALFPolygonisieren()stattdessen verwendet werden, die meines Wissens Float-Raster-Daten manipuliert.


Versuchen Sie es mit rasterio, das GDALFPolygonize für Float-Arrays verwendet.

import numpy as np import rasterio.features from affin import affine from shapely.geometry import shape # dreieckiges Array ar = np.tri(5, dtype="f") print(ar) für shp, val in rasterio.features.shapes( ar, transform=Affine(1, 0, 0, 0, -1, 5)): print('%s: %s' % (val, shape(shp)))

zeigt an:

[[ 1. 0. 0. 0. 0.] [ 1. 1. 0. 0. 0.] [ 1. 1. 1. 0. 0.] [ 1. 1. 1. 1. 0.] [ 1. 1. 1. 1. 1.]] 1.0: POLYGON ((0 0, 0 5, 5 5, 5 4, 4 4, 4 3, 3 3, 3 2, 2 2, 2 1, 1 1, 1 0, 0 0)) 0.0: POLYGON ((1 0, 1 1, 2 1, 2 2, 3 2, 3 3, 4 3, 4 4, 5 4, 5 0, 1 0))

Oder visualisiert mit Blau für1.0und rot für0.0:


Sie können nicht verwendenGDALFPolygonisierenmit den GDAL-Python-Bindungen, ohne den Quellcode zu ändern und neu zu kompilieren, da er nicht in der GDAL-Swig-Schnittstelle verfügbar gemacht wird.

Hinweis: Stand Februar 2016,GDALFPolygonisierenIST in der GDAL SVN-Trunk-Quelle verfügbar, ist jedoch in keiner der neuesten Versionen (1.11.4/2.0.2) enthalten.

Um Ihr Raster zu polygonisieren, müssen Sie von Float in Integer konvertieren. Wenn Sie einige Dezimalstellen beibehalten möchten, multiplizieren Sie Ihr Raster mit 10^N, wobei N die Anzahl der Dezimalstellen ist, die Sie beibehalten möchten. Um beispielsweise 3 Dezimalstellen beizubehalten, multiplizieren Sie mit 10^3 = 1000.

# Rasterwerte mit 1000 multiplizieren gdal_calc.py -A raster.tif --outfile=raster1000.tif --calc="A*1000" # In Vektor umwandeln gdal_polygonize.py raster1000.tif vector1000.shp

Wenn Sie Ihre Polygonattribute wieder in Float konvertieren möchten, teilen Sie einfach durch denselben Wert.

# Vektorwerte durch 1000 dividieren ogr2ogr vector.shp vector1000.shp -sql "select (cast(DN as float) * 0.001) as DN FROM vector1000"

Beachten Sie, dass es keine Punktkonvertierung von Gleitkomma-Rastern gibt, die kontinuierliche Oberflächen in Polygone darstellen, da Sie so ziemlich 1 Polygon pro Pixel erhalten, was sehr ineffizient ist. Fast jede Analyse, die Sie sich mit solchen Daten vorstellen können, ist viel effizienter, wenn Sie die Daten im Rasterformat belassen.


Ein bisschen spät, aber kommentieren, wenn jemand dies nützlich findet. Angenommen, Sie haben ein Float-Raster (raster_path) und möchten es in ein Shapefile konvertieren. Sie können gdal FPolygonize in Python verwenden als:

source_raster = gdal.Open(raster_path) band = gdal.Open(raster_path).GetRasterBand(1) driver = ogr.GetDriverByName('ESRI Shapefile') out_data = driver.CreateDataSource(shapefile_path) # Projektion vom Quellraster abrufen srs = osr. SpatialReference() srs.ImportFromWkt(source_raster.GetProjectionRef()) # Layer mit Projektion erstellen out_layer = out_data.CreateLayer(raster_path.split('.')[0], srs) new_field = ogr.FieldDefn('field_name', ogr. OFTReal) out_layer.CreateField(new_field) gdal.FPolygonize(band, band, out_layer, 0, [], callback=None) out_data.Destroy() source_raster = None


Schau das Video: Read and write raster files with GDAL in Python (Oktober 2021).