A melhor maneira de cortar um arquivo ECW de varredura grande?

9

Estou tentando cortar um grande ECW (detalhes abaixo), mas o arquivo raster é muito grande para ser processado completamente.

Alguns detalhes da ECW abaixo

Driver: Wavelets compactadas ECW / ERDAS (SDK 5.0)

tamanho do arquivo: 50gb O tamanho é 450000, 565081 Tamanho do pixel: 0,15 0,15 COLORSPACE = RGB COMPRESSION_RATE_TARGET = 9 VERSION = 2 Número de bandas: 4

A área que eu quero cortar é aproximadamente 1/5 do arquivo original.

Aqui estão os métodos que experimentei sem sucesso:

  1. Arcgis usado para salvar o ecw em tiff / outros formatos ... (eu rapidamente desisti)

  2. Utilizou o Qgis e sua ferramenta clipper ... a criação do arquivo ficou paralisada em cerca de 40%.

  3. Utilizou o gdal_translate do OSGeo4W com outras opções que não o Qgis. (Tentei pensar que TALVEZ libertar alguma memória que não usasse Qgis seria o truque)

  4. Usei gdal_retile pensando que eu cortaria a imagem em pedaços e pegaria a que eu queria. O comando "gdal_retile -ps 10000 10000 -of ecw -tileIndex tile.shp -targetDir input.ecw Isso travou ainda mais rápido"

Alguém tem alguma ideia?

Para informações eu corro o windows 7 64bits em um i5-3470 3.2Ghz com 16gb de ram.

Azul
fonte

Respostas:

5

Outras idéias que você pode tentar:

  1. gdal_translate com a opção -srcwin
  2. gdalwarp com as opções -cutline e -crop_to_cutline e -wm. O último especifica a memória para armazenamento em cache e pode solucionar os problemas que você teve ao usar o clipper no QGIS (pois essa é essencialmente a mesma função)
  3. A calculadora raster QGIS define a extensão para a área desejada (mais simples que o clipper).
  4. SAGA-> Clipe de grade com polígono - quem sabe, pode ser mais eficiente em memória.
  5. Codifique uma solução usando Python e Numpy / SciPy para ler apenas um subconjunto da varredura na memória e salve-a.

Eu suspeito que fazer um corte muito simples até o ponto (seja com a calculadora raster ou com o switch -srcwin em gdal_translate) consumirá menos memória do que cortar com um polígono, porque você não tem verificações e conversões de geometria. A opção 5 deve usar o mínimo de memória, pois você está lendo apenas o que precisa. Dê uma olhada neste tutorial se precisar de um 'como' (adapte o bit na leitura e escrita por bloco).

MappaGnosis
fonte
Obrigado pela resposta! Vou experimentar o SAGA e, se não funcionar, experimentarei o Numpy.
Azul
5

Você pode cortá-lo diretamente com a ferramenta gdal gdal_translate se souber as coordenadas da sua área de interesse, se for georreferenciado:

gdal_translate -projwin [ulx uly lrx lry] infile outfile  

Caso contrário, use a -srswinbandeira assim:

Arquivo de infile gdal_translate -srcwin [xoff yoff xsize ysize].

Outra opção é criar uma varredura 'virtual' (de alguns kilobytes) que aponte para o seu conjunto de dados inicial, com o gdalbuildvrt .

gdalbuildvrt -te [xmin ymin xmax ymax] infile outfile.vrt

Infelizmente, você precisará de um arquivo georreferenciado para usar o gdalbuildvrt.

Após o clipe, não esqueça de criar pirâmides para facilitar a visualização. O comando a seguir criará pirâmides externas compactadas com o algoritmo DEFLATE (sem perdas):

gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16

Como etapa final, você pode calcular as estatísticas também para evitar alguns problemas estúpidos com um programa comercial específico:

gdalinfo -stats outfile
nickves
fonte
Obrigado pela resposta nickves. Criei uma varredura virtual e executei <code> gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16 </code> Não sei ao certo por que recebi a seguinte mensagem de erro ERRO 1: Não é possível criar o arquivo TIFF devido à falta codec para DEFLATE. Falha na construção da visão geral.
Azul
Verifique os erros qgis-bug: 8782 e osge4w-bug: 382 se eles descreverem o seu caso. Enquanto isso, tente criar as visões gerais sem algoritmos de compactação ou escolha outro .
nickves
parece que eu trabalhei em duas etapas: gdaladdo -ro input.vrt 2 4 8 16então gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE input.vrt 2 4 8 16. Meu objetivo é terminar com um ECW, então eu tentei gdal_translate -of ECW input.vrt output.ecw e recebi o seguinte erro: #0ERROR 6: GDALDriver::Create() ... no create method implemented for this format.
Blue
O @blue ECW é um formato proprietário e precisa de tratamento especial. Por favor, verifique primeiro se gdal pode escrever em ECW com gdalinfo --formats. Se você não vê o ECW na lista, tente as seguintes instruções: faunalia.pt/node/438
nickves
0

Um uso direto de "clipe" gdalwarpdeve funcionar (eu sei que essa é uma pergunta antiga: 18 meses de IRL é como uma época geológica nos anos da Internet).

Eu tenho uma antena de 70Gb (ECW, 94000x81000 pixel a 10cm / px) e a GDAL pode cortá-la arbitrariamente com um shapefile usando

gdalwarp -cutline [clipfile] -crop_to_cutline [infile] [outfile]

na linha de comando do Windows. (Percebo que essa solução requer a criação de um shapefile para a área de interesse de destino, mas esse não é o maior desafio conhecido pelo GIS).

Para extrair um pedaço do tamanho de um subúrbio leva ~ 0,4s; dividir o arquivo em quartos leva 4 segundos. As especificações da minha máquina não são muito diferentes (i7-4770 @ 3.4GHz, 16GB RAM, Win7-64 Ultimate).

GT.
fonte
gdalwarp já foi mencionado. As informações sobre desempenho e tamanho de imagem de exemplo específico são uma adição bem-vinda, mas na verdade isso deve ser um comentário para gis.stackexchange.com/a/74450/108 (e fazer uma edição sugerida com a linha de comando com formatação de código também seria bem-vindo , é mais fácil de ler)
Matt Wilkie