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?


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.