Machen Sie mehrere Raster gleichmäßiger

10

Ich habe einige Raster importiert, die kontinuierlich verbunden sein sollen, aber stattdessen erstellen sie eine Art Raster zwischen ihnen. Ich kann davon ausgehen, dass dies eine Frage der Kalibrierung zwischen den einzelnen Rastern ist, bin mir jedoch nicht sicher, wie ich sie datenweise ausführen soll.

Hat jemand so etwas schon einmal erlebt und kennt vielleicht eine mögliche Lösung, damit die Gesamtheit aller Raster reibungsloser wird.

All dies soll geografisch verbunden sein. Daher das Problem der "Grenzen" des Platzes.

Ich verwende QGIS unter Windows.

Geben Sie hier die Bildbeschreibung ein

MichaelR
quelle

Antworten:

11
  1. Sie können versuchen, die Raster zu einem zusammenzuführen:

    • Aus der Symbolleiste:

      Raster> Verschiedenes> Zusammenführen

    • Aus der Processing Toolbox:

      GDAL / OGR> Verschiedenes> Zusammenführen

    • Über die GDAL-Konsole:

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

  1. Oder erstellen Sie ein virtuelles Raster:

    • Raster> Verschiedenes> Virtuelles Raster erstellen
Joseph
quelle
1
+1 für das Erstellen eines virtuellen Rasters. Dadurch wird eine sehr kleine Datei erstellt, die sich wie ein einzelnes zusammengeführtes Bild verhält.
Alexandre Neto
@AlexandreNeto - Danke, ich habe festgestellt, dass der Unterschied in der Dateigröße im Vergleich zu den einzelnen Rastern ziemlich erstaunlich sein kann =)
Joseph
Bei der Auswahl der Zusammenführung oder Erstellung eines virtuellen Rasters wird eine Fehlermeldung angezeigt, dass der Prozess nicht gestartet werden konnte. Das Programm existiert nicht oder ich habe nicht die richtigen Rechte. Daher gelang es mir, eine Zusammenführung oder einen Build durchzuführen, indem ich alle Raster in das Ebenen-Menü lud und von dort aus auswählte. Gdal_merge.bat Befehlszeile kann zu lang sein, mindestens inputx.tif kann die Operation bei 1000 x (verschiedene Raster) anhalten
MichaelR
@ Michael - Seltsamer Fehler, aber froh, dass Sie einen anderen Weg gefunden haben, um Ihre Ergebnisse zu erhalten :)
Joseph
1
@Michael In der Befehlszeile können Sie gdalbuildvrtmit dem Dateinamen einer Datei füttern, die eine Liste von Dateien enthält, anstatt viele Bilddateien als Argumente anzugeben: gdalbuildvrt -input_file_list my_liste.txt doq_index.vrt
Detlev
3

Der Grund für dieses mosaikierte Erscheinungsbild ist, dass jedes einzelne Bild mit einer Graustufe gezeichnet wird, die von Bild min bis Bild max und NICHT über das globale min / max gestreckt ist. Wenn Sie alle Bilder zu einem zusammenführen, gibt es nur eine min / max. Gleiches gilt für VRT, da VRT alle Bilder als eins behandelt (wenn Sie in die VRT-Datei schauen, sehen Sie die allgemeinen Statistiken).

Wenn sowohl Merge als auch VRT keine Option sind, kann das folgende Skript hilfreich sein.

In der ersten Schleife durchlaufe ich alle Ebenen, wähle die Raster aus und erhalte eine Schätzung ihres Min / Max-Intervalls. So funktioniert QGIS selbst. Aus diesen Min / Max-Werten berechne ich die globalen Min / Max

In der zweiten Schleife werden die Renderer für alle Rasterebenen so konfiguriert, dass die Graustufen über das Intervall global min / max gestreckt werden.

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()
Detlev
quelle