Dzielenie obrazu .tif na kilka kafelków? [Zamknięte]

13

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ć?

Anup Panwar
źródło
Anup, github.com/mapbox/rasterio dałby Ci tablicę numpy twoich danych wejściowych. Możesz podzielić to za pomocą metod numpy na scipy i łatwo zapisać każdą część do nowego pliku. Czy takie rozwiązanie się kwalifikuje? Jeśli tak, musisz powiedzieć, w jaki sposób należy traktować „nierówne bity” (71680 nie da się podzielić przez 20000).
bugmenot123,

Odpowiedzi:

23

Proponuję dwa rozwiązania: pierwsze za pomocą QGIS, drugie za pomocą Pythona (GDAL).


Rozwiązanie wykorzystujące QGIS

W QGIS możesz utworzyć mozaikę VRT.

Postępuj zgodnie z tą procedurą (patrz obrazek poniżej):

  1. Załaduj raster do panelu warstw ;
  2. Kliknij go prawym przyciskiem myszy i wybierz Save As...;
  3. Sprawdź Create VRTopcję;
  4. Wybierz folder, w którym zostaną zapisane dane wyjściowe;
  5. Ustaw zakres (jeśli chcesz pracować na całym rastrze, niczego nie modyfikuj);
  6. Wybierz, jeśli używasz bieżącej rozdzielczości (sugeruję pozostawić ją jako domyślną);
  7. Ustaw maksymalną liczbę kolumn i wierszy (w twoim przypadku powinno to być 20000 kolumn i 2000 wierszy);
  8. Naciśnij OKprzycisk.

wprowadź opis zdjęcia tutaj

Na przykład użycie parametrów w powyższym oknie dialogowym na tym przykładowym rastrze (parametry, które ustawiam są wybierane losowo):

wprowadź opis zdjęcia tutaj

wygeneruje 100 płytek na ścieżce określonej w kroku 4:

wprowadź opis zdjęcia tutaj

Ładowanie ich do QGIS wygląda następująco:

wprowadź opis zdjęcia tutaj

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).


Rozwiązanie wykorzystujące Python (GDAL)

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.

mgri
źródło
2
Krótki komentarz, że przykład tego, jak renderuje je QGIS, wygląda dziwnie tylko dlatego, że styl pasuje do rozkładu wartości na obraz . Dane są idealnie w porządku :)
bugmenot123
Dziękujemy przede wszystkim za odpowiedź, która jest naprawdę pomocna, ale chcę osiągnąć ten sam wynik za pomocą Pythona? Czy możesz mi w tym pomóc, ponieważ jest to bardziej ręczne niż programowe.
Anup Panwar
@ bugmenot123 Dzięki, edytuję odpowiedź z użytecznym komentarzem.
mgri
@Anup Panwar, jeśli znajdę rozwiązanie z PyQGIS, zmienię moją odpowiedź! =)
mg
@HowToInQGIS Dzięki, bo jeśli chcesz znaleźć sposób w pythonie, to też pomoże :)
Anup Panwar
5

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ń.

radouxju
źródło
2

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

Dylansq
źródło
2

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

Saleika
źródło