Mam obraz o rozmiarze 1 GB (.tif), o szerokości i wysokości 94000 x 71680. Chciałbym podzielić ten obraz na kafelki 20000 x 20000, aby móc je przetworzyć.
W jaki sposób mogę to zrobić?
Mam obraz o rozmiarze 1 GB (.tif), o szerokości i wysokości 94000 x 71680. Chciałbym podzielić ten obraz na kafelki 20000 x 20000, aby móc je przetworzyć.
W jaki sposób mogę to zrobić?
Odpowiedzi:
Proponuję dwa rozwiązania: pierwsze za pomocą QGIS, drugie za pomocą Pythona (GDAL).
W QGIS możesz utworzyć mozaikę VRT.
Postępuj zgodnie z tą procedurą (patrz obrazek poniżej):
Save As...
;Create VRT
opcję;OK
przycisk.Na przykład użycie parametrów w powyższym oknie dialogowym na tym przykładowym rastrze (parametry, które ustawiam są wybierane losowo):
wygeneruje 100 płytek na ścieżce określonej w kroku 4:
Ładowanie ich do QGIS wygląda następująco:
Jak poprawnie napisano w komentarzach @ bugmenot123, wynik wygląda dziwnie tylko dlatego, że styl każdego obrazu pasuje do rozkładu wartości na obraz (ale dane są całkowicie w porządku).
Innym sposobem na uzyskanie tego samego wyniku jest użycie GDAL ( gdal_translate ).
W odniesieniu do tego samego przykładu opisanego powyżej możesz użyć tego skryptu:
import os, gdal
in_path = 'C:/Users/Marco/Desktop/'
input_filename = 'dtm_5.tif'
out_path = 'C:/Users/Marco/Desktop/output_folder/'
output_filename = 'tile_'
tile_size_x = 50
tile_size_y = 70
ds = gdal.Open(in_path + input_filename)
band = ds.GetRasterBand(1)
xsize = band.XSize
ysize = band.YSize
for i in range(0, xsize, tile_size_x):
for j in range(0, ysize, tile_size_y):
com_string = "gdal_translate -of GTIFF -srcwin " + str(i)+ ", " + str(j) + ", " + str(tile_size_x) + ", " + str(tile_size_y) + " " + str(in_path) + str(input_filename) + " " + str(out_path) + str(output_filename) + str(i) + "_" + str(j) + ".tif"
os.system(com_string)
Oczywiście musisz dostosować wartości do konkretnego przypadku.
Nie dziel się
Ci gdalbuildvrt można tworzyć wirtualne płytki, które będą używać tylko kilka bajtów na dysku. Następnie możesz użyć większości programów, które wezmą twój vrt jako dane wejściowe do wykonania przetwarzania.
Alternatywnie wolę poszukać narzędzia, które może pracować z obrazem 1 Gb, niż dzielić i scalać obraz. Na przykład OTB ma większość możliwości standardowego (a czasem zaawansowanego) przetwarzania obrazu z dużymi obrazami. Możesz owinąć OTB dla Pythona lub uruchomić go z QGIS lub z linii poleceń.
Za pomocą narzędzia Podziel raster możesz podzielić raster na kafelki w oparciu o kilka metod podziału, w tym wielkość każdej płytki lub liczbę kafelków .
Zobacz także Podział rastra w ArcGIS
Innym rozwiązaniem wykorzystującym GDAL jest narzędzie gdal_retile.py :
mkdir image_tiles
gdal_retile.py -v -r bilinear -levels 1 -ps 20000 20000 -co "TILED=YES" -co "COMPRESS=JPEG" -targetDir image_tiles big_input_image.tif
Aby uzyskać więcej informacji, zobacz: http://www.gdal.org/gdal_retile.html