การปรับให้เรียบ / สอดแทรกแรสเตอร์ใน Python โดยใช้ GDAL?


20

ฉันกำลังพัฒนาใน Python และใช้ GDAL จาก OSGEO เพื่อจัดการและโต้ตอบกับ rasters และ shapefiles

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

สิ่งที่ฉันมีหลังจากใช้ RasterizeLayer:

[Raster จากการใช้ gdal.rasterizelayer]

สิ่งที่ฉันต้องการสำหรับผลิตภัณฑ์ขั้นสุดท้าย:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันเชื่อว่าฟังก์ชั่นที่ฉันกำลังมองหาเรียกว่า 'Spline_sa ()' จากการนำเข้า arcgisscripting

GDAL มีฟังก์ชั่นที่คล้ายกันหรือมีวิธีอื่นในการรับเอาต์พุตที่ต้องการหรือไม่?

คำตอบ:


18

ฉันจะดูที่ NumPy และ Scipy - มีตัวอย่างที่ดีของการสอดแทรกข้อมูลจุดในSciPy Cookbookโดยใช้ฟังก์ชันscipy.interpolate.griddata เห็นได้ชัดว่าสิ่งนี้ต้องการให้คุณมีข้อมูลในอาร์เรย์ที่มีจำนวนมาก;

  • การใช้การผูก GDAL python คุณสามารถอ่านข้อมูลของคุณลงใน Python gdal.Dataset.ReadAsArray()เพื่อใช้เป็นแรสเตอร์
  • ด้วย OGR คุณจะวนรอบเลเยอร์คุณลักษณะและแยกข้อมูลจุดจาก shapefile (หรือดีกว่ายังเขียน shapefile ไปยัง CSV โดยใช้GEOMETRY=AS_XYZ[ดูรูปแบบไฟล์ OGR CSV]และอ่าน csv ลงใน Python)

เมื่อคุณได้ผลลัพธ์ที่ถูก gridded แล้วคุณสามารถใช้ GDAL เพื่อเขียนอาเรย์ numpy ที่ได้ไปยัง raster

ท้ายที่สุดถ้าคุณไม่มีโชคกับห้องสมุดสอดแทรกของ Scipy คุณสามารถลองใช้scipy.imimage ได้เช่นกัน


ขอบคุณสำหรับความช่วยเหลือ! ฉันกำลังให้ Scipy.interpolate.griddata เข้าใกล้วน ฉันจะโพสต์ผลลัพธ์ของฉันกลับ
Doug

1
ฉันขอโทษที่ใช้เวลานานมากในการกลับไปที่โพสต์นี้ คำตอบข้างต้นนั้นเป็นสิ่งที่ฉันทำเพื่อแก้ปัญหาของฉัน ฉันใช้ไลบรารีการสอดแทรกของ Scipy เพื่อเติมช่องว่างของข้อมูลเหล่านั้นแล้วเขียนกลับไปที่ rasterband ขอบคุณสำหรับความช่วยเหลือ!
Doug

@Doug ไม่ต้องกังวล - ยินดีที่จะรักษา!
om_henners

1
วิธีนี้เร็วแค่ไหน? สามารถใช้กับกริด 10k x 10k ที่ทราบค่าทุก 100x100 เท่านั้นหรือไม่ ฉันลอง gdal_fillnodata ซึ่งเร็วอย่างไม่น่าเชื่อเมื่อเทียบกับการแก้ไขใด ๆ แต่มันก็ใช้งานไม่ได้กับจุดที่เบาบางเกินไป ในขณะนี้ฉันกำลังใช้การวิเคราะห์แบบสามเหลี่ยมจาก Saga แต่มันช้ามากสำหรับอาร์เรย์ขนาดกลางและล้มเหลวกับตัวใหญ่
Miro

12

มีลักษณะที่เป็นgridding API ฉันไม่ทราบว่ามีการเปิดเผยในการผูก Python หรือไม่ แต่ถ้าไม่ใช่คุณโทรไปที่ยูทิลิตีgdal_gridผ่านทางโมดูลย่อย

GDAL grid API ใช้การให้น้ำหนักระยะทางผกผันค่าเฉลี่ยเคลื่อนที่และเพื่อนบ้านที่ใกล้ที่สุดโดยจะไม่ใช้เส้นโค้ง อีกตัวเลือกหนึ่งคือการใช้SciPy


1

ค่อนข้างเก่าแก่เธรดนี้ แต่ฉันได้เขียนโมดูลง่าย ๆ ที่ใช้อัลกอริทึม KNN จาก sklearn เรียกว่า skspatial

https://github.com/rosskush/skspatial

คุณสามารถนำเข้า shapefile โดยใช้ geopandas และเลือกคอลัมน์จากนั้นจะทำการแทรกพื้นผิวที่สามารถส่งออกไปยัง raster มันธรรมดามากและอาจไม่ใช่วิธีที่ดีที่สุดที่จะทำ

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