我正在尝试编写一些代码,这些代码需要一组 png 文件 + 一些元数据信息(不是来自 geotiff)并创建一个 geotiff 文件。该一个 geotiff 文件将具有与作为输入传递的 png 文件的数量相等的带/层数。当我尝试在 QGIS 中打开文件时,它是不可见的。通过将我的 geotiff 文件与其他已建立的 geotiff 文件进行比较,我注意到范围字段为空,这似乎是错误的(查看下图中显示的 qgis 中的图像信息)。
我正在利用rasterio
python 库来创建元数据对象。通过打印出我建立的光栅文件的元数据,我能够弄清楚配置文件字段是什么以及我应该将它们设置为什么(第 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 文件的边界字段,我可以确认这是问题所在;奇怪的是,我创建的文件中的边界框没有宽度或高度。但是,这个字段似乎不可写,所以我的问题仍然存在。