Jak używać gdal2tiles na niestandardowym obrazie tiff otrzymanym od dostawców do generowania kafelków

10

Trochę staram się wygenerować kafelki dla obrazu w wysokiej rozdzielczości, który mamy. Obecny obraz, który mamy, to bardzo duży obraz (+ 20 GB), zapisany jako plik GeoTiff.Duży obraz GTiff

Chciałbym wygenerować kafelki za pomocą narzędzia wiersza polecenia gdal2tiles, a następnie otworzyć i wyświetlić w Cesium, używając dostawcy obrazów TMS do dostarczenia kafelków. Korzystając z gdalinfo, oto niektóre szczegóły obrazu:

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

Moją pierwszą próbą było użycie gdal_translate do georeferencji obrazu, a następnie użycie gdalwarp do zmiany projekcji na EPSG: 3857, zgodnie z wymaganiami Cesium (patrz referencja 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

Jednak otrzymuję wiele z następujących błędów:

BŁĄD 1: szerokość lub długość geograficzna została przekroczona

Inną metodą, którą próbowałem, było bezpośrednie użycie gdal2tiles i generowanie płytek:

gdal2tiles.py image.tif

W ten sposób utworzono folder z jednym podfolderem (oznaczonym jako 18), który jest jedynym poziomem powiększenia, na którym zostały utworzone kafelki. Jednak obrazy, które tu dostaję, są całkowicie „złe” i „rozmyte”.

Przykład jednego z kafelków:

wprowadź opis zdjęcia tutaj

Wszelkie sugestie dotyczące generowania kafelków dla tego obrazu duży obraz określonego obszaru za pomocą gdal2tiles, dzięki czemu mogę go załadować i wyświetlić w Cesium?

Aktualizacja

Po wypróbowaniu sugestii @ iant użyłem następujących poleceń:

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

To polecenie działało idealnie do samego końca, gdy wystąpił następujący błąd:

BŁĄD 1: TIFFFillTile: Błąd odczytu w wierszu 43520, kol. 47104; dostał 35788250 bajtów, oczekiwano 37421449

Nie jestem pewien, co znaczy ten błąd, zostawiłem go na chwilę i nadal otrzymałem końcowy obraz „newImage.tif”, wyprodukowany przez krok gdalwarp. Za pomocą tego nazwałem gdal2tiles.py

gdal2tiles.py newImage.tif

W ten sposób powstał folder z podfolderami 10-18 (a nie tylko jednym poziomem powiększenia 18, jak wcześniej). Odczytuje również doskonale w Cesium, bez żadnych błędów konsoli, ale obraz nadal wygląda „źle”:

Obraz załadowany do cezu

Rozważam, że mój problem może być, ponieważ @ user30184 sugeruje „... dane źródłowe nie są odpowiednie dla gdal2tiles”. Jednak dopóki nasz dostawca nie będzie w stanie dostarczyć nam czegoś do użycia z gdal, to wszystko, co mam.

Zastanawiałem się nad usunięciem jednego z pasm, aby uniknąć zakłócenia ostatniego pasma jako kanału alfa. Jakieś sugestie?

wysiłek
źródło
Dlaczego chcesz georeferencję obrazu? Zawiera już wszystkie informacje CRS.
AndreJ

Odpowiedzi:

7

Myślę, że wszystko, co musisz zrobić, to zmienić to za pomocą:

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

a następnie ułóż go:

gdal2tiles.py newImage.tif

Jeśli plik jest bardzo duży, może to chwilę potrwać.

Ian Turton
źródło
Możesz kontrolować poziomy powiększenia za pomocą parametru -z, czy już próbowałeś? I zauważ, że twój obraz ma 4 pasma, co może prowadzić do nieoczekiwanych rezultatów, zwłaszcza, że ​​masz do czynienia z 16-bitowymi danymi. Najpierw może być potrzebne
wstępne przetwarzanie
Dziękujemy za odpowiedź @iant. Spróbuję tego i zobaczę, co się stanie. Czy mógłbyś wyjaśnić w odpowiedzi nieco więcej, co oznaczają wybrane przez ciebie opcje? Zgodnie z dokumentacją opcja -co „przekazuje opcję tworzenia do sterownika formatu wyjściowego”. Czy w efekcie dodajesz więcej właściwości do pliku tiff?
wysiłek
@ user30184 Nie próbowałem jeszcze tego nie. Skąd mam wiedzieć, jakie powinny być poziomy powiększenia? Czy mogę określić je tak, jak chcę? Pomyślałem, że pomijając tę ​​opcję, pozwolę skryptowi określić poziom powiększenia na podstawie wybranego obszaru.
wysiłek
@ user30184 wspomniałeś również, że mogę uzyskać nieoczekiwane wyniki z 4-pasmowym obrazem i 16-bitowymi danymi. Dlaczego dokładnie Czy nie jest w odpowiednim formacie do obróbki płytek gdal? Jeśli tak, obraz został uzyskany bezpośrednio od dostawcy, jakie byłyby kroki, aby uzyskać plik w odpowiednim formacie? Mianowicie plik tiff GDAL? (Jeśli mogę coś takiego powiedzieć)
wysiłek,
Wystąpiły następujące problemy z uruchomieniem gdalwarp zgodnie z sugestią @iant: >>>>>>>>>>>> BŁĄD 1: TIFFFillTile: Błąd odczytu w wierszu 43520, kol. 47104; dostał 35788250 bajtów, oczekiwano 37421449 BŁĄD 1: Błąd TIFFReadEncodedTile (). BŁĄD 1: pleiades_merge05m_2015-06-19.tif, pasmo 1: IReadBlock nie powiodło się przy przesunięciu X 86, przesunięcie Y 109 BŁĄD 1: GetBlockRef nie powiodło się przy przesunięciu bloku X 86, przesunięcie bloku 109 109 >>>>>>>>>>>> > Jakieś sugestie, aby to naprawić?
wysiłek
2

Podejrzewam, że twój wizerunek to niektóre z 4-pasmowych produktów Airbusa DS:

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

Gdal2tiles jest przeznaczony do dzielenia wspólnych obrazów na kafelki png. Takie obrazy używają 8 bitów na pasmo i mają jeden pas (skala szarości), 3 pasma (czerwono-zielono-niebieski) z 4 pasm (reg-zielono-niebieski + alfa).

Powiedziałbym, że twoje pytanie jest w dużej mierze nieistotne, ponieważ dane źródłowe nie są odpowiednie dla gdal2tiles. Możesz poradzić sobie z bezpośrednimi problemami, które masz teraz, ale ostateczny wynik nadal nie będzie dobry, jeśli nie przetworzysz ponownie swoich danych.

Przyczyną nie wyglądającego dobrze kafelka, który załączyłeś do pytania, może być to, że czwarte pasmo danych jest interpretowane jako kanał alfa.

użytkownik30184
źródło
Dziękuję @ user30184, czytałem o niektórych zasobach i doszedłem do podobnej myśli. Myślę, że najlepiej poprosić naszych dostawców o dostarczenie nam plików tiff „zgodnych z GDAL”, ale dopóki nie wrócą do nas, to wszystko, co mamy. Zastanawiałem się nad usunięciem jednego z pasm, aby uniknąć zakłócenia ostatniego pasma jako kanału alfa. Jakieś sugestie?
wysiłek
Użyj gdal_translate do wycięcia małego podzbioru z obrazu, gdal_translate -srcwin 20000 20000 1000 1000 original.tif sample.tifaby to zrobić (duże przesunięcia dla uniknięcia obszarów nodata). Otwórz ten mały obraz za pomocą QGIS i powinieneś być w stanie szybko grać z ustawieniami oglądania. Zgaduję, że kanał alfa jest prawdopodobnie błędny, w przeciwnym razie wynik powinien wyglądać kolorowo, a nie szary.
user30184,
Dzięki @ user30184, zrobiłem tak, jak zasugerowałeś i pomyślnie otworzyłem go w QGIS. Zobacz ten link: drive.google.com/open?id=0B97NtaPJrVz-anRYQmxjZFludk0 Jak mogę teraz przejść do „debugowania” mojego problemu? Używasz QGIS do robienia gdalwarp i gdal2tiles?
wysiłek