为什么读取一些光栅数据并将其写入一个新的tiff要花费这么多时间?

2024-03-29 14:00:26 发布

您现在位置:Python中文网/ 问答频道 /正文

所以这里是我的问题,我有一些光栅数据,我一直在使用python和GDAL读取这些光栅数据,并将它们合并到一个tiff中,然后我遇到了一些非常恼人的问题,首先我尝试获得每个光栅的一个波段,并将其合并到一个单一波段tiff中,它工作得很好,速度很快,花费了我大约5秒钟,然后我想,为什么不制作一个呢一个循环,所以我可以得到每个光栅中的每个波段,并将它们合并成一个多波段tiff,但时间成本远远超出我的想象,在每个光栅中得到三个波段,并将它们合并成一个单独的3波段光栅大约需要两分钟,我的意思是,通常情况下,如果合并一个波段tiff需要5秒,合并15秒不是很正常吗三个乐队的tiff?我希望有人能回答我的问题,真的很迷惑我,谢谢,这是我的部分代码

import os, time, gdal, numpy, glob,
start = time.time()
os.chdir(r'...\...\..')
a = glob.glob(r'*.tif')

#a function to get the layer extent of each raster
def get_extent(fn):
    ds = gdal.Open(fn)
    rows = ds.RasterYSize
    cols = ds.RasterXSize
    gt = ds.GetGeoTransform()
    minx = gt[0]
    maxy = gt[3]
    maxx = gt[0] + gt[1] * rows
    miny = gt[3] + gt[5] * cols
    return (minx, maxy, maxx, miny)

#randmly get one raster's extent for later compare using
minX, maxY, maxX, minY = get_extent(a[0])

#comnpare all these raster's extent and compare their extent to get the output tiff's extent
for fn in a[1:]:
    minx, maxy, maxx, miny = get_extent(fn)
    minX = min(minX, minx)
    maxY = max(maxY, maxy)
    maxX = max(maxX, maxx)
    minY = min(minY, miny)
# some settings for ouput tiff
in_ds = gdal.Open(a[0])
gt = in_ds.GetGeoTransform()
rows = int((maxX - minX)/abs(gt[5]))
cols = int((maxY - minY)/gt[1])
driver = in_ds.GetDriver()
out_ds = driver.Create(r'...\mosaic.tif', cols, rows, 3, 
in_ds.GetRasterBand(1).DataType)
out_ds.SetProjection(in_ds.GetProjection())
gt = list(in_ds.GetGeoTransform())
gt[0], gt[3] = minX, maxY
out_ds.SetGeoTransform(gt)
#a loop to get 1 to 3 bands in output tiff and write the data into these bands
for i in range(1,4):
    out_band = out_ds.GetRasterBand(i)
    for fn in a:
        in_ds = gdal.Open(fn)
        trans = gdal.Transformer(in_ds, out_ds, [])
        success, xyz = trans.TransformPoint(False, 0, 0)
        x, y, z = map(int, xyz)
        data = in_ds.GetRasterBand(i).ReadAsArray()
        out_band.WriteArray(data, x, y)
out_ds.FlushCache()
out_ds = None
in_ds = None
end = time.time()
print(end-start)

Tags: ingtforgettime光栅波段ds
1条回答
网友
1楼 · 发布于 2024-03-29 14:00:26

你可以把你的循环分成3个,然后加一个计时器。基本上,删除for循环并为每个频带将其划分为3个部分,然后实现它们以查看实现之间的时间差。这会告诉你哪个乐队花了多少时间。我认为答案是乐队的内容。使用一个乐队可能比其他乐队花费更多或更少的时间。我建议你,划分你的循环,看看每个乐队花费多少时间。那你看看乐队里面有什么。你知道吗

相关问题 更多 >