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.
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:
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”:
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?