Uczyń kilka rastrów bardziej jednolitymi

10

Zaimportowałem kilka rastrów, które powinny być stale połączone, ale zamiast tego tworzą między nimi siatkę graniczną. Mogę założyć, że jest to kwestia kalibracji między poszczególnymi rastrami, ale nie jestem pewien, jak wykonać to w sposób powodujący zakłócenia danych.

Czy ktoś wcześniej doświadczył czegoś takiego i być może wie o możliwym rozwiązaniu, aby ogólnie wszystkie rastry były bardziej płynne.

Wszystkie powinny być geograficznie połączone. Stąd kłopot „granic” kwadratu.

Używam QGIS na Windowsie.

wprowadź opis zdjęcia tutaj

MichaelR
źródło

Odpowiedzi:

11
  1. Możesz spróbować połączyć rastry w jeden:

    • Z paska narzędzi:

      Raster> Różne> Scal

    • Z Przybornika przetwarzania:

      GDAL / OGR> Różne> Scal

    • Z konsoli GDAL:

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

  1. Lub zbuduj wirtualny raster:

    • Raster> Różne> Utwórz wirtualny raster
Joseph
źródło
1
+1 za kompilację Virtual Raster. Spowoduje to utworzenie bardzo małego pliku, który będzie działał jak pojedynczy scalony obraz.
Alexandre Neto
@AlexandreNeto - Dzięki, zauważyłem, że różnica w rozmiarze pliku w porównaniu do oddzielnych rastrów może być dość oszałamiająca =)
Joseph
Wybierając scalenie lub kompilację wirtualnego rastra, pojawia się błąd informujący, że proces nie mógł się rozpocząć. Porgram nie istnieje lub nie mam odpowiednich praw. Dlatego udało mi się wykonać scalenie lub kompilację, ładując wszystkie rastry do menu Warstwy i wybierając z nich. Linia komend Gdal_merge.bat może być za długa, przynajmniej inputx.tif może zawiesić operację na 1000 x (różne rastry)
MichaelR
@Michael - Dziwny błąd, ale cieszę się, że znalazłeś inny sposób na uzyskanie swoich wyników :)
Joseph
1
@Michael W wierszu poleceń możesz podać gdalbuildvrtnazwę pliku zawierającego listę plików, a następnie podać wiele plików obrazów jako argumenty: gdalbuildvrt -input_file_list my_liste.txt doq_index.vrt
Detlev
3

Powodem tego mozaikowego wyglądu jest to, że każdy pojedynczy obraz jest rysowany za pomocą skali szarości rozciągniętej od obrazu min do obrazu maks, a NIE przez globalną min / maks. Kiedy połączysz wszystkie obrazy w jeden, cóż, jest tylko jedna min / max. To samo dotyczy VRT, ponieważ VRT traktuje wszystkie obrazy jako jeden (gdy spojrzysz na plik VRT, zobaczysz wspólne statystyki).

Jeśli opcje scalania i VRT nie są dostępne, poniższy skrypt może pomóc.

W pierwszej pętli iteruję wszystkie warstwy, wybierając rastry i uzyskując oszacowanie ich minimalnego / maksymalnego odstępu. Tak działa sam QGIS. Na podstawie tych wartości min / maks obliczam globalne min / maks

W drugiej pętli renderery dla wszystkich warstw rastrowych są skonfigurowane w taki sposób, że skala szarości jest rozciągnięta w całym interwale globalnym min / max.

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
źródło