-1

我正在尝试编写一些代码,这些代码需要一组 png 文件 + 一些元数据信息(不是来自 geotiff)并创建一个 geotiff 文件。该一个 geotiff 文件将具有与作为输入传递的 png 文件的数量相等的带/层数。当我尝试在 QGIS 中打开文件时,它是不可见的。通过将我的 geotiff 文件与其他已建立的 geotiff 文件进行比较,我注意到范围字段为空,这似乎是错误的(查看下图中显示的 qgis 中的图像信息)。

在此处输入图像描述

我正在利用rasteriopython 库来创建元数据对象。通过打印出我建立的光栅文件的元数据,我能够弄清楚配置文件字段是什么以及我应该将它们设置为什么(第 1-20 行)

我已经从这里蚕食了一些代码,以将 png 文件添加为图层。即使我没有将图层设置为来自不同 geotiff 文件的图层,但 png 的格式化方式看起来与图层的格式化方式相同。(第 22-26 行)。

我很困惑,因为当我在 Windows 10 上使用通用 png 查看器打开生成的 tiff 文件时,我可以按照预期的方式看到图像的一般形状,并且因为我正在使用变换字段设置左上角坐标,以及带有宽度和高度字段的结果图像的大小,这对我来说很有意义。但是,qgis 似乎需要以某种方式指定范围信息。

我已经搜索了 rasterio 的 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)

编辑:通过检查已建立的 geotiff 文件和我创建的 geotiff 文件的边界字段,我可以确认这是问题所在;奇怪的是,我创建的文件中的边界框没有宽度或高度。但是,这个字段似乎不可写,所以我的问题仍然存在。

4

1 回答 1

0

我的问题出在我的转换矩阵中。我不希望有任何旋转,所以我愚蠢地将旋转矩阵设置为 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)

于 2019-07-11T13:58:16.620 回答