使多个栅格更加均匀


10

我已经导入了一些应该连续连接的栅格,但是它们之间却创建了某种带边框的网格。我可能认为这是各个栅格之间的校准问题,但是我不确定如何以数据方式执行它。

以前有没有人经历过类似的事情,也许知道一种可能的解决方案,以使所有栅格的整体更加平滑。

所有这些都应该在地理位置上相连。因此,广场“边界”的麻烦。

我在Windows上使用QGIS。

在此处输入图片说明

Answers:


11
  1. 您可以尝试将栅格合并为一个:

    • 在工具栏中:

      栅格>其他>合并

    • 在处理工具箱中:

      GDAL / OGR>其他>合并

    • 从GDAL控制台:

      gdal_merge.py -o merged.tif input1.tif input2.tif
      

  1. 或构建虚拟栅格:

    • 栅格>其他>构建虚拟栅格

1
+1用于构建虚拟栅格。这将创建一个非常小的文件,其作用类似于单个合并的图像。
亚历山大·内图

@AlexandreNeto-谢谢,我注意到与单独的栅格相比,文件大小的差异可能非常惊人=)
Joseph

选择合并或构建虚拟栅格时,出现错误,提示该过程无法启动。porgram不存在,或者我没有正确的权限。因此,通过将所有栅格加载到“层”菜单中并从中进行选择,我成功完成了合并或构建。Gdal_merge.bat命令行可能太长,atleast inputx.tif可能会以1000 x(不同的栅格)暂停操作
MichaelR

@Michael-奇怪的错误,但很高兴您找到了另一种获得结果的方法:)
约瑟夫

1
@Michael在命令行中,您可以gdalbuildvrt输入包含文件列表的文件的文件名,而不是使用许多图像文件作为参数:gdalbuildvrt -input_file_list my_liste.txt doq_index.vrt
Detlev

3

出现这种偏斜外观的原因是,每个单个图像都是使用从最小图像扩展到最大图像的灰度绘制的,而不是跨全局最小/最大。当您将所有图像合并为一张图像时,只有一分钟的最小值/最大值。对于VRT,情况也是如此,因为VRT将所有图像都视为一个图像(当您查看VRT文件时,将看到公共统计信息)。

如果不能同时使用合并和VRT,则以下脚本可能会有所帮助。

在第一个循环中,我遍历所有图层,选择栅格并估算其最小/最大间隔。这就是QGIS本身的工作方式。根据这些最小值/最大值,我计算出全局最小值/最大值

在第二个循环中,配置所有栅格图层的渲染器,以使灰度范围跨全局最小值/最大值拉伸。

gmin = 9999
gmax = -9999
layers = []
# loop over all layers, take rasters and estimate min, max values
for layer in iface.mapCanvas().layers():
    if isinstance(layer, QgsRasterLayer):
        # change percentages and sample size to increase or decrease accuracy
        min_max = layer.dataProvider().cumulativeCut(1, 0.02, 0.98, theSampleSize=250000)
        gmin = min(gmin, min_max[0])
        gmax = max(gmax, min_max[1])
        layers.append(layer)

# for all rasters create a single band gray scale renderer with 
# gray scale stretched across the interval [gmin..gmax]
for rasterlayer in layers:
    renderer = QgsSingleBandGrayRenderer(rasterlayer.dataProvider(), 1)
    # take the first band (0)
    ce = QgsContrastEnhancement(rasterlayer.dataProvider().dataType(0))
    ce.setContrastEnhancementAlgorithm(QgsContrastEnhancement.StretchToMinimumMaximum)
    ce.setMinimumValue(gmin)
    ce.setMaximumValue(gmax)
    renderer.setContrastEnhancement(ce)

    rasterlayer.setRenderer(renderer)

# refresh canvas to show changes
iface.mapCanvas().refresh()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.