问题描述
我想重新投影栅格并继续处理该重新投影的栅格,而不是从文件中再次加载它。
要投射栅格,我可以使用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
在两种情况下,投影的栅格都保存到文件中,而我必须再次加载以进行处理。是否可以将投影栅格另存为变量?
解决方法
您可以使用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”)
通过这种方式,将立即执行处理,但是您可以使用数据集对象例如将其写入磁盘,然后执行其他处理。