我正在使用gdal_proximity查找距美国(下48个州)最近的主要河流的距离。我已经将NHD +网络流线投影到Conus Albers(epsg:5070),选择了河流顺序> 5的河流,并且进行了栅格化处理,燃烧的河流为255,没有河流为0。这很好,但是现在我需要查找距离到最近的河流(50公里以内)。输入文件在大陆范围内的分辨率为30m,因此非常大,但转换应该是一个简单的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可以有效分析的内容可能有限制吗?

评论

如果关闭tiled = YES会发生什么?此外,如果您从GEO更改为PIXEL,是否可以使用? (输出可能不合适,但可能会缩小问题的范围)

感谢您的建议-已添加对原始问题的答复。

您的infile.tif使用什么分辨率?

您可以尝试使用GDAL分批(行)读取数据,看看问题出在数据本身还是QGIS无法可视化?解决此问题的第一步是将空间范围缩小为样本AOI。

#1 楼

我怀疑您正在某个地方达到内存限制,可能是在RAM耗尽并且操作系统转储到页面文件时。在此过程中监视系统资源。我不清楚您的结果为什么会出现在弯曲的条带中,但请确保将所有数据投影(保存)到相同的坐标系中。

让我们看一下数字数据类型以帮助您此算法。栅格化的流网络仅需要包含二进制值,因此我们可以使用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,000m。合适的数据类型是16位无符号整数UInt16。此外,如果将“无数据”设置为最大65535,则可以为流单元保留0值。

如有必要,还可以降级为8位无符号整数UInt8和仍然具有约200m的接近精度。

*请注意,我使用的是50m像元大小。 gdal_proximity消耗了约20GB RAM,并在我的计算机上花费了约5分钟。如果您受RAM限制,请按照其他说明将输入栅格分割为可管理的大小。