如何使用gdal_proximity计算到要素的距离?


28

我正在使用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的大小可能存在限制有效分析?


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

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

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

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

Answers:


3

我怀疑您正在某个地方达到内存限制,可能是当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的接近精度。

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

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

gdal_proximity结果

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.