Gọi plugin nội suy từ bảng điều khiển Python của QGIS


13

Tôi muốn gọi hàm plugin nội suy QGIS (phương thức TIN) (Raster-> Interpolate) từ bảng điều khiển python.

Tôi không thể tìm thấy hàm tương ứng trong API QGIS hoặc trong danh sách thuật toán xử lý. Tôi tìm thấy thuật toán SAGA Triangulation, hoạt động tốt nhưng chậm hơn 5-10 lần và tốc độ rất quan trọng trong trường hợp của tôi.

Bất kỳ ý tưởng làm thế nào để thực hiện nó?


2
Mặc dù tôi không yêu cầu điều này, nhưng nó sẽ là một điều hữu ích để biết. Tôi đã theo liên kết này: ( gis.stackexchange.com/questions/11216/ế ). Tôi đã đi xa from rasterinterpolation import rasterinterpolationnhưng không chắc chắn nên gọi mô-đun nào (hoặc cách gọi).
Giuse

Bạn có thể làm rõ yêu cầu của bạn hơn một chút? Bạn chỉ đơn giản là tìm cách để tính toán một lớp raster nội suy mới từ một lớp raster đầu vào?
underdark

Tôi có một vấn đề tương tự: Tôi muốn tạo một mô hình đếm bắt đầu bằng phép nội suy Raster \ theo sau là đường viền Saga \ từ lưới. Câu hỏi là - làm thế nào để thêm rasterinrepolator trong cửa sổ "xử lý mô hình hóa"?
H.Wiener

Câu trả lời:


4

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 QgsTINInterpolatormã 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_datacho 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 QgsGridFileWriterchỉ 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.analysissang 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!


1
Tôi thử mã ví dụ của bạn, nhưng chỉ hoạt động bởi layer_data.InterpolationAttribution = 0, tôi thử với chỉ mục trường khác, nhưng chỉ nhận được 0.
Leonard

Điều đó đúng - tôi cũng gặp phải vấn đề này, nhưng tôi không có đủ thời gian để điều tra nguyên nhân. Giải pháp của tôi là cung cấp cho tập lệnh một lớp chỉ có trường mong muốn duy nhất. Bạn có thể thử các tài liệu API của QGIS cho một giải pháp cải tiến.
root676

3

Bạn có thể làm điều này nếu bạn đã cài đặt plugin Raster Interpolation bằng Trình quản lý plugin.

from rasterinterpolation.core.rasterinterpolator import RasterInterpolator
rastLayer = iface.activeLayer()
interpolator = RasterInterpolator(rastLayer,0,1)
a= interpolator.linear(QgsPoint(10.662629, 76.225421))
print a

Lưu ý: tôi không thực sự biết đoạn mã trên làm gì ngoài thực tế là nó đã in một giá trị. Nhưng nó có thể sẽ giúp bạn hiểu cách sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.