Como calcular a distância de um recurso com gdal_proximity?

28

Estou usando gdal_proximity para encontrar a distância até o rio principal mais próximo dos EUA (48 estados inferiores). Projetei as linhas de fluxo da rede NHD + para Conus Albers (epsg: 5070), selecionei rios com ordem de fluxo> 5 e rasterizei, queimando rios como 255, sem rio como 0. Isso é bom, mas agora preciso encontrar a distância para o rio mais próximo para locais dentro de 50 km. O arquivo de entrada tem uma resolução de 30m em escala continental, portanto é muito grande, mas a conversão deve ser um comando simples 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

Isso parece quase funcionar, mas está produzindo um padrão geométrico estranho na saída (veja a imagem). Os dados presentes na saída foram processados ​​corretamente. Alguém pode sugerir por que falta tanto da saída?

Proximidade com o rio

Edit: Para testar se isso foi causado por qualquer um dos parâmetros opcionais, executei o gdal_proximity novamente nesta configuração:

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

Qual produziu essencialmente o mesmo resultado:

Proximidade ao rio, sem parâmetros opcionais

Meu único pensamento é que isso pode estar relacionado ao tamanho da varredura (~ 100 gb descompactado. Até onde eu sei, não há limite para o tamanho de um BigTiff, mas talvez exista um limite para o que gdal pode analisar efetivamente?

R Rodes
fonte
1
o que acontece se você desligar lado a lado = SIM? Além disso, funciona se você mudar de GEO para PIXEL? (A saída pode não ser adequado, mas pode reduzir o problema)
Steven Kay
Obrigado pela sugestão - adicionou uma resposta à pergunta original.
R Rhodes
Em que resolução seu infile.tif está?
Shahryar
2
Você pode tentar ler os dados usando GDAL em lotes (linhas) e ver se o problema é que os dados em si ou o QGIS não conseguem visualizá-los? Um primeiro passo para encontrar esse problema é reduzir a extensão espacial para uma amostra AOI.
RutgerH

Respostas:

3

Eu suspeito que você esteja atingindo um limite de memória em algum lugar, possivelmente quando a RAM estiver esgotada e o sistema operacional despejar em um arquivo de paginação. Monitore os recursos do sistema durante o processo. Não está claro para mim por que seus resultados ocorrem em faixas curvas, mas verifique se você projetou (salvou) todos os dados no mesmo sistema de coordenadas.

Vamos dar uma olhada nos tipos de dados numéricos para ajudar esse algoritmo. A rede de fluxo rasterizado precisa conter apenas valores binários, para que possamos economizar recursos usando um Bytetipo de dados raster. Grave um valor de 1 para fluxos e 0 para segundo plano:

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

Em seguida, a proximidade em que estamos interessados ​​é positiva e menor ou igual a 50.000 m. Um tipo de dados apropriado é um número inteiro de 16 bits não assinado UInt16. Além disso, se definirmos 'no data' para o máximo de 65535, podemos manter um valor 0 para as células de fluxo.

Se necessário, você também pode descer para um número inteiro não assinado de 8 bits UInt8e ainda ter uma precisão de proximidade de ~ 200m.

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

* Observe que eu usei um tamanho de célula de 50m. A gdal_proximity consumiu ~ 20 GB de RAM e levou 5 minutos na minha máquina. Se você é limitado por RAM, divida a varredura de entrada em tamanhos gerenciáveis, como outros observaram.

resultados gdal_proximity

CrystallineEntity
fonte