รับค่า Raster จาก Polygon Overlay ใน Opensource GIS Solutions


16

ฉันมีสองชั้น ชั้นรูปหลายเหลี่ยมที่มีแผ่นกระเบื้องจำนวนมากและชั้นแรสเตอร์ที่มีที่ดิน CORINE 2006 ครอบคลุมหลายประเภทใน colourmap ฉันต้องการได้รูปหลายเหลี่ยมใน shapelayer สำหรับผลรวมของหมวดหมู่ที่ดินปกคลุมของแรสเตอร์เลเยอร์

ตัวอย่างเช่นมีรูปหลายเหลี่ยมที่มี id '2' และฉันต้องการคุณสมบัติเช่นนี้สำหรับรูปหลายเหลี่ยมนี้ (เป็นเปอร์เซ็นต์หรือตารางเมตร):

  • ที่ดินทำกิน: 15%
  • ป่าไม้: 11%
  • ถนน: 2% (... และอีกอย่างหนึ่ง)

ฉันพยายามที่จะทำมันในสนามหญ้า, qgis (ไม่มีฟังก์ชั่น), นิยายเกี่ยวกับวีรชน (เพียงผลรวมทุกค่ารวม) r (ผลรวมทั้งหมด) แต่ฉันยังไม่พบวิธีแก้ปัญหา ปลั๊กอินส่วนใหญ่ (สถิติโซนใน qgis) รองรับเลเยอร์แรสเตอร์ 0-1 เท่านั้น v.rast.stats ก็ไม่ได้ช่วยอะไรเช่นกัน เอี่ยมเปิดให้โซลูชั่นที่ดีและชาญฉลาด! บางทีฉันอาจใช้วิธีที่ผิดหรือทำผิดพลาด

ใน Arcgis งานนี้ค่อนข้างง่ายถ้าจำถูกต้อง แต่ฉันยังขาดวิธีที่ดีสำหรับผู้ใช้ linux ทุกวัน

ฉันใช้ระบบ debian linux และนี่คือสาเหตุที่ฉันสามารถใช้โปรแกรมสำหรับระบบปฏิบัติการนี้เท่านั้น


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


มันสามารถทำได้อย่างแน่นอนใน R มันเป็นเพียงคำถามของการทำงานซึ่งฟังก์ชั่น คุณต้องซ้อนทับแต่ละรูปหลายเหลี่ยมด้วยแรสเตอร์จากนั้นใช้ตาราง () เพื่อรับข้อมูลสรุปของพิกเซล "ตัดคุกกี้" แพ็คเกจ raster, rgdal และ rgeos อาจมีประโยชน์ อ่าน "R Spatial Task View" (google จะค้นหาได้)
Spacedman

แน่นอน แต่ฉันจะสรุปได้อย่างไร คุณสามารถซ้อนเลเยอร์รูปหลายเหลี่ยมได้อย่างง่ายดายด้วยเลเยอร์แรสเตอร์ด้วย! is.na (การซ้อนทับ (โพลี Raster)) แต่ด้วยคำสั่งเช่นแยกฉันสามารถคำนวณพื้นที่ทั้งหมดในพิกเซลตัดคุกกี้เท่านั้น . ฉันไม่รู้ rgeos แต่ฉันดูผ่าน api และพบว่าไม่มีฟังก์ชั่นในการทำเช่นนี้
Curlew

ตรวจสอบ r.univar เป็น GRASS ดูที่grasswiki.osgeo.org/wiki/Zonal_statistics
markusN

Hi! ขอบคุณที่ทำปลั๊กอิน QGIS! ฉันแค่อยากจะพูดถึงว่าปลั๊กอินล่ม (> 13000 polygons) มันจะดีถ้ามันจะแยกงานที่จะไม่ผิดพลาด และมันก็เป็นเรื่องที่ยอดเยี่ยมที่มีตัวเลือกในการเพิ่มคลาสทั้งหมดในครั้งเดียว (เช่นตารางแอตทริบิวต์จะได้รับ 2 เขตข้อมูลใหม่ LandcoverID และ Landcover% ซึ่งทั้งคู่ถือรายการ CSV ที่มีค่า) :)
Mfbaer

@Joran: ถ้าคุณคิดว่านี่เป็นข้อผิดพลาดยกรายงานข้อผิดพลาดมากกว่าที่จะเขียนในความเห็น ( github.com/Martin-Jung/LecoS/issues ) นอกจากนี้ 1) ไม่ใช่งานปลั๊กอินที่จะทำให้เป็นอนุกรมหรือประมวลผลงานของคุณ เรียกใช้บนชุดย่อยขนาดเล็กแล้ว 2) แน่นอน จะมีหลายสิ่งที่ยอดเยี่ยมที่จะเพิ่ม รหัสเปิดแหล่งที่มารู้สึกอิสระที่จะรหัสมัน :)
ยาว

คำตอบ:


13

ใช้ 'แยก' เพื่อวางซ้อนคุณลักษณะรูปหลายเหลี่ยมจาก SpatialPolygonsDataFrame (ซึ่งสามารถอ่านได้จากรูปร่างไฟล์โดยใช้ maptools: readShapeSpatial) บนแรสเตอร์จากนั้นใช้ 'ตาราง' เพื่อสรุป ตัวอย่าง:

> c=raster("cumbria.tif") # this is my CORINE land use raster
> summary(spd)
Object of class SpatialPolygonsDataFrame
[...]
> nrow(spd)  # how many polygons:
[1] 2
> ovR = extract(c,spd)
> str(ovR)
List of 2
 $ : num [1:542] 26 26 26 26 26 26 26 26 26 26 ...
 $ : num [1:958] 18 18 18 18 18 18 18 18 18 18 ...

ดังนั้นรูปหลายเหลี่ยมแรกของฉันครอบคลุม 542 พิกเซลและที่สองของฉันครอบคลุม 958 ฉันสามารถสรุปแต่ละรูปได้:

> lapply(ovR,table)
[[1]]

 26  27 
287 255 

[[2]]

  2  11  18 
 67  99 792 

รูปหลายเหลี่ยมแรกของฉันคือ 287 พิกเซลของชั้น 26 และ 255 พิกเซลของชั้น 27 ง่ายพอที่จะรวมและหารและคูณด้วย 100 เพื่อรับเปอร์เซ็นต์


เยี่ยมมากขอบคุณมากสำหรับความพยายาม ผมจะพยายามที่และรายงานกลับ :-)
Curlew

6

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

...
tab <- apply(ovR,table)
# Calculate percentage of landcover types for each polygon-field.
# landcover is a datastream with the names of every polygon
for(i in 1:length(tab)){
 s <- sum(tab[[i]])
 mat <- as.matrix(tab[[i]])
 landcover[i,paste("X",row.names(mat),sep="")] <- as.numeric(tab[[i]]/s)
}

3

ถ้าฉันเข้าใจสิ่งที่คุณต้องการอย่างถูกต้องและสมมติว่าคุณมีเวกเตอร์เลเยอร์ 'mypolygonlayer' และเลเยอร์แรสเตอร์ 'corina' ในฐานข้อมูล GRASS GIS ของคุณอยู่แล้ว:

ก่อนอื่นฉันจะแปลงเวกเตอร์เป็นแรสเตอร์ แมวจะทำให้แน่ใจว่าคุณจะมีตัวระบุที่ไม่ซ้ำกันหนึ่งตัวต่อรูปหลายเหลี่ยม หากคุณมีคอลัมน์ที่มีตัวระบุตัวเลขที่ไม่ซ้ำกันคุณสามารถใช้คอลัมน์นั้นแทน labelcolumn เป็นทางเลือก:

v.to.rast input = mypolygonlayer layer = 1 output = mypolygons ใช้ = cat labelcolumn = NameMappingUnit

จากนั้นเรียกใช้ r.stats เพื่อรับสถิติของคุณ:

r.stats -a -l input = mypolygons, ตัวคั่น Corina =; output = / home / paulo / corinastats.csv

ขั้นตอนสุดท้ายคือการเปิด corinastats.csv ในเช่น LibreOffice และสร้างตารางเดือยหรือใช้ R เพื่อสร้างตารางไขว้ของคุณ


3

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

  1. คลิปรูปหลายเหลี่ยมไปที่เลเยอร์แรสเตอร์ (Raster →การแยก→คลิปเปอร์: ไฟล์อินพุต = เลเยอร์แรสเตอร์เลือกชื่อและที่ตั้งเอาท์พุทคลิกที่เลเยอร์หน้ากากเลือกรูปหลายเหลี่ยม→ตกลง)

  2. รูปหลายเหลี่ยมเลเยอร์ปัตตาเลี่ยน (Raster → Conversion →รูปหลายเหลี่ยม: ไฟล์อินพุต = เลเยอร์คลิปของคุณ, บันทึกผลลัพธ์→ตกลง)

  3. การคำนวณจำนวนพิกเซล (คลิกที่ไฟล์รูปร่างที่คุณเพิ่งสร้าง→เครื่องคิดเลขแบบเปิดสนาม: ทำเครื่องหมาย“ สร้างฟิลด์ใหม่” และเพิ่มชื่อฟิลด์ฟังก์ชั่น = รูปทรงเรขาคณิต→พื้นที่→ตกลง) ตอนนี้คุณควรมีคอลัมน์ใหม่ในตารางแอตทริบิวต์ของคุณซึ่งแสดงจำนวนพิกเซล

  4. บันทึกเลเยอร์รูปหลายเหลี่ยม (คลิกขวาที่รูปหลายเหลี่ยมเลเยอร์บันทึกเป็น: format = ไฟล์ DBF, บันทึกเป็น→ตกลง)

  5. สรุปจำนวนพิกเซลสำหรับแต่ละที่อยู่อาศัย (เริ่ม excel, เปิดไฟล์, ถ้าคุณไม่มีชื่อเพิ่มตอนนี้สำหรับแต่ละคอลัมน์, คลิกที่เซลล์ว่าง, ไปที่แท็บ DATA, รวม, ตรวจสอบให้แน่ใจว่าเป็นผลรวม, คลิกที่ ลูกศรสีแดงถัดจาก "เรียกดู ... " และเลือกคุณสองคอลัมน์ (รวมชื่อ) คลิก "เพิ่ม" และทำเครื่องหมายที่ช่อง "แถวบนสุด" และ "คอลัมน์ซ้าย" →ตกลง)

  6. ถ้าอย่างฉันคุณมีรูปหลายเหลี่ยมที่ต้องวิเคราะห์และจำเป็นต้องเปรียบเทียบพวกมันในตารางเดียวกันขั้นตอนนี้จะมีประโยชน์ ในสมุดงาน Excel ใหม่แสดงรายการที่อยู่ของคุณในคอลัมน์ A (สำหรับฉัน 1 ถึง 48) และวางสองคอลัมน์ที่คุณเพิ่งรวมไว้ในคอลัมน์ B และ C (ที่อยู่อาศัยใน B และจำนวนพิกเซลใน C) ในเซลล์ D1 เขียนสูตรต่อไปนี้: = IFNA (INDEX (C: C; MATCH (A2; B: B; 0)); "")และลาก (หรือดับเบิลคลิกที่มุมล่างขวาล่าง) จนถึงค่าสุดท้าย (ดังนั้นถ้า คุณมีที่อยู่อาศัย 48 เซลล์จนถึงเซลล์ D48) จำนวนพิกเซลอยู่ในเซลล์ที่สอดคล้องกับที่อยู่อาศัยของคุณและคุณสามารถทำขั้นตอนนี้ซ้ำสำหรับรูปหลายเหลี่ยมทั้งหมดของคุณ


2

วิธีการแปลงข้อมูล CORINE เป็นชุดข้อมูลรูปหลายเหลี่ยมเวกเตอร์โดยใช้ QGIS ( Raster> Conversion>รูปหลายเหลี่ยม) จากนั้นใช้ฟังก์ชัน Union ( Vector> เครื่องมือประมวลผล Geopro > Union ) เพื่อรวมกับรูปหลายเหลี่ยม ชุดข้อมูลเวกเตอร์ที่ได้จะมีพื้นที่ของแต่ละคลาส CORINE ในแต่ละรูปหลายเหลี่ยม


ขอบคุณสำหรับคำแนะนำนี้ ยังไม่ได้คิดเกี่ยวกับการรวมกันของเวกเตอร์ บางทีฉันจะลองดูถ้า R-processing ล้มเหลว
Curlew

0

QGIS

ในหีบ QGIS มี ZonalStats อีกรุ่นหนึ่งเรียกว่า Zonal Statistics

สิ่งนี้จะทำหน้าที่ที่คุณต้องการ

สำหรับขั้นตอนการทำงานฉันไม่ชัดเจนว่าคุณมีแรสเตอร์เป็นจำนวนเท่าไรหรือเป็นแค่วงแรสเตอร์?


ขอบคุณสำหรับความคิดเห็น แต่ Zonal Statistics เท่านั้นที่กินแรสเตอร์โดยไม่มีหมวดหมู่ เอี่ยมใช้ลำต้น QGIS 1.9
Curlew

0

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

หลังจาก rasterizing รูปหลายเหลี่ยมของคุณในขอบเขตเดียวกันแน่นอนและความละเอียดของข้อมูลแรสเตอร์ที่คุณสามารถจัดระเบียบสถิติสรุปตามที่อธิบายไว้ที่นี่ซึ่งมีความเหมาะสมถ้าเหมาะกับคุณแรสเตอร์เป็นหน่วยความจำ (ชั้น / เล็กกลางแรสเตอร์) หรือคุณสามารถ binarize แต่ละประเภทที่มีreclassฟังก์ชั่น และมากกว่าการคำนวณzonalสถิติสำหรับแต่ละชั้นเรียน นี่คือโซลูชันที่รวมเอาข้อมูล rasterization และ zonal ไว้ในฟังก์ชั่นเดียวและใช้งานได้ดีกับชุดข้อมูลที่มีขนาดใหญ่มาก

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