如何读取 PNG 并将数据从 tiff 文件添加到它并将其另存为另一个 tiff?
How to read PNG and add data from a tiff file to it and save it as another tiff?
我有两个文件。一种是 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
如何实现?
首先要说的是,从您的 post 看来,图像的形状不同,因此它可能更具挑战性,需要更多处理。
但是,我会按照您在 post 的标题中定义的方式回答问题 - 如何读取这两个文件并将它们保存为 tiff。为了做到这一点,我会将两个图像都读取为 numpy 数组,将它们堆叠在一起,然后使用光栅对它们进行地理配准。
所以你可以尝试类似这样的 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。
但是,要使其正常工作,您需要为两个图像设置相同的大小,这似乎是您现在没有的。
如果您提供有关您拥有的文件的更多数据 - 它们是否重叠?他们有不同的空间分辨率吗?为什么他们的尺寸不同?你的目标是什么?也许我可以提供更多帮助。
我有两个文件。一种是 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
如何实现?
首先要说的是,从您的 post 看来,图像的形状不同,因此它可能更具挑战性,需要更多处理。
但是,我会按照您在 post 的标题中定义的方式回答问题 - 如何读取这两个文件并将它们保存为 tiff。为了做到这一点,我会将两个图像都读取为 numpy 数组,将它们堆叠在一起,然后使用光栅对它们进行地理配准。
所以你可以尝试类似这样的 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。 但是,要使其正常工作,您需要为两个图像设置相同的大小,这似乎是您现在没有的。 如果您提供有关您拥有的文件的更多数据 - 它们是否重叠?他们有不同的空间分辨率吗?为什么他们的尺寸不同?你的目标是什么?也许我可以提供更多帮助。