Ihr Team verarbeitet wöchentlich 500 GB Höhendaten. ArcPy Spatial Analyst-Skripte berechnen Neigung, Exposition und Hillshade für die Geländevisualisierung. Die Verarbeitung dauert 6 Stunden pro Durchlauf, und die Spatial Analyst-Lizenz kostet 2.500 GBP pro Jahr und Arbeitsplatz.
Dann entdeckt jemand Rasterio. "Es liest GeoTIFFs direkt in NumPy Arrays", sagen sie. "Keine Lizenzgebühren". Sie durchsuchen Stack Overflow und finden Beiträge über 10-fache Geschwindigkeitsverbesserungen und Cloud-native Workflows. Aber Sie sehen auch Beschwerden über fehlende Funktionen, Verwirrung bei Koordinatensystemen und kryptische GDAL-Fehler.
Dieser Leitfaden schneidet durch den Lärm. Wir haben Raster-Verarbeitungs-Workflows für Forstwirtschaft, Bergbau und Umweltüberwachungs-Clients migriert. Hier ist, was tatsächlich funktioniert, welche Übersetzungsmuster wichtig sind, und wie Sie mit Rastern umgehen, die den verfügbaren Speicher überschreiten. Wenn Sie bereits Vector-Workflows migriert haben, lesen Sie unseren ArcPy zu GeoPandas-Leitfaden.
Raster lesen: ArcPy vs. Rasterio
Rasterio liest Raster direkt in NumPy Arrays und ermöglicht vektorisierte Verarbeitung, die 5-20x schneller ist als arcpy.sa Map Algebra. Der Hauptunterschied: ArcPy umhüllt Raster in proprietären Objekten, während Rasterio rohe NumPy Arrays für Standard-Scientific-Python-Operationen freigibt.
PATTERN: RASTER LESEN
import arcpy
from arcpy.sa import *
# Environment einrichten
arcpy.env.workspace = "C:/data"
arcpy.CheckOutExtension("Spatial")
# Raster lesen - gibt Raster-Objekt zurück
dem = Raster("elevation.tif")
# Eigenschaften abrufen
print(f"Cell size: {dem.meanCellWidth}")
print(f"Extent: {dem.extent}")
print(f"Spatial ref: {dem.spatialReference.name}")Gibt proprietäres Raster-Objekt zurück
PATTERN: RASTER LESEN
import rasterio
import numpy as np
# Raster öffnen - Context Manager behandelt Cleanup
with rasterio.open("elevation.tif") as src:
# Als NumPy Array lesen (Band 1)
dem = src.read(1)
# Eigenschaften über Profil abrufen
print(f"Cell size: {src.res}")
print(f"Bounds: {src.bounds}")
print(f"CRS: {src.crs}")
# dem ist jetzt ein Standard-NumPy Array
print(f"Shape: {dem.shape}")
print(f"Dtype: {dem.dtype}")Gibt NumPy Array + Metadaten zurück
MULTI-BAND-RASTER
Rasterio behandelt Multi-Band-Bilder (wie Landsat, Sentinel) intuitiver als ArcPy. Jedes Band wird zu einem Slice in einem 3D-NumPy-Array.
# Alle Bands auf einmal lesen
with rasterio.open("sentinel2.tif") as src:
bands = src.read() # Shape: (bands, height, width)
red = bands[3] # Band 4 (0-indexed)
nir = bands[7] # Band 8
# NDVI mit NumPy Broadcasting berechnen
ndvi = (nir.astype(float) - red) / (nir + red + 1e-10)Raster-Algebra: arcpy.sa vs. NumPy-Operationen
NumPy ersetzt arcpy.sa Map Algebra durch Standard-Python-Operatoren. Anstelle von Con(), Slope() und Reclassify() verwenden Sie NumPy-Funktionen, die ganze Arrays auf einmal verarbeiten. Dieser vektorisierte Ansatz ist typischerweise 5-20x schneller als ArcPy Map Algebra.
PATTERN: NEIGUNG BERECHNEN
from arcpy.sa import Slope
# Neigung in Grad berechnen
dem = Raster("elevation.tif")
slope = Slope(dem, "DEGREE")
slope.save("slope.tif")NUMPY + RASTERIO
import rasterio
import numpy as np
with rasterio.open("elevation.tif") as src:
dem = src.read(1).astype(float)
cellsize = src.res[0] # Annahme: quadratische Zellen
# Gradient mit NumPy berechnen
dy, dx = np.gradient(dem, cellsize)
slope_rad = np.arctan(np.sqrt(dx**2 + dy**2))
slope_deg = np.degrees(slope_rad)
# Ausgabe schreiben
profile = src.profile.copy()
profile.update(dtype=rasterio.float32)
with rasterio.open("slope.tif", "w", **profile) as dst:
dst.write(slope_deg.astype(np.float32), 1)PATTERN: BEDINGTE NEUKLASSIFIZIERUNG
from arcpy.sa import Con, Reclassify, RemapRange
# Bedingt: Werte < 0 auf NoData setzen
dem = Raster("elevation.tif")
dem_positive = Con(dem >= 0, dem)
# Höhe in Kategorien neuklassifizieren
reclass = Reclassify(dem, "VALUE",
RemapRange([[0, 100, 1],
[100, 500, 2],
[500, 1000, 3],
[1000, 9999, 4]])
)
reclass.save("elevation_classes.tif")NUMPY + RASTERIO
import rasterio
import numpy as np
with rasterio.open("elevation.tif") as src:
dem = src.read(1).astype(float)
nodata = src.nodata
# Bedingt: Negative Werte auf NoData setzen
dem[dem < 0] = np.nan
# Mit np.digitize oder np.select neuklassifizieren
conditions = [
(dem >= 0) & (dem < 100),
(dem >= 100) & (dem < 500),
(dem >= 500) & (dem < 1000),
dem >= 1000
]
classes = np.select(conditions, [1, 2, 3, 4], default=0)
# Ausgabe schreiben
profile = src.profile.copy()
profile.update(dtype=rasterio.uint8, nodata=0)
with rasterio.open("elevation_classes.tif", "w", **profile) as dst:
dst.write(classes.astype(np.uint8), 1)Bibliotheken für gängige Geländeoperationen
Während Sie Neigung, Exposition und Hillshade mit rohem NumPy implementieren können, bieten mehrere Bibliotheken optimierte Implementierungen:
| Operation | arcpy.sa | Open-Source-Alternative |
|---|---|---|
| Neigung | Slope() | richdem.TerrainAttribute() oder np.gradient() |
| Exposition | Aspect() | richdem oder xrspatial.aspect() |
| Hillshade | Hillshade() | xrspatial.hillshade() oder earthpy |
| Fließrichtung | FlowDirection() | pysheds oder whitebox |
| Wasserscheide | Watershed() | pysheds.catchment() |
| Zonenstatistiken | ZonalStatistics() | rasterstats.zonal_stats() |
In Cloud-Native Formaten schreiben (COG)
Cloud-Optimized GeoTIFF (COG) ist der Schlüsselvorteil von Rasterio gegenüber ArcPy. COG ermöglicht das Streaming großer Raster aus Cloud-Speicher (S3, Azure Blob, GCS) ohne die Bereitstellung ganzer Dateien. ArcPy hat keine native COG-Unterstützung – Sie müssen Dateien zuerst lokal herunterladen.
WAS MACHT COG BESONDERS
- HTTP-Bereichsanforderungen: Lesen Sie nur die Pixel, die Sie benötigen, nicht die gesamte Datei
- Internes Tiling: Optimiert für räumliche Abfragen (256x256 oder 512x512 Fliesen)
- Überblicke: Vorgefertigte Pyramiden für schnelle Visualisierung bei jedem Zoom
- Cloud-Speicher: Funktioniert direkt mit S3, Azure, GCS – kein lokaler Download
STANDARD-AUSGABE
import rasterio
# Standard GeoTIFF schreiben
with rasterio.open(
"output.tif", "w",
driver="GTiff",
height=data.shape[0],
width=data.shape[1],
count=1,
dtype=data.dtype,
crs=src.crs,
transform=src.transform
) as dst:
dst.write(data, 1)
# Problem: Kein internes Tiling
# Problem: Keine Überblicke
# Problem: Ganze Datei zum Lesen herunterladenCLOUD-OPTIMIERTE AUSGABE
import rasterio
from rasterio.enums import Resampling
# Cloud-Optimized GeoTIFF mit COG-Treiber
with rasterio.open(
"output_cog.tif", "w",
driver="COG",
height=data.shape[0],
width=data.shape[1],
count=1,
dtype=data.dtype,
crs=src.crs,
transform=src.transform,
compress="deflate", # Kompression
blocksize=512, # Größe der internen Fliesen
overview_resampling="average"
) as dst:
dst.write(data, 1)
# Oder rio-cogeo CLI verwenden:
# rio cogeo create input.tif output_cog.tifCOGs aus Cloud-Speicher lesen
Die echte Kraft: Lesen Sie nur den Teil eines massiven Rasters, den Sie benötigen, direkt von S3 oder Azure Blob Storage.
import rasterio
from rasterio.windows import from_bounds
# Kleines Fenster aus 50GB COG auf S3 lesen (kein vollständiger Download!)
cog_url = "s3://bucket/large-raster.tif"
with rasterio.open(cog_url) as src:
# Interessensgebiet definieren
window = from_bounds(
left=-122.5, bottom=37.5,
right=-122.0, top=38.0,
transform=src.transform
)
# Nur dieses Fenster lesen - Range-Anforderung!
subset = src.read(1, window=window)
print(f"Read {subset.nbytes / 1e6:.1f} MB instead of full file")Leistung: Lesen eines 10-km-Bereichs aus 50-GB-Global-DEM: ArcPy lädt die gesamte Datei herunter (14 Minuten). Rasterio COG-Bereichsanforderung: 2,3 Sekunden.
Speicherverwaltung für große Raster
Verwenden Sie windowed reading, Dask-Arrays oder xarray für Raster, die den verfügbaren RAM überschreiten. Im Gegensatz zu ArcPy, das Daten durch dateibasierte Operationen streamt, lädt Rasterio Daten standardmäßig in den Speicher. Für Raster mit 10 GB+, benötigen Sie verschiedene Strategien.
DIE SPEICHERMAUER
Beispiel: Global 30m DEM (SRTM), 432.000 x 180.000 Pixel, 150 GB unkomprimiert. Der Aufruf von src.read() versucht, alles zu laden – stürzt mit MemoryError ab.
ArcPy handhabt dies transparent (mit diskbasierten Operationen), verliert aber Parallelisierungsvorteile. Rasterio gibt Ihnen Kontrolle – Sie wählen den Kompromiss.
Verarbeiten Sie Raster in räumlichen Chunks (Fenster). Beste für Operationen, die keinen Kontext zwischen den Kacheln benötigen (Neuklassifizierung, NDVI, einfache Algebra).
import rasterio
from rasterio.windows import Window
import numpy as np
with rasterio.open("huge_raster.tif") as src:
# In 1024x1024 Fenster verarbeiten
profile = src.profile.copy()
profile.update(compress='deflate')
with rasterio.open("output.tif", "w", **profile) as dst:
for ji, window in src.block_windows(1):
# Chunk lesen
data = src.read(1, window=window)
# Chunk verarbeiten (Beispiel: normalisieren)
processed = (data - data.min()) / (data.max() - data.min())
# Chunk schreiben
dst.write(processed.astype(np.float32), 1, window=window)Dask-Arrays ermöglichen lazy evaluation und parallele Verarbeitung über Chunks. Operationen werden nur berechnet, wenn Sie sie explizit auslösen.
import dask.array as da
import rioxarray
# Mit rioxarray öffnen - erstellt Lazy-Dask-gestütztes Array
ds = rioxarray.open_rasterio("huge_raster.tif", chunks=(1, 2048, 2048))
# Operationen sind lazy - noch keine Berechnung
dem = ds.squeeze()
slope = np.arctan(np.sqrt(
np.gradient(dem, axis=0)**2 + np.gradient(dem, axis=1)**2
))
# Berechnung mit paralleler Ausführung auslösen
result = slope.compute() # Nutzt alle CPU-Kerne
# Oder direkt schreiben (Streaming auf Disk)
slope.rio.to_raster("slope_output.tif", driver="COG")Für Zeitreihen oder mehrdimensionale Raster-Stapel (Satellitenbilder) bietet xarray leistungsstarke Abstraktionen für beschriftete Arrays mit Dask-Parallelisierung.
import xarray as xr
import rioxarray
# Zeitreihe von Rastern mit Dask-Chunking öffnen
files = ["landsat_2020_01.tif", "landsat_2020_02.tif", ...]
ds = xr.open_mfdataset(
files,
engine="rasterio",
chunks={"x": 2048, "y": 2048}
)
# Zeitliche Statistiken berechnen (lazy)
mean_ndvi = ds['ndvi'].mean(dim='time')
max_ndvi = ds['ndvi'].max(dim='time')
# Ergebnisse schreiben
mean_ndvi.rio.to_raster("mean_ndvi.tif")Verarbeiten Sie Raster in räumlichen Chunks (Fenster). Beste für Operationen, die keinen Kontext zwischen den Kacheln benötigen (Neuklassifizierung, NDVI, einfache Algebra).
import rasterio
from rasterio.windows import Window
import numpy as np
with rasterio.open("huge_raster.tif") as src:
# In 1024x1024 Fenster verarbeiten
profile = src.profile.copy()
profile.update(compress='deflate')
with rasterio.open("output.tif", "w", **profile) as dst:
for ji, window in src.block_windows(1):
# Chunk lesen
data = src.read(1, window=window)
# Chunk verarbeiten (Beispiel: normalisieren)
processed = (data - data.min()) / (data.max() - data.min())
# Chunk schreiben
dst.write(processed.astype(np.float32), 1, window=window)Dask-Arrays ermöglichen lazy evaluation und parallele Verarbeitung über Chunks. Operationen werden nur berechnet, wenn Sie sie explizit auslösen.
import dask.array as da
import rioxarray
# Mit rioxarray öffnen - erstellt Lazy-Dask-gestütztes Array
ds = rioxarray.open_rasterio("huge_raster.tif", chunks=(1, 2048, 2048))
# Operationen sind lazy - noch keine Berechnung
dem = ds.squeeze()
slope = np.arctan(np.sqrt(
np.gradient(dem, axis=0)**2 + np.gradient(dem, axis=1)**2
))
# Berechnung mit paralleler Ausführung auslösen
result = slope.compute() # Nutzt alle CPU-Kerne
# Oder direkt schreiben (Streaming auf Disk)
slope.rio.to_raster("slope_output.tif", driver="COG")Für Zeitreihen oder mehrdimensionale Raster-Stapel (Satellitenbilder) bietet xarray leistungsstarke Abstraktionen für beschriftete Arrays mit Dask-Parallelisierung.
import xarray as xr
import rioxarray
# Zeitreihe von Rastern mit Dask-Chunking öffnen
files = ["landsat_2020_01.tif", "landsat_2020_02.tif", ...]
ds = xr.open_mfdataset(
files,
engine="rasterio",
chunks={"x": 2048, "y": 2048}
)
# Zeitliche Statistiken berechnen (lazy)
mean_ndvi = ds['ndvi'].mean(dim='time')
max_ndvi = ds['ndvi'].max(dim='time')
# Ergebnisse schreiben
mean_ndvi.rio.to_raster("mean_ndvi.tif")| Rastergröße | Operationstyp | Empfohlener Ansatz |
|---|---|---|
| < 2GB | Beliebig | Standard Rasterio (vollständig laden) |
| 2-20GB | Pro-Pixel (kein Kontext) | Windowed Reading |
| 2-20GB | Nachbarschaftsoperationen | Dask mit Überlappung |
| 20-100GB | Komplexe Analyse | rioxarray + Dask-Cluster |
| > 100GB | Beliebig | Google Earth Engine oder STAC + COG |
Raster schreiben: Best Practices
Kopieren Sie immer das Quellprofil, aktualisieren Sie nur, was sich ändert, und bevorzugen Sie das COG-Format für Ausgaben. Die meisten häufigen Fehler entstehen durch falsch zugeordnete Metadaten – falsches CRS, falsche Transform oder falscher nodata-Wert.
HÄUFIGE FEHLER
# NICHT: Metadaten hartcodieren
with rasterio.open(
"output.tif", "w",
driver="GTiff",
height=1000,
width=1000,
count=1,
dtype="float32",
crs="EPSG:4326", # Könnte nicht mit Input übereinstimmen!
transform=Affine(0.1, 0, 0, 0, -0.1, 0) # Falsch!
) as dst:
dst.write(data, 1)
# Probleme:
# - CRS könnte nicht mit Input übereinstimmen
# - Transform ist völlig falsch
# - Keine Kompression (riesige Dateien)
# - nodata nicht gesetztKORREKTER ANSATZ
# TUN: Profil kopieren und aktualisieren
with rasterio.open("input.tif") as src:
data = src.read(1)
profile = src.profile.copy()
# Daten verarbeiten
result = some_processing(data)
# Nur das Geänderte aktualisieren
profile.update(
driver="COG", # Cloud-optimiert
dtype=result.dtype, # Match output type
compress="deflate", # Kompression
nodata=-9999 # Explizites nodata
)
with rasterio.open("output.tif", "w", **profile) as dst:
dst.write(result, 1)GDAL-KONFIGURATION FÜR CLOUD-SCHREIBVORGÄNGE
Das Schreiben großer COGs in Cloud-Speicher erfordert GDAL-Konfiguration. Setzen Sie diese Umgebungsvariablen vor dem Öffnen von Dateien:
import os
import rasterio
# GDAL für S3 konfigurieren
os.environ['AWS_REQUEST_PAYER'] = 'requester' # Für Requester-Pays-Buckets
os.environ['GDAL_DISABLE_READDIR_ON_OPEN'] = 'YES' # Schnellere Opens
os.environ['CPL_VSIL_CURL_ALLOWED_EXTENSIONS'] = '.tif,.tiff,.vrt'
# Jetzt direkt auf S3 schreiben
with rasterio.open("s3://my-bucket/output.tif", "w", **profile) as dst:
dst.write(data, 1)Migrations-Zeitplan: Was Sie erwartet
Eine typische Raster-Workflow-Migration dauert 2-4 Monate und beginnt mit einer einwöchigen Machbarkeitsstudie. Der Zeitplan hängt von der Workflow-Komplexität, der Vertrautheit des Teams mit NumPy und den Anforderungen der Cloud-Integration ab.
- Alle arcpy.sa-Skripte auflisten: verwendete Funktionen, Ein-/Ausgabeformate auflisten
- Prioritäts-Workflows identifizieren: hohe Laufzeit, häufige Ausführung
- Machbarkeitsstudie erstellen: ein Skript von Anfang bis Ende migrieren
- Benchmark: Laufzeit, Ausgabegenauigkeit, Speichernutzung vergleichen
- Eingabe-Raster in COG-Format konvertieren (gdal_translate oder rio-cogeo)
- Cloud-Storage-Struktur einrichten (S3-Buckets, Ordnerkonventionen)
- Validierungsskripte erstellen: Ausgaben Pixel-für-Pixel vergleichen
- CRS- und nodata-Konventionen für das Team dokumentieren
- Skripte in Prioritätsreihenfolge migrieren (höchster ROI zuerst)
- Speicherverwaltung für große Raster implementieren
- Wiederverwendbare Bibliothek erstellen: gängige Operationen, Fehlerbehandlung
- Parallele Validierung durchführen: ArcPy und Rasterio erzeugen identische Ausgaben
- Migrierte Workflows in Produktion einsetzen
- Leistung überwachen: Laufzeit, Speicher, Cloud-Kosten
- Team in Rasterio-Mustern und Debugging schulen
- ArcPy-Workflows nach 30-tägiger Konfidenzphase abschalten
Vollständige Workflow-Übersetzung: Echtes Beispiel
Hier ist ein Production-Workflow, den wir für einen Umweltüberwachungs-Client migriert haben: Berechnen Sie Terrain-Ableitungen aus einem 20-GB-DEM und identifizieren Sie Bereiche, die Neigungsschwellwerte überschreiten.
ORIGINAL ARCPY VERSION (4,2 STUNDEN)
import arcpy
from arcpy.sa import *
arcpy.env.workspace = "C:/data"
arcpy.CheckOutExtension("Spatial")
# 20GB DEM lesen
print("Reading DEM...")
dem = Raster("large_dem.tif")
# Neigung berechnen
print("Calculating slope...")
slope = Slope(dem, "DEGREE")
# Exposition berechnen
print("Calculating aspect...")
aspect = Aspect(dem)
# Steile Hänge identifizieren (> 30 Grad)
print("Finding steep areas...")
steep_mask = Con(slope > 30, 1, 0)
# Hillshade zur Visualisierung berechnen
print("Creating hillshade...")
hillshade = Hillshade(dem, 315, 45)
# Ausgaben speichern
print("Saving results...")
slope.save("slope.tif")
aspect.save("aspect.tif")
steep_mask.save("steep_areas.tif")
hillshade.save("hillshade.tif")
print("Complete!")Laufzeit: 4,2 Stunden | Spitzenspeicher: 8 GB | 20 GB Input-DEM
MIGRIERTE RASTERIO VERSION (12 MINUTEN)
import rioxarray as rxr
import xrspatial
import numpy as np
# Mit Dask-Chunking öffnen (Lazy Loading)
print("Opening DEM with lazy loading...")
dem = rxr.open_rasterio(
"s3://bucket/large_dem.tif",
chunks={"x": 2048, "y": 2048}
).squeeze()
# Terrain-Ableitungen berechnen (alle lazy)
print("Setting up terrain calculations...")
slope = xrspatial.slope(dem)
aspect = xrspatial.aspect(dem)
hillshade = xrspatial.hillshade(dem, azimuth=315, angle_altitude=45)
# Steile Bereiche identifizieren
steep_mask = xr.where(slope > 30, 1, 0).astype(np.uint8)
# Alle Ausgaben schreiben (parallele Berechnung + Streaming)
print("Computing and writing results...")
slope.rio.to_raster("s3://bucket/outputs/slope.tif", driver="COG")
aspect.rio.to_raster("s3://bucket/outputs/aspect.tif", driver="COG")
steep_mask.rio.to_raster("s3://bucket/outputs/steep_areas.tif", driver="COG")
hillshade.rio.to_raster("s3://bucket/outputs/hillshade.tif", driver="COG")
print("Complete!")Laufzeit: 12 Minuten | Spitzenspeicher: 3 GB | Gleiches 20-GB-Input, 21x schneller
LEISTUNGSAUFSCHLÜSSELUNG: WOHIN DIE ZEIT GEHT
ArcPy (4,2 Stunden)
Rasterio + xrspatial (12 Min.)
Wichtige Erkenntnis: Lazy Loading eliminiert die Anfangleszeit. Parallele Dask-Ausführung nutzt alle CPU-Kerne. COG-Ausgabe streamt direkt zu S3 ohne temporäre Dateien.
Die Rasterio-Migration ist sinnvoll, wenn Sie Cloud-Integration, parallele Verarbeitung benötigen oder die Kosten für die Spatial Analyst-Lizenzierung senken möchten.
Die 5-20x Leistungsverbesserung ergibt sich aus vektorisierten NumPy-Operationen und paralleler Dask-Ausführung. Die Workflow-Verbesserung ergibt sich aus dem COG-Format, das Cloud-native Architekturen ermöglicht.
Wenn Ihre Workflows jedoch von ArcPy-spezifischen Funktionen wie ausgefeilter hydrologischer Modellierung abhängig sind oder Sie in der Esri-Infrastruktur festsitzen, kann ein Hybrid-Ansatz besser funktionieren – verwenden Sie Rasterio zur Datenvorbereitung und -ausgabe, ArcPy für spezialisierte Analysen.
Häufig gestellte Fragen
Ist Rasterio schneller als ArcPy Spatial Analyst?
Ja, für die meisten Operationen. Rasterio mit NumPy bietet 5-20x Geschwindigkeitssteigerungen für Raster-Algebra dank vektorisierter Operationen. Das Lesen von Cloud-Optimized GeoTIFFs kann 10-50x schneller sein als ArcPy, weil HTTP-Bereichsanforderungen verwendet werden – Sie laden nur die Pixel herunter, die Sie benötigen.
Kann Rasterio ArcGIS-Rasterformate lesen?
Ja, Rasterio liest alle GDAL-unterstützten Formate einschließlich GeoTIFF, JPEG2000, MrSID, ESRI Grid und File Geodatabase-Raster. Für optimale Leistung konvertieren Sie in das Cloud-Optimized GeoTIFF-Format, das Streaming aus Cloud-Speicher ohne vollständigen Dateidownload ermöglicht.
Was ersetzt arcpy.sa Slope- und Aspect-Funktionen?
Verwenden Sie np.gradient() für grundlegende Neigunjgs-/Expositionsberechnungen, oder Bibliotheken wie xrspatial, richdem oder earthpy für vordefinierte Geländeanalysefunktionen. Die Leistung ist typischerweise 5-10x schneller als arcpy.sa-Äquivalente aufgrund vektorisierter Berechnung.
Wie gehe ich mit großen Rastern um, die nicht in den Speicher passen?
Verwenden Sie Windowed Reading von Rasterio zum Verarbeiten in Chunks, oder xarray mit Dask für automatisches Chunking und parallele Ausführung. Für sehr große Datensätze (100 GB+) ermöglicht das COG-Format das Lesen nur des benötigten räumlichen Umfangs über HTTP-Bereichsanforderungen.
Was ist Cloud-Optimized GeoTIFF (COG) und warum sollte ich es verwenden?
COG ist eine GeoTIFF-Variante, die für Cloud-Speicher und HTTP-Bereichsanforderungen optimiert ist. Es ermöglicht das Lesen nur von Teilen großer Raster, ohne ganze Dateien herunterzuladen. Rasterio unterstützt nativ COG zum Lesen von und Schreiben in Cloud-Speicher wie S3 und Azure Blob – ArcPy hat diese Fähigkeit nicht.
Workflow-Automatisierung Einblicke erhalten
Monatliche Tipps zur Automatisierung von GIS-Workflows, Open-Source-Tools und Erkenntnisse aus Enterprise-Deployments. Kein Spam.
