簡體   English   中英

通過 python 模塊在 QGIS 中導出計算柵格層

[英]Export a computed raster layer in QGIS by python module

我在 QGIS 中使用 SAGA GIS 和 python 模塊來計算一組數字高程模型 (DEM) 的地形 Position 指數 (TPI),我需要將每個計算出的 TPI 導出到一個單獨的柵格文件中。 我該怎么做? 請參閱下面我編寫的代碼:

base_dir = 'D:/Selected DEMs'
fnames = [os.path.join(base_dir, fname) for fname in os.listdir(base_dir)]
dfs_names = (os.listdir(base_dir))

for i in range(len (fnames)):
    print (i)
    tpi = processing.run("saga:topographicpositionindextpi", {'DEM':fnames[i],'TPI':'TEMPORARY_OUTPUT','STANDARD':False,'DW_WEIGHTING':0,'DW_IDW_POWER':2,'DW_BANDWIDTH':75})

我找到了答案。 QGIS 以 SAGA GIS 格式 (sdat) 將計算出的 TPI 保存在一個臨時文件夾中。 計算出的柵格采用字典格式,如下所示:

dict_items([('TPI', 'C:/Users/.../.../TPI.sdat')])).

因此,首先需要從 dict 中讀取 TPI.sdat,然后使用 rasterio 將其導出到 Geotiff,如下所示:

import rasterio as rio

base_dir = 'D:/Selected DEMs'
fnames = [os.path.join(base_dir, fname) for fname in os.listdir(base_dir)]
dfs_names = (os.listdir(base_dir))

for i in range(len (fnames)):
    print (i)
    tpi = processing.run("saga:topographicpositionindextpi", {'DEM':fnames[i],'TPI':'TEMPORARY_OUTPUT','STANDARD':False,'DW_WEIGHTING':0,'DW_IDW_POWER':2,'DW_BANDWIDTH':75})
    tpi.items()
    tpi['TPI']
    TPI_sdat_format = rio.open(tpi['TPI'])
    TPI_sdat_format_meta = TPI_sdat_format.profile   
    TPI_sdat_format_meta['driver'] = 'GTiff'
    TPI_data=TPI_sdat_format.read(1)
    
    with rio.open('D:/TPI_%s.tif'%i, 'w', **TPI_sdat_format_meta) as dst:
        dst.write(TPI_data, 1)

因為使用了 QGIS,所以我會使用 QGIS 中可用的模塊。 首先,文件被寫為 .sdat,然后作為柵格層加載回 QGIS。 然后柵格可以寫成一個.tif文件

from qgis.core import *
import os

base_dir = 'D:/Selected DEMs'
out_dir = 'D:/Precessed_DEMs'
fnames = os.listdir(base_dir)
EPSG = 'EPSG:25832' # example crs or set from layer r

for i in fnames:
    print (i)
    out_filename =  os.path.join(out_dir,os.path.splitext(i)[0] + '.sdat')
    tpi = processing.run("saga:topographicpositionindextpi",{'DEM':i,'TPI':out_filename ,'STANDARD':False,'DW_WEIGHTING':0,'DW_IDW_POWER':2,'DW_BANDWIDTH':75})

    rlayer = QgsRasterLayer(os.path.join(folder_preproc, os.path.splitext(i)[0]+".sdat"),os.path.splitext(i)[0])
    pipe = QgsRasterPipe()
    pipe.set(rlayer.dataProvider().clone())
    file_writer = QgsRasterFileWriter(os.path.join(folder_preproc, os.path.splitext(i)[0]+".tif"))
    file_writer.writeRaster(pipe, rlayer.width(),rlayer.height(), rlayer.extent(), QgsCoordinateReferenceSystem(EPSG))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM