ฉันสามารถให้โซลูชันเต็มในคำถามต่อไปนี้:
วิธีคำนวณแรสเตอร์การแก้ไขจากคอนโซลหลามใน QGIS?
ฉันจะโพสต์คำตอบที่นี่อีกครั้งเนื่องจากมีความสนใจอย่างมากดูเหมือนว่าจะดึงดูด:
ตอบ:
เอกสารใน pyqgis ไม่ได้เป็นอย่างอธิบายตนเอง แต่ผมคิดว่าวิธีการอย่างถูกต้องเรียกว่าการเรียนการแก้ไขร่วม ( QgsInterpolator
, QgsTINInterpolator
, QgsIDWInterpolator
, QgsGridFileWriter
) จากหลาม ฉันจะอธิบายทุกขั้นตอนของสคริปต์อย่างละเอียด
ขั้นตอนที่ 1:
นำเข้าแกนหลักและโมดูลการวิเคราะห์และรับเลเยอร์เวกเตอร์ที่ต้องการสำหรับการแก้ไขโดยเลือกด้วย mouseclick ในแท็บเลเยอร์
import qgis.core
import qgis.analysis
layer = qgis.utils.iface.activeLayer()
ขั้นตอนที่ 2:
เตรียมคลาสการแก้ไขด้วยพารามิเตอร์ที่จำเป็น พารามิเตอร์ที่แน่นอนสำหรับการเริ่มต้นของโครงสร้าง LayerData สามารถพบได้ในเอกสาร QGIS API (searchterm: QgsInterpolator)
layer_data = QgsInterpolator.LayerData()
layer_data.vectorLayer = layer
layer_data.zCoordInterpolation=False
layer_data.InterpolationAttribute =0
layer_data.mInputType = 1
โปรดสังเกตว่าฉันไม่ได้ใช้พิกัด z ฉันจะได้รับฟิลด์แรกที่มีอยู่ (ดัชนี = 0) เป็นคุณลักษณะการแก้ไขและใช้จุดเป็นประเภทอินพุต
ขั้นตอนที่ 3:
เลือกเครื่องมือการแก้ไขของคุณ ที่นี่คุณสามารถเลือกระหว่างวิธี TIN-Interpolation ( QgsTINInterpolator
) และ IDW-Interpolation ( QgsIDWInterpolator
) ฉันเอาQgsTINInterpolator
ในรหัสของฉัน
tin_interpolator = QgsTINInterpolator([layer_data])
จำไว้ว่าคุณต้องส่งรายการไพ ธ อนlayer_data
ไปยังเอ็นจินการแก้ไข! สิ่งนี้ยังช่วยให้คุณเพิ่มสถานการณ์ layer_data หลายรายการ
ขั้นตอนที่ 4:
ตั้งค่าพารามิเตอร์ที่จำเป็นสำหรับการส่งออก interpolation-output (ดูเอกสารประกอบของQgsGridFileWriter
) ข้อมูลเหล่านี้รวมถึงข้อมูลที่คล้ายกันเช่น gui การแก้ไข (filepath, ส่วนขยาย, ความละเอียด, จำนวน colums และแถว)
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")
ระวังนามสกุลไฟล์ของ output-raster ของคุณQgsGridFileWriter
เพียงเขียน ASCII-grids ( .asc
) ข้อมูลถูกเขียนลงดิสก์โดยการเรียกใช้writeFile()
เมธอด หลังจากส่งออกคุณสามารถเพิ่มไฟล์กริดเป็นแรสเตอร์ไปยังผืนผ้าใบ
สคริปต์แบบเต็มสำหรับการอ้างอิง:
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)
โปรดทราบว่าขณะนี้ QGIS-API ถูกเขียนใหม่เป็นเวอร์ชัน 3.0 และคลาสการแก้ไขที่ใช้แล้วจะถูกย้ายจากqgis.analysis
ไปยังqgis.core
! สิ่งนี้จะมีผลกระทบอย่างมากต่อการทำงานของสคริปต์นี้ดังนั้นจึงต้องเขียนใหม่สำหรับเวอร์ชัน 3.0!
from rasterinterpolation import rasterinterpolation
แต่ไม่แน่ใจว่าโมดูลที่จะโทร (หรือวิธีการได้โทร)