Как установить границы геотифа с помощью растерио? - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь написать некоторый код, который берет коллекцию файлов png + некоторую информацию метаданных (не из геотифа) и создает файл геотифа.Этот один геотиф-файл будет иметь количество полос / слоев, равное количеству файлов png, переданных в качестве входных данных.Когда я пытаюсь открыть файл в QGIS, он недоступен для просмотра.Сравнивая мой файл geotiff с другими установленными файлами geotiff, я заметил, что поле экстента было пустым, что кажется неправильным (глядя на информацию об изображении из qgis, показанного на изображении ниже).

enter image description here

Я использую библиотеку rasterio python для создания объекта метаданных.Распечатав метаданные моего установленного растрового файла, я смог выяснить, какими были поля профиля и как их установить (строки 1-20)

Я уничтожил некоторый код из здесь для добавления файлов png в качестве слоев.Несмотря на то, что я не устанавливаю слои в слои из другого файла geotiff, способ форматирования png выглядит идентично тому, как должен быть отформатирован слой.(строки 22-26).

Я в замешательстве, потому что, когда я открываю полученный в результате файл TIFF с помощью универсального средства просмотра png в Windows 10, я могу видеть общую форму своего изображения так, как я ожидал, и так какЯ устанавливаю координаты верхнего левого угла с полем преобразования, а размер получаемого изображения с полями ширины и высоты, который имеет смысл для меня.Однако может показаться, что qgis нужно как-то указать информацию о экстенте.

Я изучил растровый файл github и документацию и изо всех сил пытаюсь найти какую-либо полезную информацию.Мой код приведен ниже;любая помощь будет принята с благодарностью!

  1  png = cv2.imread(source_files[0], 0)
  2   
  3  new_width = png.shape[0]
  4  new_height = png.shape[1]
  5  new_count = len(source_files)
  6  new_crs = rio.crs.CRS.from_string("EPSG:32719")
  7  new_transform = Affine(0.0, 0.0, -74.262057, 0, 0, -11.920552)
  8   
  9  new_metadata = {'driver': 'GTiff',
 10                  'dtype': 'float32',
 11                  'nodata': None,
 12                  'width': new_width,
 13                  'height': new_height,
 14                  'count': new_count,
 15                  'crs': new_crs,
 16                  'transform': new_transform,
 17                  'tiled': False,
 18                  'interleave': 'band'}
 19  
 20  metadata = rio.profiles.Profile(data=new_metadata)   
 21
 22  with rio.open('../output/pngs/output.tif', 'w', **metadata) as dst :
 23      for i, layer in enumerate(source_files, start=1):
 24          png = cv2.imread(layer, 0)
 25          png = np.array(png, np.float32) / 255.0
 26          dst.write_band(i, png)

Редактировать: Проверяя поле границ установленного файла геотипов и моего созданного файла геотипов, я могу подтвердить, что это проблема;ограничивающая рамка в моем созданном файле не имеет ни ширины, ни высоты, как ни странно.Однако может показаться, что это поле недоступно для записи, поэтому мой вопрос остается в силе.

1 Ответ

0 голосов
/ 11 июля 2019

Моя проблема была в моей матрице преобразования.Я не хотел, чтобы было какое-либо вращение, поэтому я по глупости установил матрицу вращения равной 0. Вместо этого я должен был установить ее в единичную матрицу.Все хорошо.

До: new_transform = Affine(0.0, 0.0, -74.262057, 0, 0, -11.920552)

После: new_transform = Affine(1.0, 0.0, -74.262057, 0.0, 1.0, -11.920552)

...