Buat beberapa raster lebih seragam

10

Saya telah mengimpor beberapa raster yang seharusnya terus terhubung tetapi sebaliknya mereka membuat semacam grid berbatasan di antara mereka. Saya dapat berasumsi bahwa ini adalah masalah kalibrasi antara raster individual tetapi saya tidak yakin bagaimana cara menjalankannya dengan cara yang sesuai dengan data.

Adakah yang pernah mengalami hal seperti ini sebelumnya dan mungkin mengetahui solusi yang memungkinkan sehingga keseluruhan semua raster akan lebih lancar.

Semua ini seharusnya terhubung secara geografis. Karenanya masalah 'perbatasan' alun-alun.

Saya menggunakan QGIS di windows.

masukkan deskripsi gambar di sini

MichaelR
sumber

Jawaban:

11
  1. Anda dapat mencoba menggabungkan raster menjadi satu:

    • Dari bilah alat:

      Raster> Miscellaneous> Gabung

    • Dari Toolbox Pemrosesan:

      GDAL / OGR> Miscellaneous> Gabung

    • Dari konsol GDAL:

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

  1. Atau buat raster virtual:

    • Raster> Miscellaneous> Build Virtual Raster
Yusuf
sumber
1
+1 untuk membangun Virtual Raster. Ini akan membuat file yang sangat kecil yang akan bertindak seperti gambar gabungan tunggal.
Alexandre Neto
@AlexandreNeto - Terima kasih, saya perhatikan bahwa perbedaan dalam ukuran file dibandingkan dengan raster yang terpisah bisa sangat mengejutkan =)
Joseph
Saat memilih gabungan atau membangun raster virtual, saya mendapatkan pesan kesalahan yang menyatakan bahwa prosesnya tidak dapat dimulai. Porgram tidak ada atau saya tidak memiliki hak yang tepat. Oleh karena itu saya berhasil melakukan penggabungan atau pembangunan dengan memuat semua raster ke menu Layers dan memilih dari sana. Baris perintah Gdal_merge.bat bisa terlalu panjang, minimal inputx.tif dapat menunda operasi pada 1000 x (raster berbeda)
MichaelR
@Michael - Kesalahan aneh tapi senang Anda menemukan cara lain untuk mendapatkan hasil Anda :)
Joseph
1
@Michael Pada baris perintah Anda dapat memberi makan gdalbuildvrtdengan nama file dari file yang berisi daftar file, daripada memberikan banyak file gambar sebagai argumen: gdalbuildvrt -input_file_list my_liste.txt doq_index.vrt
Detlev
3

Alasan untuk penampilan terpadu ini adalah bahwa setiap gambar tunggal digambar dengan skala abu-abu yang membentang dari gambar min ke gambar max, dan BUKAN melintasi global min / maks. Saat Anda menggabungkan semua gambar menjadi satu, well, hanya ada satu min / maks. Hal yang sama berlaku untuk VRT, karena VRT memperlakukan semua gambar sebagai satu (ketika Anda melihat ke dalam file VRT Anda akan melihat statistik umum).

Saat keduanya, bergabung dan VRT, bukan merupakan opsi, skrip berikut dapat membantu.

Pada loop pertama saya beralih pada semua layer, memilih raster dan mendapatkan estimasi interval min / max mereka. Ini adalah cara kerja QGIS sendiri. Dari nilai min / maks ini saya menghitung global min / maks

Pada loop kedua renderers untuk semua layer raster dikonfigurasi sedemikian rupa sehingga skala abu-abu direntangkan melintasi interval global minimum / maksimum.

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
sumber