ใช้ปลั๊กอิน QGIS Zonal Stats จาก Python Console หรือไม่


9

ฉันใช้ปลั๊กอิน Zonal Stats ใน QGIS เพื่อดึงข้อมูลสถิติแรสเตอร์จากรูปหลายเหลี่ยมที่ซ้อนทับกัน (ฉันมีรูปร่างของการกระจายพันธุ์และฉันต้องการดึงข้อมูลสิ่งแวดล้อมจากภายในแต่ละสปีชีส์) ฉันมีไฟล์ 300 ไฟล์ขึ้นไปฉันจำเป็นต้องได้รับข้อมูลและต้องการที่จะเขียนสคริปต์เพื่อให้ทำงานในคอนโซล python แต่ฉันเป็นมือใหม่ที่มี python และไม่รู้ว่าจะทำอย่างไร



ชาด - ใช่มันเป็นคำถามที่คล้ายกัน แต่เฉพาะเจาะจงมากขึ้น ไม่มีใครตอบคำถามอื่นแทนพวกเขาเสนอวิธีอื่นในการแก้ปัญหา ฉันไม่ทราบวิธีการลบโพสต์อื่น ๆ
Thomas

ในคำถามอื่น ๆ ที่ฉันชี้ให้คุณ r - script สามารถในสิ่งที่คุณต้องการและซิลเวสเตอร์อย่างรวดเร็วชื่อคุณวิธีการที่แน่นอนในหลาม หากคุณไม่คุ้นเคยกับการใช้รหัสในหลามหรือ r มากกว่าคำแนะนำเพิ่มเติมทั้งหมดจะไม่ช่วยคุณ คุณต้องการสคริปต์ที่กำหนดรหัสตนเองหรือ mouseclicks จำนวนมาก เรียนรู้การเขียนโค้ดลองตัวอย่างและรายงานกลับหากสิ่งที่ใช้ไม่ได้
Curlew

@Curlew - วิธีการของ Sylvester ในขณะที่มันฟังดูดีมากมันจะเป็นตัวแทนของการเรียนรู้ที่ยิ่งใหญ่สำหรับฉันและฉันไม่มีเวลาที่จะทำสิ่งนี้ในขณะนี้ ฉันซาบซึ้งกับความช่วยเหลือของซิลเวสเตอร์ แต่มันไม่ใช่คำตอบที่ตรงไปตรงมาที่ฉันเป็นหลังจากนั้น ผมคิดว่าผมมีมากที่สุดของรหัสที่ผมหลังในโพสต์ที่ผมกล่าวในคำถามอื่น ๆ ของฉัน ( gis.stackexchange.com/questions/23203/... ) ถ้าวิธีของซิลเวสเตอร์เป็นวิธีเดียวที่จะทำได้ในงูหลามฉันอาจประเมินว่ามันยากแค่ไหน
โทมัส

@Curlew - สคริปต์ R ของคุณทำงานได้ดีขอบคุณ สิ่งเดียวที่ฉันยังไม่ได้ทำคือการผนวกผลลัพธ์ที่ส่งคืนใน R ไปยังไฟล์. dbf สำหรับรูปร่างของฉัน (ความช่วยเหลือใด ๆ เกี่ยวกับสิ่งนี้จะได้รับการชื่นชมมาก)
โทมัส

คำตอบ:


13

รหัสด้านล่างใช้งานได้สำหรับฉัน QGis 1.8.0

คุณอาจแก้ไขสิ่งนี้เพื่อรองรับไฟล์หลาย ๆ ไฟล์ที่มีลูปบางส่วน ..

from qgis.analysis import QgsZonalStatistics

#specify polygon shapefile vector
polygonLayer = QgsVectorLayer('F:/temp/zonalstat/zonePoly.shp', 'zonepolygons', "ogr") 

# specify raster filename
rasterFilePath = 'F:/temp/zonalstat/raster1.tif'

# usage - QgsZonalStatistics (QgsVectorLayer *polygonLayer, const QString &rasterFile, const QString &attributePrefix="", int rasterBand=1)
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)

ยิ่งใหญ่ ขอบคุณ vinayan มากนั่นคือสิ่งที่ฉันเป็นหลังจากนั้น
โทมัส

ดูที่นี่สำหรับวิธีแก้ปัญหาทางเลือกโดยใช้ R
Thomas

ดีใจที่ได้ช่วยคุณ!
vinayan

@vinayan the QProgressDialog มีประโยชน์สำหรับสภาพแวดล้อมการมองเห็นที่คุณต้องการดูว่าการคำนวณคืบหน้าไปเพียงใด มันไม่มีประโยชน์จากบรรทัดคำสั่ง คุณสามารถใช้Noneเป็นพารามิเตอร์และใช้งานได้ดี จากนั้นคุณไม่ต้องการจากPyQt4..บรรทัดหรือprogressDialog = บรรทัด ดูโพสต์ที่คล้ายกันที่gis.stackexchange.com/questions/23203/ …
rudivonstaden

@rudivonstaden - เหมาะสมแล้วตอนนี้ .. ฉันได้รับคำตอบแล้ว
vinayan

2

นี่คือวิธีรับสิ่งที่คุณต้องการใน SAGA GIS นี่อาจไม่ใช่โซลูชันที่คุณต้องการ แต่ใช้งานได้ ฉันจะตรวจสอบสาเหตุที่ทำให้ปลั๊กอินของฉันล้มเหลวและอัปเดตโดยเร็วที่สุด

ติดตั้งSAGA GIS (ควรมีให้ผ่าน apt-get หรือ aptitudbe ในการกระจาย linux ของคุณ)

  • เริ่มต้น SAGA โหลดในรูปแบบแรสเตอร์และเวกเตอร์ (โมดูลเมนู -> ไฟล์ -> นำเข้า GDAL / OGR) คุณสามารถดูกระบวนการด้านล่าง
  • เรียกใช้โมดูล "สถิติกริดสำหรับรูปหลายเหลี่ยม" (โมดูลเมนู -> รูปร่าง -> ตาราง -> ค่าตาราง) เพิ่มค่าลงในตารางโดยตรง กล่องโต้ตอบควรมีลักษณะเช่นนี้ป้อนคำอธิบายรูปภาพที่นี่
  • ไปที่แท็บ "ข้อมูล" ในพื้นที่ทำงานคลิกขวาบนเลเยอร์เวกเตอร์ของคุณและเลือกที่ " บันทึกเป็น " เพื่อส่งออกรูปร่างด้วยแอตทริบิวต์ที่เพิ่มเข้ามา คุณสามารถแสดงตารางคุณลักษณะผ่านทางคลิกขวาแล้วคลิกที่ตารางแสดง

สิ่งนี้ใช้ได้กับชุดข้อมูลที่คุณส่งมาให้ฉัน นอกจากนี้ยังเป็นไปได้ที่จะเรียกโมดูล SAGA ใน QGIS ผ่าน SEXTANTE เป็นกระบวนการแบบแบตช์ ในการทำเช่นนี้เพียงแค่เปิดใช้งานโมดูล SAGA ในตัวเลือก SEXTANTE


ขอบคุณสำหรับคำแนะนำ แต่ฉันได้ลองใช้ซะงะแล้ว - ผลลัพธ์ที่ผลิตออกมาไม่สอดคล้องกันนั่นคือการทำแบบเดียวกันสองครั้งให้ผลลัพธ์ที่แตกต่างกัน ฉันรู้ว่าปลั๊กอิน ZonalStats ใน QGIS ทำงานได้ดังนั้นฉันจึงใช้วิธีการอัตโนมัติ ZonalStats
โทมัส

@ vinayan ฉันมีรหัสที่คุณได้ให้สำหรับ staton zonal แต่มันกำลังสร้างคอลัมน์ในเลเยอร์รูปหลายเหลี่ยมเวกเตอร์ แต่ไม่ได้อัปเดตค่าที่คำนวณได้ ทำไมถึงเป็นเช่นนั้น?
user99

2
zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1)
zoneStat.calculateStatistics(None)

คำนวณตามค่าเริ่มต้นเพียง Count, Sum และ Mean (อย่างที่คุณสามารถบอกได้จากRaster -> Zonal Statisticsใน QGIS Desktop มันสามารถทำอะไรได้มากกว่า)

ตัวอย่างเช่นหากคุณต้องการคำนวณเพียงค่าเฉลี่ยที่คุณต้องใช้:

zoneStat = QgsZonalStatistics (polygonLayer, rasterFilePath, 'pre-', 1, QgsZonalStatistics.Mean)
zoneStat.calculateStatistics(None)

ดูAPIสำหรับตัวเลือกทั้งหมด


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

ใน Qgis 3 คุณต้องแทนที่เส้นทางไฟล์แรสเตอร์ด้วยไฟล์แรสเตอร์เอง! ดังนั้น rasterFilePath = 'F: /temp/zonalstat/raster1.tif' จะกลายเป็น: rasterFile = QgsRasterLayer ('F: /temp/zonalstat/raster1.tif', 'raster') จากนั้นคุณเปลี่ยน rasterFilePath เป็น rasterFile ในเขตพื้นที่ คำสั่ง zoneStat = QgsZonalStatistics (polygonLayer, rasterFile, 'pre-', 1) zoneStat.calculateStatistics (ไม่มี)
philsch
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.