จะคำนวณระยะทางไปยังสถานที่ที่มี gdal_proximity ได้อย่างไร?


28

ฉันใช้ gdal_proximity เพื่อค้นหาระยะทางไปยังแม่น้ำสายสำคัญที่ใกล้ที่สุดทั่วสหรัฐอเมริกา (ต่ำกว่า 48 รัฐ) ฉันได้คาดการณ์ flowlines ของเครือข่าย NHD + ไปที่ Conus Albers (epsg: 5070) แม่น้ำที่เลือกพร้อมลำดับการสตรีม> 5 และ rasterized การเผาไหม้แม่น้ำที่ 255 ไม่มีแม่น้ำที่ 0 เท่านี้ก็ใช้ได้ แต่ตอนนี้ฉันต้องหาระยะทาง ไปยังแม่น้ำที่ใกล้ที่สุดสำหรับไซต์ภายใน 50 กม. ไฟล์อินพุตอยู่ที่ความละเอียด 30 ม. ในระดับคอนติเนนทัลดังนั้นใหญ่มาก แต่การแปลงควรเป็นคำสั่ง gdal_proximity แบบง่าย

gdal_proximity.bat -values 255 -distunits GEO -maxdist 50000 -nodata -999 infile.tif outfile.tif -co COMPRESS=DEFLATE -co BIGTIFF=YES -co TILED=YES

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

ตั้งอยู่ใกล้กับแม่น้ำ

แก้ไข: เพื่อทดสอบว่าสิ่งนี้เกิดจากพารามิเตอร์ทางเลือกใด ๆ หรือไม่ฉันรัน gdal_proximity อีกครั้งในการกำหนดค่านี้:

gdal_proximity.bat H:\data\tmp\NHDplus_network_flowline_SO6plus.tif H:/data/tmp/NHDplus_network_flowline_SO6plus_proximity.tif -values 255 -maxdist 50000 -of GTiff

ซึ่งให้ผลหลักผลลัพธ์เดียวกัน:

ความใกล้เคียงกับแม่น้ำไม่มีพารามิเตอร์ที่เป็นทางเลือก

ความคิดเดียวของฉันคือมันอาจเกี่ยวข้องกับขนาดของแรสเตอร์ (~ 100 gb ไม่มีการบีบอัดเท่าที่ฉันทราบว่าไม่มีขีด จำกัด ขนาดของ BigTiff แต่อาจมีข้อ จำกัด ที่ gdal สามารถทำได้ วิเคราะห์ได้อย่างมีประสิทธิภาพ?


1
จะเกิดอะไรขึ้นถ้าคุณปิดกระเบื้อง = ใช่ นอกจากนี้ยังใช้งานได้ถ้าคุณเปลี่ยนจาก GEO เป็น PIXEL หรือไม่ (ผลลัพธ์อาจไม่เหมาะสม แต่อาจทำให้ปัญหาแคบลง)
Steven Kay

ขอบคุณสำหรับคำแนะนำ - ได้เพิ่มคำตอบสำหรับคำถามเดิม
R Rhodes

คุณแก้ปัญหาอะไร infile.tif ได้ที่
shahryar

2
คุณลองอ่านข้อมูลโดยใช้ GDAL เป็นชุด (บรรทัด) แล้วดูว่าปัญหาคือตัวข้อมูลเองหรือ QGIS ไม่สามารถมองเห็นภาพได้หรือไม่? ขั้นตอนแรกในการค้นหาปัญหานี้คือการลดขอบเขตเชิงพื้นที่ให้กับตัวอย่าง AOI
RutgerH

คำตอบ:


3

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

ให้ดูที่ประเภทข้อมูลเพื่อช่วยอัลกอริทึมนี้ เครือข่ายสตรีมแบบ rasterized ต้องการเพียงค่าไบนารีดังนั้นเราจึงสามารถประหยัดทรัพยากรได้โดยใช้Byteชนิดข้อมูลแบบแรสเตอร์ เบิร์นค่า 1 สำหรับสตรีมและ 0 สำหรับพื้นหลัง:

gdal_rasterize -l streams -burn 1 -tr 50 50 -a_nodata 0 -te -2339101 311625 2227004 3134200 -ot Byte -of GTiff streams.shp streams.tif

ถัดไปความใกล้เคียงที่เราสนใจนั้นเป็นไปในทางบวกและน้อยกว่าหรือเท่ากับ 50,000 เมตร UInt16ประเภทข้อมูลที่เหมาะสมเป็นจำนวนเต็ม 16 บิต นอกจากนี้หากเราตั้งค่า 'ไม่มีข้อมูล' เป็นสูงสุด 65535 เราสามารถเก็บค่า 0 สำหรับเซลล์สตรีมได้

หากจำเป็นคุณสามารถลดจำนวนเต็มที่ไม่ได้ลงชื่อ 8 บิตUInt8และยังคงมีความแม่นยำใกล้เคียง ~ 200m

gdal_proximity.bat -srcband 1 -distunits GEO -values 1 -maxdist 50000 -nodata 65535 -ot UInt16 -of GTiff streams.tif proximity.tif

* โปรดทราบว่าฉันใช้ขนาดเซลล์ 50 ม. gdal_proximity ใช้ RAM ~ 20GB และใช้เวลาประมาณ 5 นาทีบนเครื่องของฉัน หากคุณมี RAM จำกัด ให้แบ่ง raster อินพุตเป็นขนาดที่สามารถจัดการได้ตามที่คนอื่น ๆ ระบุไว้

ผลลัพธ์ของ gdal_proximity

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