จะคำนวณสถิติแรสเตอร์สำหรับรูปหลายเหลี่ยมได้อย่างไร


14

ฉันจะคำนวณจำนวนเงินเฉลี่ย ฯลฯ ของคะแนนแรสเตอร์ (หลายแบนด์) ต่อรูปหลายเหลี่ยมของเวกเตอร์เลเยอร์ได้อย่างไร ฉันบอกว่านี่เรียกว่า "สถิติเชิงพื้นที่" ฉันลองกับ QGIS ก่อน

มีวิธีที่จะทำ แต่มันช้าเกินไป (แปลงแรสเตอร์เป็นเวกเตอร์ตัดกับเวกเตอร์เลเยอร์ที่สองคำนวณเรขาคณิตส่งออกตัวเลขคำนวณสถิติด้วยสเปรดชีตหรือโปรแกรมอื่นนำเข้าผลลัพธ์ใช้เวลาตลอดไปสำหรับฉัน 350,000 คะแนนแรสเตอร์)

ฉันยังได้รับคำใบ้ในการใช้ saga-gis ที่มี "สถิติโซน" แต่ขึ้นอยู่กับหมวดหมู่จากแรสเตอร์แบนด์ไม่ใช่รูปหลายเหลี่ยมจากเวกเตอร์เลเยอร์ ดังนั้นในการใช้สิ่งนี้ฉันจะต้องแปลงเวกเตอร์เลเยอร์ของฉันเป็นแรสเตอร์แล้วคำนวณสถิติ

นี่เป็นวิธีที่ผิดในการแก้ไขปัญหานี้ จะไม่มีวิธีในการพิจารณาคะแนนแรสเตอร์ที่เป็นของรูปหลายเหลี่ยม 2 รูปขึ้นไปเพราะมันถูกตัดกันโดยเขตแดนรูปหลายเหลี่ยม ฉันคิดว่าสถิติที่มีรูปหลายเหลี่ยมควรสามารถจัดการกับสิ่งนี้ดังนั้นฉันจึงคิดว่าฉันยังไม่พบโมดูลที่ถูกต้อง

Saga-gis มีโมดูลมากมาย โปรดแจ้งให้เราทราบว่าอันไหนเหมาะสมที่สุดสำหรับแอปพลิเคชันนี้


ฉันกำลังลองโซลูชันของ Rudivonstaden และข้อความแสดงข้อผิดพลาดต่อไปนี้ปรากฏขึ้นเมื่อฉันป้อนคำสั่งสองคำสั่งสุดท้าย: >>> zonalstats = qgis.analysis.QgsZonalStatistics (vectorlayer, rasterfile) Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<input>" บรรทัดที่ 1 ใน <module> AttributeError: 'โมดูล' วัตถุไม่มีแอตทริบิวต์ 'การวิเคราะห์' >>> zonalstats.calculateStatistics (ไม่มี) การสืบค้นกลับ (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<input>" บรรทัดที่ 1 ใน <โมดูล > NameError: ชื่อ 'zonalstats' ไม่ได้ถูกกำหนดฉันสงสัยว่าคำสั่งนั้นถูกต้องหรือว่าไฟล์แรสเตอร์ที่ฉันใช้อยู่นั้นอยู่ในรูปแบบที่ถูกต้องหรือไม่? ขอบคุณ!
Dan Wolf

สวัสดีแดน Stackexchange ทำงานแตกต่างจากฟอรัม เป้าหมายคือเพื่อให้มีการตอบคำถามประเภทการถามตอบมากกว่าการสนทนาอย่างต่อเนื่อง หากคำตอบของคำถามต้นฉบับไม่สามารถแก้ไขสิ่งที่คุณต้องรู้ได้คุณควรขอคำชี้แจงในส่วนความเห็นหรือพิจารณาถามคำถามใหม่
Jay Guarneri

ขอบคุณสำหรับความคิดเห็นของคุณแดน คำตอบของฉันไม่มีคำสั่งการนำเข้าที่จำเป็นซึ่งควรได้รับการแก้ไขแล้ว
rudivonstaden

คำตอบ:


22

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

หลังจากทำการขุดบางส่วน (ในแหล่งที่มาของปลั๊กอิน ZonalStats ที่ทำให้เกิดเสียงได้) ฉันพบว่า QGIS จริง ๆ แล้วมีวิธีการทางสถิติแบบโซนในตัว API และสิ่งเหล่านี้ก็มีการผูก Python ดังนั้นตราบใดที่คุณเป็นเพียงการมองหาcount, sumและmeanสถิติสำหรับคุณสมบัติหลายเหลี่ยมของคุณหลาม Console (Plugins> หลามคอนโซล) ปัจจุบันเป็นวิธีที่ง่ายที่สุดที่จะแนบสถิติในตารางรูปหลายเหลี่ยมแอตทริบิวต์

  1. เลือกเลเยอร์แรสเตอร์ของคุณใน TOC และพิมพ์สิ่งต่อไปนี้ลงในคอนโซล (จะจับชื่อไฟล์ต้นฉบับของเลเยอร์แรสเตอร์ของคุณ)

    >>> rasterfile = qgis.utils.iface.mapCanvas().currentLayer().source()

  2. เลือกเลเยอร์เวกเตอร์ของคุณและดำเนินการคำสั่งต่อไปนี้ในคอนโซล (จะจับเลเยอร์เวกเตอร์ของตัวเอง)

    >>> vectorlayer = qgis.utils.iface.mapCanvas().currentLayer()

  3. ดำเนินการคำสั่งสามคำสั่งต่อไปนี้ในคอนโซล (คำสั่งจะส่งไฟล์เวกเตอร์เลเยอร์และแรสเตอร์ไปยังเครื่องคิดเลขสถิติในตัวของ QGIS)

    >>> import qgis.analysis

    >>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)

    >>> zonalstats.calculateStatistics(None)

ผลลัพธ์จะถูกผนวกเป็นฟิลด์เพิ่มเติมในเลเยอร์รูปหลายเหลี่ยม

สถิติเชิงพื้นที่

โปรดทราบว่าหากคุณต้องการผนวกคำนำหน้าให้กับฟิลด์ใหม่ (แทนที่จะมีเพียงแค่เป็นผลรวมค่าเฉลี่ยและจำนวน) คุณจะแทนที่คำสั่งแรกในขั้นตอนที่ 3 ด้วยขั้นตอนต่อไปนี้ (สมมติว่าคุณต้องการใช้ 'zonal_' เป็น คำนำหน้า:

>>> zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile,"zonal_")

1
+1 qgis.analysis.QgsZonalStatistics ()
แอรอน

มีปลั๊กอิน Zonal Statistics ใน QGIS ดังนั้นอาจไม่จำเป็นต้องรันคำสั่งที่กล่าวถึงด้วยตัวเอง: docs.qgis.org/2.2/en/docs/user_manual/plugins/ สงสัยว่าทำไมไม่มีความเป็นไปได้ในการคำนวณสูงสุดและต่ำสุด คุณค่าเช่นกัน
matandked

ฉันใช้เทคนิคของคุณ แต่มันลบรูปหลายเหลี่ยม :(
niahoo

6

ในที่สุดก็พบว่า: ใน Saga-GIS เปิดหมวดหมู่รูปหลายเหลี่ยมและตารางข้อมูลแล้วรูปร่าง -> กริด -> กริดค่า -> กริดสถิติสำหรับกริดรูปหลายเหลี่ยม


3

คุณสามารถทำได้อย่างง่ายดายด้วย PostGIS ดูบทช่วยสอนนี้: http://trac.osgeo.org/postgis/wiki/WKTRasterTutorial01


ขอบคุณสำหรับความคิด ฉันหวังว่าจะทำได้โดยไม่ต้องเพิ่มและเรียนรู้อีกซอฟต์แวร์หนึ่ง ฉันจะจำ PostGIS ไว้ในภายหลัง
stn

3

ดูเหมือนว่าปัญหานี้จะได้รับการแก้ไขแล้วเมื่อไม่นานมานี้ แต่ฉันจะเพิ่มช้อนลงในซุปต่อไปเนื่องจากฉันเพิ่งต้องการสถิติแรสเตอร์ด้วยตัวเอง

วิธีการของ QGIS ที่อธิบายโดย rudivonstaden นั้นทำงานได้อย่างมีเสน่ห์ขอบคุณสำหรับเคล็ดลับ อย่างไรก็ตามในกรณีของฉันฉันต้องการทราบค่า min & max และ std สำหรับค่าแรสเตอร์ภายในรูปหลายเหลี่ยมของฉันและฟังก์ชั่นนั้นฉันไม่สามารถหาได้ใน QGIS ฉันพบวิธีแก้ปัญหาผ่านฟังก์ชั่นisectpolyrstในGMEซึ่งเป็นที่ชื่นชอบของฉันสำหรับการแก้ไขปัญหา GIS ด้วยฟังก์ชั่นนี้ให้ฉันเพียงแค่สถิติที่ฉันต้องการและค่อนข้างเร็วเช่นกัน

PS GME มีการพึ่งพาโชคร้ายเล็กน้อย (ArcGIS) ดังนั้นถึงแม้ว่าทุกคนจะสามารถใช้โปรแกรมได้ด้วยตนเอง แต่คุณต้องใช้ ArcGIS ในการรัน แต่ถ้าคุณมี ArcGIS (ใบอนุญาตระดับใดก็ได้) ฉันแนะนำให้คุณลองใช้ดู

แก้ไข:

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


3
zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer,rasterfile)
zonalstats.calculateStatistics(None)

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

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

zonalstats = qgis.analysis.QgsZonalStatistics(vectorlayer, rasterfile, QgsZonalStatistics.Mean)
zonalstats.calculateStatistics(None)

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

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