如何使用rasterio设置geotiff的边界?

时间:2019-07-11 13:03:00

标签: python qgis geotiff rasterio extent

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

enter image description here

我正在利用rasterio python库创建元数据对象。通过打印出已建立的栅格文件的元数据,我能够弄清概要文件字段是什么以及应该将其设置为(第1-20行)

我已经蚕食了here中的一些代码,以将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文件的bounds字段,可以确认这是问题所在;奇怪的是,我创建的文件中的边框没有宽度或高度。但是,该字段似乎不可写,因此我的问题仍然存在。

1 个答案:

答案 0 :(得分: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)