首页 > 解决方案 > 将投影栅格保存为变量而不是文件 Python

问题描述

我想重新投影一个栅格并继续处理该重新投影的栅格,而不是从文件中再次加载它。

要投影我使用的栅格gdal

# Source
src = gdal.Open(vv_path, gdalconst.GA_ReadOnly)
src_proj = src.GetProjection()
src_geotrans = src.GetGeoTransform()

# We want a section of source that matches this:
match_ds = gdal.Open(sn2_red_path, gdalconst.GA_ReadOnly)
match_proj = match_ds.GetProjection()
match_geotrans = match_ds.GetGeoTransform()
wide = match_ds.RasterXSize
high = match_ds.RasterYSize

# Output / destination
dst_filename = os.path.join(sn1_processed_path,'vv.tif')
dst = gdal.GetDriverByName('Gtiff').Create(dst_filename, wide, high, 1, gdalconst.GDT_Float32)
dst.SetGeoTransform( match_geotrans )
dst.SetProjection( match_proj)

# Do the work
aa = gdal.ReprojectImage(src, dst, src_proj, match_proj, gdalconst.GRA_NearestNeighbour)

del dst # Flush

rasterio这里

在这两种情况下,投影栅格都保存到一个文件中,我必须再次加载它才能处理它。是否可以将投影栅格也保存为变量?

标签: python-3.xrastergdalcoordinate-transformationrasterio

解决方案


您可以使用VRT数据集:

src = gdal.Open(“reference.tif”)
dst = gdal.Warp(“warped.vrt”, src, format=“vrt”, dstSRS=“EPSG:3857”)

这样只会VRT创建一个小文件,您可以dst在下游处理中使用数据集,此时将实际执行变形。

您甚至可以VRT在内存中创建自身,因此根本不会将任何内容写入磁盘:

dst = gdal.Warp(“”, src, format=“vrt”, dstSRS=“EPSG:3857”)

如果您的数据集完全适合内存,您可以使用vsimem虚拟文件系统驱动程序在内存中创建实际的数据集,如果您想在下游的多个功能中使用它,则只需执行一次处理:

dst = gdal.Warp(“/vsimem/result_inmemory.tif”, src, format=“tif”, dstSRS=“EPSG:3857”)

这样处理将立即执行,但随后您可以使用数据集对象将其写入磁盘,然后执行附加处理。


推荐阅读