Tôi đã có thể cung cấp một giải pháp đầy đủ trong câu hỏi sau:
Làm thế nào để tính toán một raster nội suy từ bảng điều khiển python trong QGIS?
Tôi cũng sẽ đăng lại câu trả lời ở đây, vì sự quan tâm lớn dường như thu hút:
Câu trả lời:
Các tài liệu trên pyqgis không phải là rất tự giải thích, nhưng tôi đã tìm ra cách để gọi đúng các lớp suy kèm theo ( QgsInterpolator
, QgsTINInterpolator
, QgsIDWInterpolator
, QgsGridFileWriter
) từ python. Tôi sẽ mô tả từng bước của kịch bản rất chi tiết:
Bước 1:
Nhập mô-đun lõi và phân tích và lấy lớp vectơ mong muốn để nội suy bằng cách chọn nó với mouseclick trong tab lớp.
import qgis.core
import qgis.analysis
layer = qgis.utils.iface.activeLayer()
Bước 2:
Chuẩn bị các lớp nội suy với các tham số cần thiết. Các tham số chính xác để khởi tạo cấu trúc LayerData có thể được tìm thấy trong các tài liệu API của QGIS (searchterm: QssInterpolator).
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1
Xin lưu ý rằng tôi không sử dụng tọa độ z, tôi lấy trường có sẵn đầu tiên (index = 0) làm thuộc tính nội suy và sử dụng POINTS làm loại đầu vào.
Bước 3:
Chọn công cụ nội suy của bạn. Tại đây, bạn có thể chọn giữa phương pháp Nội suy TIN ( QgsTINInterpolator
) và Nội suy IDW ( QgsIDWInterpolator
). Tôi lấy QgsTINInterpolator
mã của tôi.
tin_interpolator = QgsTINInterpolator([layer_data])
Hãy nhớ rằng bạn phải chuyển một danh sách python layer_data
cho công cụ nội suy! Điều này cũng cho phép bạn thêm nhiều kịch bản layer_data.
Bước 4:
Thiết lập các tham số cần thiết cho xuất khẩu nội suy-đầu ra (xem tài liệu về QgsGridFileWriter
). Chúng bao gồm thông tin tương tự như gui nội suy (filepath, mức độ, độ phân giải, số lượng colums và hàng).
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")
Lưu ý đến phần mở rộng tệp của raster đầu ra của bạn khi QgsGridFileWriter
chỉ ghi ASCII-grids ( .asc
). Dữ liệu được ghi vào đĩa bằng cách gọi writeFile()
phương thức. Sau khi xuất, bạn có thể thêm tệp lưới dưới dạng raster vào khung vẽ.
Kịch bản đầy đủ để tham khảo:
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)
Hãy nhớ rằng QGIS-API hiện được viết lại thành phiên bản 3.0 và các lớp nội suy được sử dụng được chuyển từ qgis.analysis
sang qgis.core
! Điều này sẽ có tác động rất lớn đến chức năng của tập lệnh này để nó phải được viết lại cho phiên bản 3.0!
from rasterinterpolation import rasterinterpolation
nhưng không chắc chắn nên gọi mô-đun nào (hoặc cách gọi).