Як обчислити відстань до функції з gdal_proximity?


28

Я використовую gdal_proximity, щоб знайти відстань до найближчої головної річки в США (нижчі 48 штатів). Я спрогнозував проточні лінії мережі NHD + до Конуса Альберса (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

Далі, близькість, яка нас цікавить, позитивна і менша або дорівнює 50 000м. Відповідний тип даних - це непідписане 16-бітове ціле число UInt16. Крім того, якщо ми встановимо значення "без даних" до максимуму 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.