将巨大的XYZ CSV转换为GeoTIFF


11

我有大量CSV格式的数据,其中包含UTM坐标XY和高程值作为Z信息。我需要将这些数据转换为GeoTIFF的DEM以便进一步分析。在这种情况下,大量意味着16 m。线,具有在一个点XYZ每行。这些点是均匀分布的,因此不需要插值;每个点仅需要转换为栅格像元。

原始数据不带分隔符,列宽固定。我已经弄清楚了如何使用流文本编辑器sed将文件语法转换为使用分隔符而不是固定宽度并消除所有空格字符。从这里开始,通常,我的工作流程是通过根据和数据创建要素类,将数据导入ArcGIS XY然后Z第二步,使用“ 指向栅格”工具将点shapefile转换为GeoTIFF 。但是,对于该过程,我当前拥有的文件太大。

除了寻找上述工作流程之外,我一直在寻找一种有效的替代方法,并发现了GDAL。但是,在gdal_translate,我可以在支持的文件类型列表中找到的最接近的受支持格式是ASCII网格,但没有逗号分隔的XYZ。另一个困难是,我有UTM坐标,而大多数示例似乎都使用十进制度坐标。但是,我需要停留在UTM系统内(或者至少,我的输出GeoTIFF必须位于UTM坐标系内)。

因此,我正在寻找一种使用GDAL将CSV XYZ转换为GeoTIFF的方法,但到目前为止,尚无法找到处理此确切问题的示例。对于某些提示甚至代码示例,我将感到非常高兴。


您为什么认为GDAL方法比Esri方法更有效?
艺术品

使用xyz-csv进行tiff转换的确切示例在此处的文献中:gdal.org/gdal_grid.html
Matte

到底是什么问题?现在的答案是“是的,您可以使用GDAL进行转换”。:}
bugmenot123 '02

问题是如何应用转换。Matte的评论似乎提供了解决方案-我会尝试的。
Arne

好!您能否提供数据的最小示例?您要用GDAL回答还是其他免费工具(例如GMT)也可以?
bugmenot123

Answers:


16

您可以使用GDAL执行此操作,它直接支持XYZ格式。坐标是否为UTM都无关紧要,gdal_translate将在同一坐标系中输出。

因此,转换为GeoTIFF很简单:

gdal_translate test.xyz test.tif

查看GeoTIFF文档以获取输出选项(例如压缩),并查看gdal_translate文档以获取更多使用信息。特别是,您应该使用-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...

我知道的唯一陷阱是:

  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
好点@bugmenot
user2856'2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.