การเรียกปลั๊กอินการแก้ไขจากคอนโซล Python ของ QGIS


13

ฉันต้องการเรียกใช้ฟังก์ชั่นปลั๊กอินการแก้ไข QGIS (วิธี TIN) (Raster-> Interpolate) จากคอนโซลของงูหลาม

ฉันไม่พบฟังก์ชันที่เกี่ยวข้องภายใน QGIS API หรือภายในรายการอัลกอริทึมการประมวลผล ฉันพบอัลกอริธึม SAGA Triangulation ซึ่งทำงานได้ดี แต่ช้ากว่า 5-10 เท่าและความเร็วมีความสำคัญในกรณีของฉัน

ความคิดวิธีการดำเนินการใด ๆ


2
แม้ว่าฉันไม่ต้องการสิ่งนี้ แต่มันก็มีประโยชน์ที่จะรู้ ฉันติดตามลิงก์นี้: ( gis.stackexchange.com/questions/11216/… ) ฉันได้เท่าfrom rasterinterpolation import rasterinterpolationแต่ไม่แน่ใจว่าโมดูลที่จะโทร (หรือวิธีการได้โทร)
โจเซฟ

คุณช่วยชี้แจงเพิ่มเติมเกี่ยวกับความต้องการของคุณอีกเล็กน้อยได้ไหม? คุณกำลังมองหาวิธีในการคำนวณเลเยอร์แรสเตอร์แบบสอดแทรกใหม่จากเลเยอร์แรสเตอร์การป้อนข้อมูลหรือไม่?
underdark

ฉันมีปัญหาที่คล้ายกัน: ฉันต้องการสร้างแบบจำลอง countour ที่เริ่มต้นด้วย Raster \ interpolation ตามด้วย Saga \ contours จากกริด คำถามคือ - วิธีเพิ่ม rasterinrepolator ในหน้าต่าง "processing modeler"?
H.Wiener

คำตอบ:


5

ฉันสามารถให้โซลูชันเต็มในคำถามต่อไปนี้:

วิธีคำนวณแรสเตอร์การแก้ไขจากคอนโซลหลามใน 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!


1
ฉันลองโค้ดตัวอย่างของคุณ แต่ทำงานโดย layer_data.InterpolationAttribute = 0 ฉันลองใช้ดัชนีฟิลด์อื่น แต่รับเพียง 0
Leonard

ถูกต้อง - ฉันพบปัญหานี้เช่นกัน แต่ฉันไม่มีเวลาพอที่จะตรวจสอบสาเหตุ ทางออกของฉันคือการป้อนสคริปต์เลเยอร์ที่มีเพียงฟิลด์เดียวที่ต้องการ คุณอาจลองใช้เอกสาร QGIS API เพื่อหาวิธีการแก้ไขที่ดีขึ้น
root676

3

คุณสามารถทำได้หากคุณติดตั้งปลั๊กอินการแก้ไข Raster โดยใช้โปรแกรมจัดการปลั๊กอิน

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

หมายเหตุ:ฉันไม่รู้จริงๆว่าโค้ดด้านบนทำอะไรนอกจากความจริงที่ว่ามันพิมพ์ค่า แต่มันอาจช่วยให้คุณเข้าใจการใช้งาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.