แปลง XYZ CSV ขนาดใหญ่เป็น GeoTIFF


11

ฉันมีข้อมูลจำนวนมากในรูปแบบของ CSV ที่มีพิกัด UTM XและYและค่าระดับความสูงเป็นZข้อมูล ฉันจำเป็นต้องแปลงข้อมูลเหล่านี้เป็น DEM เป็น GeoTIFF เพื่อการวิเคราะห์เพิ่มเติม ในกรณีนี้จำนวนมากหมายถึง 16 เมตร เส้นที่มีในจุดหนึ่งX, YและZต่อบรรทัด คะแนนมีการกระจายอย่างเท่าเทียมกันดังนั้นจึงไม่จำเป็นต้องมีการแก้ไข แต่ละจุดจะต้องถูกแปลงเป็นเซลล์แรสเตอร์

ข้อมูลต้นฉบับมาโดยไม่มีตัวคั่นพร้อมความกว้างคอลัมน์คงที่ ฉันคิดแล้วออกวิธีการแปลงไฟล์ไวยากรณ์ที่จะใช้คั่นแทนความกว้างคงที่และกำจัดตัวละครทุกพื้นที่โดยใช้โปรแกรมแก้ไขข้อความกระแสsed จากที่นี่ที่ปกติขั้นตอนการทำงานของฉันจะเป็นที่จะนำเข้าข้อมูลลงใน ArcGIS โดยการสร้างระดับคุณลักษณะจากX, YและZข้อมูลและเป็นขั้นตอนที่สองแปลง shapefile จุดเป็น GeoTIFF ใช้ชี้ไปที่ Rasterเครื่องมือ อย่างไรก็ตามไฟล์ที่ฉันมีในขณะนี้มีขนาดใหญ่เกินไปสำหรับกระบวนการนี้

แทนที่จะเป็นกระบวนการทำงานที่อธิบายไว้ข้างต้นฉันกำลังมองหาทางเลือกที่มีประสิทธิภาพและค้นพบ GDAL อย่างไรก็ตามในgdal_translateรูปแบบที่สนับสนุนที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้ในรายการประเภทไฟล์ที่รองรับคือตาราง ASCII แต่ไม่มี XYZ คั่นด้วยเครื่องหมายจุลภาค ปัญหาอีกประการหนึ่งคือฉันมีพิกัด UTMในขณะที่ตัวอย่างส่วนใหญ่ดูเหมือนจะใช้พิกัดองศาแบบทศนิยม อย่างไรก็ตามฉันต้องอยู่ในระบบ UTM (หรืออย่างน้อย GeoTIFF ของฉันจะต้องอยู่ในระบบพิกัด UTM)

ดังนั้นฉันกำลังมองหาวิธีแปลง CSV XYZ เป็น GeoTIFF โดยใช้ GDALแต่จนถึงขณะนี้ยังไม่สามารถหาตัวอย่างที่เกี่ยวข้องกับปัญหาที่แน่นอนนี้ได้ ฉันจะมีความสุขมากสำหรับคำแนะนำหรือตัวอย่างรหัส


ทำไมคุณคิดว่าวิธี GDAL จะมีประสิทธิภาพมากกว่าวิธี Esri
artwork21

ตัวอย่างที่แน่นอนของการใช้ xyz-csv สำหรับ tiff อยู่ใน documentaion ที่นี่: gdal.org/gdal_grid.html
เคลือบด้าน

คำถามคืออะไร? ตอนนี้คำตอบคือ "ใช่คุณสามารถใช้ GDAL เพื่อแปลง" :}
bugmenot123

คำถามคือวิธีการใช้การแปลง ความคิดเห็นของ Matte ดูเหมือนจะให้ทางแก้ปัญหา - ฉันจะลองทำสิ่งนี้
Arne

ตกลง! คุณสามารถให้กรณีตัวอย่างข้อมูลน้อยที่สุดได้หรือไม่? คุณต้องการคำตอบใน GDAL หรือเครื่องมือฟรีอื่น ๆ (เช่น GMT) ก็ใช้ได้เช่นกัน?
bugmenot123

คำตอบ:


16

คุณสามารถทำได้โดยใช้ GDAL ก็สนับสนุนโดยตรงในรูปแบบ XYZ ไม่สำคัญว่าพิกัดของคุณเป็น UTM หรือไม่ gdal_translate จะส่งออกในระบบพิกัดเดียวกัน

ดังนั้นการแปลงเป็น GeoTIFF นั้นง่ายเหมือน:

gdal_translate test.xyz test.tif

ดูที่GeoTIFF doc เพื่อดูตัวเลือกเอาต์พุต (เช่นการบีบอัด) และgdal_translate doc สำหรับข้อมูลการใช้งานเพิ่มเติม โดยเฉพาะอย่างยิ่งคุณควรระบุสิ่งที่ระบบพิกัดอยู่กับ-a_srsพารามิเตอร์

-a_srs srs_def:

ลบล้างการฉายสำหรับไฟล์เอาต์พุต srs_def อาจเป็นรูปแบบใด ๆ ของ GDAL / OGR ปกติ, WKT สมบูรณ์, PROJ.4, EPSG: n หรือไฟล์ที่มี WKT

gdal_translate -a_srs EPSG:12345 test.xyz test.tif

คั่นด้วยเครื่องหมายจุลภาค / เว้นวรรคและความกว้างคอลัมน์คงที่สนับสนุนโดยมีและไม่มีแถวส่วนหัว

ตัวคั่นคอลัมน์ที่ได้รับการสนับสนุนคือช่องว่างเครื่องหมายจุลภาคอัฒภาคและตาราง

$ head -n 2 test_space.xyz 
x y z
146.360047076550984 -39.0631214488636616 0.627969205379486084

$ gdalinfo test_space.xyz
Driver: XYZ/ASCII Gridded XYZ
Files: test_space.xyz
Size is 84, 66
Coordinate System is `'
Origin = (146.359922066953317,-39.062997159090934)
Pixel Size = (0.000250019195332,-0.000248579545455)
Corner Coordinates:
Upper Left  ( 146.3599221, -39.0629972) 
Lower Left  ( 146.3599221, -39.0794034) 
Upper Right ( 146.3809237, -39.0629972) 
Lower Right ( 146.3809237, -39.0794034) 
Center      ( 146.3704229, -39.0712003) 
Band 1 Block=84x1 Type=Float32, ColorInterp=Undefined
  Min=0.336 Max=0.721 

$ head -n 2 test_commas.xyz 
x, y, z
146.360047076550984, -39.0631214488636616, 0.627969205379486084

$ gdalinfo test_commas.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

$ head -n 2 test_formatted.xyz
x                       y                       z
146.3600471            -39.06312145             0.627969205

$ gdalinfo test_formatted.xyz
Driver: XYZ/ASCII Gridded XYZ
etc...

gotchasเดียวที่ฉันรู้คือ:

  1. การเปิดชุดข้อมูลขนาดใหญ่อาจช้าเนื่องจากไดรเวอร์ต้องสแกนไฟล์ทั้งหมดเพื่อกำหนดขนาดชุดข้อมูลและความละเอียดเชิงพื้นที่ และ
  2. ไฟล์จะต้องมีการเรียงอย่างถูกต้อง (โดย Y แล้ว X)

    เซลล์ที่มีพิกัด Y เดียวกันจะต้องอยู่ในบรรทัดที่ต่อเนื่องกัน สำหรับค่าพิกัด Y เดียวกันบรรทัดในชุดข้อมูลต้องถูกจัดระเบียบโดยการเพิ่มค่า X อย่างไรก็ตามค่าของพิกัด Y สามารถเพิ่มหรือลดลงได้

    $ head -n 5 test.csv
    x,y,z
    146.3707979,-39.07778764,0.491866767
    146.3787985,-39.07157315,0.614820838
    146.3637974,-39.07132457,0.555555582
    146.3630473,-39.07579901,0.481217861
    
    $ gdalinfo test.csv
    ERROR 1: Ungridded dataset: At line 3, too many stepY values
    gdalinfo failed - unable to open 'test.csv'.
    
    $ tail -n +2 test.csv| sort -n -t ',' -k2 -k1 > test_sorted.xyz
    
    $ head -n 5 test_sorted.xyz 
    146.3600471,-39.07927912,0.606096148
    146.3602971,-39.07927912,0.603663027
    146.3605471,-39.07927912,0.603663027
    146.3607971,-39.07927912,0.589507282
    146.3610472,-39.07927912,0.581049323
    
    $ gdalinfo test_sorted.xyz
    Driver: XYZ/ASCII Gridded XYZ
    etc...
    

2
ฉันจะสูงแนะนำให้กำหนด CRS เพื่อการส่งออกที่จะทำให้ชัดเจนว่าพิกัดคือ:-a_srs EPSG:12345
bugmenot123

1
Good point @bugmenot
2856

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