Como usar o gdal2tiles em uma imagem tiff personalizada recebida dos fornecedores para gerar blocos

10

Eu tenho me esforçado um pouco para gerar blocos para uma imagem de alta resolução que temos. A imagem atual que temos é uma imagem muito grande (+ 20 GB), salva como um arquivo GeoTiff.Imagem grande do GTiff

Gostaria de gerar os blocos usando o utilitário de linha de comando gdal2tiles e depois abri-los e visualizá-los em Cesium, usando o provedor de imagens TMS para fornecer os blocos. Usando gdalinfo, aqui estão alguns detalhes da imagem:

Driver: GTiff/GeoTIFF
Files: image.tif
Size is 52250, 56119
Coordinate System is:
PROJCS["WGS 84 / UTM zone 35S",
    GEOGCS["WGS 84",
        DATUM["WGS_1984",
            SPHEROID["WGS 84",6378137,298.257223563,
                AUTHORITY["EPSG","7030"]],
            AUTHORITY["EPSG","6326"]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",27],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",10000000],
    UNIT["meters",1],
    AUTHORITY["EPSG","32735"]]
Origin = (606276.000000000000000,7197873.000000000000000)
Pixel Size = (0.500000000000000,-0.500000000000000)
Metadata:
  AREA_OR_POINT=Area
  TIFFTAG_MAXSAMPLEVALUE=13165
  TIFFTAG_MINSAMPLEVALUE=1
  TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
  TIFFTAG_SOFTWARE=ERDAS IMAGINE
  TIFFTAG_XRESOLUTION=1
  TIFFTAG_YRESOLUTION=1
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  606276.000, 7197873.000) ( 28d 3'21.59"E, 25d19'55.12"S)
Lower Left  (  606276.000, 7169813.500) ( 28d 3'29.55"E, 25d35' 7.17"S)
Upper Right (  632401.000, 7197873.000) ( 28d18'55.92"E, 25d19'47.60"S)
Lower Right (  632401.000, 7169813.500) ( 28d19' 5.85"E, 25d34'59.57"S)
Center      (  619338.500, 7183843.250) ( 28d11'13.23"E, 25d27'27.58"S)
Band 1 Block=512x512 Type=UInt16, ColorInterp=Gray
Band 2 Block=512x512 Type=UInt16, ColorInterp=Undefined
Band 3 Block=512x512 Type=UInt16, ColorInterp=Undefined
Band 4 Block=512x512 Type=UInt16, ColorInterp=Undefined

Minha primeira tentativa foi usar gdal_translate para georreferenciar a imagem e, em seguida, usar gdalwarp para alterar a projeção para EPSG: 3857, conforme exigido por Cesium (consulte a referência da API)

gdal_translate -of VRT -a_srs EPSG:4326 -gcp 606275 7197875 28.055987 -25.331974 -gcp 606275 7169814 28.058200 -25.585326 -gcp 632400.5 7197875 28.31553 -25.329876 -gcp 632400.5 7169814 28.318286 -25.583209 image.tif newImage1.vrt
gdalwarp -of VRT -t_srs EPSG:3857 newImage1.vrt newImage2.vrt

No entanto, eu recebo muitos dos seguintes erros:

ERRO 1: latitude ou longitude excedida os limites

Outro método que tentei foi usar o gdal2tiles diretamente e gerar os blocos:

gdal2tiles.py image.tif

Isso criou uma pasta com uma subpasta (rotulada 18), sendo o único nível de zoom no qual os blocos foram criados. No entanto, as imagens que recebo aqui são completamente "erradas" e "embaçadas".

Um exemplo de um dos blocos:

insira a descrição da imagem aqui

Alguma sugestão para gerar ladrilhos para esta imagem imagem grande de uma área específica usando gdal2tiles para que eu possa carregar e visualizar em césio?

Atualizar

Então, depois de tentar a sugestão de @ iant, usei os seguintes comandos:

gdalwarp -co TILED=YES -co COMPRESS=DEFLATE -co BIGTIFF=YES -t_srs EPSG:3857 image.tif newImage.tif

Este comando funcionou perfeitamente até o final, onde recebi o seguinte erro:

ERRO 1: TIFFFillTile: erro de leitura na linha 43520, col 47104; obteve 35788250 bytes, esperados 37421449

Não tendo certeza do significado desse erro, eu o deixei por enquanto e ainda recebi uma imagem final "newImage.tif", produzida pela etapa gdalwarp. Usando isso, chamei gdal2tiles.py

gdal2tiles.py newImage.tif

Isso produziu uma pasta com subpastas 10-18 (e não apenas um nível de zoom 18 como eu obtive anteriormente). Ele também lê perfeitamente bem o Cesium, sem erros no console, mas a imagem ainda parece "errada":

Imagem carregada em césio

Estou considerando que meu problema pode ser o que o @ user30184 sugeriu "... os dados de origem não são adequados para gdal2tiles." No entanto, até que nosso provedor possa nos fornecer algo para uso com o gdal, isso é tudo o que tenho.

Eu estava pensando em talvez remover uma das bandas para evitar que gdal interferisse na última banda como um canal alfa. Alguma sugestão?

esforço
fonte
Por que você deseja georreferenciar a imagem? Ele já possui todas as informações do CRS.
Andrej

Respostas:

7

Eu acho que tudo que você precisa fazer é reprojetar usando:

gdalwarp -co TILED=YES -co COMPRESS=DEFLATE -t_srs EPSG:3857 newImage.tif image.tif

e depois ladrilhar:

gdal2tiles.py newImage.tif

Se o seu arquivo for muito grande, demore um pouco.

Ian Turton
fonte
Você pode controlar os níveis de zoom com o parâmetro -z, já tentou? Observe que sua imagem possui 4 bandas, o que pode levar a resultados inesperados, principalmente porque você lida com dados de 16 bits. Alguns pré-processamento pode ser necessária em primeiro lugar
user30184
Obrigado pela sua resposta @iant. Vou tentar isso e ver o que acontece. Talvez você possa explicar um pouco mais na sua resposta o que significam as opções que você selecionou? De acordo com a documentação, a opção -co "passa uma opção de criação para o driver do formato de saída". Então, você está adicionando mais propriedades ao arquivo tiff?
esforço
@ user30184 Ainda não tentei isso não. Como eu saberia quais deveriam ser os níveis de zoom? Ou posso especificá-los como quiser? Eu pensei que, ao deixar essa opção de lado, deixaria o script determinar o nível de zoom com base na área selecionada.
esforço
@ user30184, você também mencionou que posso obter resultados inesperados com uma imagem de 4 faixas e dados de 16 bits. Por que exatamente? Não está no formato correto para o processamento de ladrilhos gdal? Nesse caso, a imagem foi obtida diretamente do provedor, quais seriam as etapas para obter o arquivo no formato correto? Ou seja, um arquivo tiff GDAL? (Se eu puder dizer algo assim)
esforço
Ocorreu o seguinte problema ao executar o gdalwarp, como você sugeriu @iant: >>>>>>>>>>>>> ERRO 1: TIFFFillTile: erro de leitura na linha 43520, col 47104; obteve 35788250 bytes, esperados 37421449 ERRO 1: Falha no TIFFReadEncodedTile (). ERRO 1: pleiades_merge05m_2015-06-19.tif, banda 1: IReadBlock falhou no deslocamento X 86, deslocamento Y 109 ERRO 1: GetBlockRef falhou no deslocamento X bloco 86, deslocamento Y bloco 109 >>>>>>>>>>>> > Alguma sugestão para corrigir isso?
esforço
2

Suponho que sua imagem seja um dos produtos de 4 bandas da Airbus DS:

http://www.intelligence-airbusds.com/en/4951-which-spectral-mode-do-i-choose

O Gdal2tiles foi criado para dividir imagens visuais comuns em blocos png. Essas imagens usam 8 bits por banda e possuem uma banda (escala de cinza), 3 bandas (vermelho-verde-azul) de 4 bandas (reg-verde-azul + alfa).

Eu diria que sua pergunta é em grande parte irrelevante porque seus dados de origem não são adequados para os gdal2tiles. Você pode contornar os problemas imediatos que você tem agora, mas o resultado final ainda não será bom se você não processar novamente seus dados.

O motivo do bloco não atraente que você anexou à sua pergunta pode ser que a quarta faixa de dados é interpretada como um canal alfa.

user30184
fonte
Obrigado @ user30184, estive lendo alguns recursos e cheguei a um pensamento semelhante. Eu acho que seria melhor pedir aos nossos fornecedores que nos fornecessem arquivos tiff "compatíveis com GDAL", mas até que eles voltem para nós, isso é tudo o que temos. Eu estava pensando em talvez remover uma das bandas para evitar que gdal interferisse na última banda como um canal alfa. Alguma sugestão?
esforço
Use gdal_translate para cortar um pequeno subconjunto da imagem, gdal_translate -srcwin 20000 20000 1000 1000 original.tif sample.tifcaso contrário (grandes compensações para evitar as áreas nodata). Abra esta pequena imagem com o QGIS e você poderá jogar rapidamente com as configurações de visualização. Meu palpite sobre o canal alfa provavelmente está errado, caso contrário, o resultado deve parecer colorido, não cinza.
user30184
Obrigado @ user30184, fiz o que você sugeriu e abri-o com sucesso no QGIS. Veja este link: drive.google.com/open?id=0B97NtaPJrVz-anRYQmxjZFludk0 Como agora posso "depurar" meu problema? Usando o QGIS para fazer o gdalwarp e o gdal2tiles?
esforço