Разбить .tif изображение на несколько плиток? [закрыто]

13

У меня есть изображение размером 1 ГБ (.tif), с шириной и высотой 94000x71680. Я хотел бы разделить это изображение на плитки размером 20000X20000, чтобы их можно было обработать.

Как я могу это сделать?

Ануп Панвар
источник
Anup, github.com/mapbox/rasterio предоставит вам массив данных ваших входных данных. Вы можете разделить это, используя методы numpy или scipy и легко сохранить каждую часть в новый файл. Подойдет ли такое решение? Если это так, вам нужно сказать, как следует обрабатывать «неровные биты» (71680 не делится на 20000).
bugmenot123

Ответы:

23

Я предлагаю два решения: первое с использованием QGIS, второе с использованием Python (GDAL).


Решение с использованием QGIS

В QGIS вы можете создать мозаику VRT.

Пожалуйста, следуйте этой процедуре (см. Изображение ниже):

  1. Загрузите растр в панель слоев ;
  2. Щелкните правой кнопкой мыши и выберите Save As... ;
  3. Проверить Create VRT опцию;
  4. Выберите папку, в которую будут сохранены ваши результаты;
  5. Установите экстент (если вы хотите работать со всем растром, не изменяйте ничего);
  6. Выберите, если используете текущее разрешение (я предлагаю оставить его по умолчанию);
  7. Установите максимальное количество столбцов и строк (в вашем случае это должно быть 20000 столбцов и 2000 строк);
  8. Нажмите OKкнопку

введите описание изображения здесь

Например, использование параметров в диалоговом окне выше в этом примере растра (параметры, которые я установил, выбираются случайным образом):

введите описание изображения здесь

сгенерирует 100 плиток по пути, указанному на шаге 4:

введите описание изображения здесь

Загружая их в QGIS, они выглядят так:

введите описание изображения здесь

Как правильно сказал @ bugmenot123 в комментариях, результат выглядит странно только потому, что стиль каждого изображения соответствует распределению значений для каждого изображения (но данные в порядке).


Решение с использованием Python (GDAL)

Другой способ получить тот же результат - использование GDAL ( gdal_translate ).

Со ссылкой на тот же пример, описанный выше, вы можете использовать этот скрипт:

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)

Вам, очевидно, нужно адаптировать значения к вашему конкретному случаю.

МГРИ
источник
2
Просто быстрый комментарий, что пример того, как QGIS отображает их, выглядит странно только потому, что стиль подходит для распределения значений на изображение . Данные на отлично :)
bugmenot123
Спасибо, прежде всего, за ваш ответ, действительно полезный, но я хочу достичь того же результата, используя Python? Можете ли вы помочь мне в этом также? Потому что это скорее руководство, чем программирование.
Ануп Панвар
@ bugmenot123 Спасибо, я редактирую ответ твоим полезным комментарием.
августа
@ Anup Panwar, если я найду решение с помощью PyQGIS, я отредактирую свой ответ! =)
мгг
@HowToInQGIS Спасибо, если вам нужен путь в python, который тоже поможет :)
Anup Panwar
5

Не разделять

Вы gdalbuildvrt , вы можете создавать виртуальные плитки, которые будут использовать только несколько байтов на вашем диске. Затем вы можете использовать большинство программ, которые будут принимать ваши виртуальные входные данные в качестве входных данных для выполнения вашей обработки.

В качестве альтернативы, я бы предпочел инструмент, который может работать с изображением 1 Гб, чем разделять и объединять изображения. Например, OTB обладает большинством возможностей для стандартной (а иногда и продвинутой) обработки изображений с большими изображениями. Вы можете обернуть OTB для Python или запустить его из QGIS или из командной строки.

radouxju
источник
2

Использование Split растрового инструмента, вы можете разделить растр на плитки на основе несколько методов разделения , включая размер каждую плитку или ряд плиток .

Также см. Раздел «Расщепление растра» в ArcGIS.

Dylansq
источник
2

Другое решение, использующее GDAL, - это инструмент 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

Для получения дополнительной информации см .: http://www.gdal.org/gdal_retile.html

Saleika
источник