Как рассчитать расстояние до объекта с помощью gdal_proximity?

28

Я использую gdal_proximity, чтобы найти расстояние до ближайшей крупной реки через США (нижние 48 штатов). Я спроецировал линии электропередач NHD + на Conus Albers (epsg: 5070), выбрал реки с порядком потока> 5 и растеризовал, сжигая реки как 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 ГБ без сжатия. Насколько я знаю, нет ограничения на размер BigTiff, но, возможно, есть предел тому, что может gdal эффективно анализировать?

Р Родос
источник
1
что произойдет, если вы выключите плитку = ДА? Кроме того, это работает, если вы переходите с GEO на PIXEL? (Вывод может не подходить, но это может сузить проблему)
Стивен Кей
Спасибо за предложение - добавили ответ на оригинальный вопрос.
R Rhodes
В каком разрешении ваш infile.tif?
Шахриар
2
Можете ли вы попытаться прочитать данные, используя GDAL, в виде пакетов (строк) и посмотреть, заключается ли проблема в том, что сами данные или QGIS не могут их визуализировать? Первым шагом к нахождению этой проблемы является уменьшение пространственного экстента до выборки AOI.
RutgerH

Ответы:

3

Я подозреваю, что вы где-то достигли предела памяти, возможно, когда ОЗУ исчерпано и ОС выгружает файл подкачки. Контролируйте свои системные ресурсы во время процесса. Мне непонятно, почему ваши результаты отображаются в кривых полосах, но убедитесь, что вы спроецировали (сохранили) все данные в одну и ту же систему координат.

Давайте посмотрим на числовые типы данных , чтобы помочь этому алгоритму. Растеризованная потоковая сеть должна содержать только двоичные значения, поэтому мы можем сэкономить ресурсы, используя 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

Далее, интересующая нас близость положительна и меньше или равна 50000м. Подходящим типом данных является 16-разрядное целое число без знака UInt16. Кроме того, если мы установим значение «no data» на максимум 65535, мы можем сохранить значение 0 для ячеек потока.

При необходимости вы также можете перейти к 8-разрядному целому числу без знака UInt8и при этом иметь точность приближения ~ 200 м.

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

* Обратите внимание, что я использовал размер ячейки 50м. Gdal_proximity потреблял ~ 20 ГБ оперативной памяти и занимал ~ 5 минут на моей машине. Если у вас ограничено ОЗУ, разделите входной растр на управляемые размеры, как отмечали другие.

Результаты gdal_proximity

CrystallineEntity
источник