将投影栅格另存为变量而不是文件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

here中的Rasterio

在两种情况下,投影的栅格都保存到文件中,而我必须再次加载以进行处理。是否可以将投影栅格另存为变量?

解决方法

您可以使用VRT个数据集:

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

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

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

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

如果数据集完全适合内存,则可以使用vsimem virtual file system driver在内存中创建实际的数据集,这样做的好处是,如果要在下游将其用于多个功能,则只需执行一次处理:

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

通过这种方式,将立即执行处理,但是您可以使用数据集对象例如将其写入磁盘,然后执行其他处理。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...