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?
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:
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?
fonte
Respostas:
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
Byte
tipo de dados raster. Grave um valor de 1 para fluxos e 0 para segundo plano: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
UInt8
e ainda ter uma precisão de proximidade de ~ 200m.* 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.
fonte