Sono stato in grado di fornire una soluzione completa nella seguente domanda:
Come calcolare un raster di interpolazione dalla console Python in QGIS?
Ripubblicherò anche qui la risposta, a causa del grande interesse che sembra attrarre:
Risposta:
La documentazione sulla PyQGIS non è molto auto-esplicativo, ma ho capito come chiamare correttamente le classi di interpolazione associate ( QgsInterpolator
, QgsTINInterpolator
, QgsIDWInterpolator
, QgsGridFileWriter
) in pitone. Descriverò in dettaglio ogni fase della sceneggiatura:
Passo 1:
Importa il modulo principale e di analisi e ottieni il livello vettoriale desiderato per l'interpolazione selezionandolo con un clic del mouse nella scheda del livello.
import qgis.core
import qgis.analysis
layer = qgis.utils.iface.activeLayer()
Passo 2:
Preparare le classi di interpolazione con i parametri necessari. I parametri esatti per l'inizializzazione della struttura LayerData sono reperibili nei documenti dell'API QGIS (searchterm: QgsInterpolator).
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1
Si noti che non utilizzo z Coordinate, ottengo il primo campo disponibile (indice = 0) come attributo di interpolazione e utilizzo PUNTI come tipo di input.
Passaggio 3:
Scegli il tuo motore di interpolazione. Qui puoi scegliere tra il metodo di interpolazione TIN ( QgsTINInterpolator
) e l'interpolazione IDW ( QgsIDWInterpolator
). Ho preso il QgsTINInterpolator
mio codice.
tin_interpolator = QgsTINInterpolator([layer_data])
Tieni presente che devi passare un elenco Python layer_data
al motore di interpolazione! Ciò consente anche di aggiungere più scenari layer_data.
Passaggio 4:
Impostare i parametri necessari per l'esportazione dell'output di interpolazione (vedere la documentazione di QgsGridFileWriter
). Questi includono informazioni simili alla GUI di interpolazione (percorso file, estensione, risoluzione, numero di colonne e righe).
export_path ="C:/SomeFolder/output.asc"
rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)
output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol, nrows,res,res)
output.writeFile(True)
iface.addRasterLayer(export_path, "interpolation_output")
Fai attenzione all'estensione del file del tuo output-raster poiché QgsGridFileWriter
scrive solo ASCII-grids ( .asc
). I dati vengono scritti su disco chiamando il writeFile()
metodo. Dopo l'esportazione è possibile aggiungere il file della griglia come raster nell'area di disegno.
Script completo per riferimento:
import qgis.analysis
import qgis.core
layer = qgis.utils.iface.activeLayer()
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1
tin_interpolator = QgsTINInterpolator([layer_data])
export_path = "E:/GIS_Workbench/script_output/test.asc"
rect = layer.extent()
res = 10
ncol = int( ( rect.xMaximum() - rect.xMinimum() ) / res )
nrows = int( (rect.yMaximum() - rect.yMinimum() ) / res)
output = QgsGridFileWriter(tin_interpolator,export_path,rect,ncol,nrows,res,res)
output.writeFile(True)
Tieni presente che l'API QGIS è attualmente riscritta alla versione 3.0 e le classi di interpolazione utilizzate vengono spostate da qgis.analysis
a qgis.core
! Ciò avrà un enorme impatto sulla funzionalità di questo script in modo che debba essere riscritto per la versione 3.0!
from rasterinterpolation import rasterinterpolation
ma non sono sicuro di quale modulo chiamare (o come persino chiamare).