【问题标题】:How to read PNG and add data from a tiff file to it and save it as another tiff?如何读取 PNG 并将 tiff 文件中的数据添加到其中并将其另存为另一个 tiff?
【发布时间】:2021-05-08 03:17:26
【问题描述】:

我有两个文件。一个是 PNG,另一个是 TIFF(或 .jp2)。我想从卫星图像(.jp2 或 .tif)中读取地理空间数据并将其“放入”png 文件,然后将其另存为新的 tif。

我对使用栅格数据非常陌生。我正在使用 rasterio,到目前为止,我已经设法获得了 tif 文件的元数据:

import rasterio as rio
tif = rio.open("TIFFile.tif")
png = rio.open("PNGFile.png")

tif_read = tif.read()
png_read = png.read()

tif_width = tif.width
tif_height = tif.height
tif_dim = (tif_width, tif_height)

png_width = png.width
png_height = png.height
png_dim = (png_width, png_height)

tif_meta = tif.meta
png_meta = png.meta

print("TIF META: ", tif_meta)
print("PNG META: ", png_meta)

输出:

TIF META:  {'driver': 'GTiff', 'dtype': 'float32', 'nodata': None, 'width': 10980, 'height': 10980, 'count': 4, 'crs': CRS.from_epsg(32635), 'transform': Affine(10.0, 0.0, 699965.0,
   0.0, -10.0, 4100035.0)}
PNG META:  {'driver': 'GTiff', 'dtype': 'float32', 'nodata': None, 'width': 5490, 'height': 5490, 'count': 1, 'crs': None, 'transform': Affine(1.0, 0.0, 0.0,
   0.0, 1.0, 0.0)}

我知道我可以像这样使用原始 tif 的元数据创建一个新的 tif 文件:

with rio.open('NEWTIF.tif', 'w', **tif_meta) as dst:
    dst.write(tif_read.astype(rio.float32))

鉴于此,基本上,我想知道如何创建一个新的 tif 文件,将另一个 tif 的元数据添加到 png 文件中 - 将 png 的栅格数据与 tif 的地理空间数据合并。

我一直在寻找这个,但无法理解我在 SO: 中找到了什么:

How to convert png files to geotiff https://gis.stackexchange.com/questions/371065/apply-same-coordinate-system-to-raster-image-and-geojson-with-rasterio https://gis.stackexchange.com/questions/379027/georeferencing-of-png-and-convert-to-tiff-using-python

如何做到这一点?

【问题讨论】:

    标签: python tiff gdal rasterio satellite-image


    【解决方案1】:

    首先重要的是要说,从您的帖子看来,图像的形状并不相同,因此可能更具挑战性并需要更多处理。

    但是,我将按照您在帖子标题中定义的问题来回答 - 如何读取这两个文件并将它们保存为 tiff。为了做到这一点,我会将这两个图像读取为 numpy 数组,将它们堆叠在一起,然后使用 rasterio 对它们进行地理参考。

    所以你可以尝试类似这样的 seomthin:

    import rasterio 
    import numpy as np
    
    tif = rio.open("TIFFile.tif")
    png = rio.open("PNGFile.png")
    
    tif_read = tif.read()
    png_read = png.read()
    
    #stack the arrays to have two bands
    
    img=np.stack([tif_read,png_read])
    
    #write teh results
           with rasterio.open('img.tiff', 
                               'w',
                               driver='GTiff',
                               height=img.shape[1],
                               width=img.shape[2],
                               count=2,#numebr of bands
                               dtype=img.dtype,
                               crs=tif.crs,
                               nodata=None, # change if data has nodata value
                               transform=tif.transform) as dst:
                dst.write(img[0], 1)
                dst.write(img[1], 2)
    

    这应该将这两个图像保存为具有两个波段的新 tiff。 但是,要使其正常工作,您需要为两个图像设置相同的大小,这似乎是您现在没有的。 如果您提供有关您拥有的文件的更多数据 - 它们是否重叠?它们有不同的空间分辨率吗?为什么它们的尺寸不同?你的目标是什么?也许我可以提供更多帮助。

    【讨论】:

    • 非常感谢您的帮助。我想我对此有所启发。我可以使用相同大小的图像。让我阅读更多内容并先尝试一下,很快就会回复您。
    • @0xmth 如果您觉得有帮助,请考虑接受答案
    • 哦,打错了,我的意思是“谢谢妈妈!”,我的错:P
    • 严肃地说;我很抱歉这个错误的假设!
    • 没问题,你不知道
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多