Menampilkan geotiff besar (atau vrts) dengan QGIS?


10

Saya memanipulasi dan memproses raster global dengan resolusi 30m. Total ukuran raster biasanya [1.440.000 560.000]. Saya memiliki akses ke komputer super, jadi saya telah menulis kode yang memungkinkan saya untuk memecah raster global menjadi beberapa bagian yang dapat dikelola, melakukan beberapa perhitungan secara paralel, dan menulisnya ke disk dengan cukup cepat.

Saya telah menabrak dinding, ketika datang untuk menampilkan hasil. Saya biasanya membangun raster ubin virtual yang menutupi globe dan menariknya ke QGIS. Tapi itu sangat lambat (menit untuk memuat, jika ya). Dan jika saya mencoba menggeser atau memperbesar, itu beberapa menit lagi. Pendekatan pertama saya untuk memecahkan masalah ini adalah membangun tinjauan umum menggunakan gdaladdo. Namun, ini membutuhkan waktu yang lama untuk membangun (seperti dalam hari), yang tidak kondusif untuk mengembangkan algoritma. Berikut adalah daftar hal-hal yang telah saya coba dan mengapa / bagaimana mereka gagal.

  1. membangun ikhtisar di vrt. Seperti disebutkan di atas, ini membutuhkan 2+ hari untuk menyelesaikan 8 level. Itu tidak dapat diterima untuk tujuan saya.

  2. membangun ikhtisar pada ubin individu, lalu entah bagaimana bergabung menjadi vrt yang berisi ikhtisar tersebut. Saya bisa membuat ikhtisar di atas ubin agak cepat (superkomputer), tetapi saya belum dapat menginstalnya. Saya mencoba:

    2a. gdal_merge pada ubin dengan ikhtisar, tetapi ikhtisar tidak dipertahankan (atau setidaknya tidak dikenali oleh QGIS) di tiff keluaran.

    2b. gdalbuildvrt pada ubin dengan ikhtisar, tetapi seperti di atas, ikhtisar tidak dipertahankan. [Ini tidak benar, lihat edit.]

    2c. Saya juga mencoba hibrida membangun ikhtisar untuk ubin untuk tingkat 1-6 dan membangun tingkat 7-8 langsung di vrt (pada dasarnya opsi 2b) tetapi masih butuh waktu lama untuk hanya dua tingkat ini. Saya melakukan beberapa pengujian dan melihat bahwa ikhtisar genteng yang benar-benar digunakan untuk membangun untuk ikhtisar vrt, tapi masih di urutan hari untuk menyelesaikan ikhtisar pada vrt tersebut.

Jadi saya berharap seseorang di sini memiliki beberapa saran tentang ke mana saya harus pergi selanjutnya. Berikut ini beberapa opsi yang saya pertimbangkan:

  1. Buat sendiri piramida global secara manual. Saya khawatir rekombinasi mereka menjadi file .ovr karena saya menganggap itu akan sulit.

  2. Gunakan mapserver (Geoserver). Saya tahu sedikit tentang hal ini dan khawatir itu tidak akan mengatasi rintangan waktu sambil menambahkan kompleksitas pada proses saya.

  3. Bagi domain dengan benua atau wilayah lain. Saya benar - benar ingin menghindari opsi ini.

Anda mungkin bertanya "mengapa Anda perlu melihat seluruh dunia dengan resolusi 30m?" Salah satu contoh: Saya mengambil topeng piksel air (secara global) dan membuat kerangka untuk menemukan sungai dan melakukan pengukuran. Algoritma skeletonization saya memerlukan sedikit penyetelan (untuk pemangkasan cabang, menghapus loop, pembersihan umum, dll.), Dan hasilnya harus pada 30 m. Karena sungai dan bentang alam beragam di seluruh dunia, saya harus dapat berkeliling untuk melihat efek dari setiap perubahan yang telah saya terapkan.

Saya juga telah memeriksa QGIS untuk memastikan tidak ada pengaturan yang dapat saya mainkan untuk membuat raster besar lebih cepat, tetapi saya tidak melihat apa-apa. Kurang membeli drive SSD, saya pikir itu cranking secepat mungkin. (HDD saya memiliki I / O ~ 250MB / s).


Saya menemukan bahwa membangun ikhtisar pada ubin individu, lalu membangun vrt tampaknya mempertahankan ikhtisar - bagian "Piramida" QGIS dalam metadata untuk file kosong, tetapi di bagian "Dimensi" ada entri untuk setiap tingkat ikhtisar (mis. X 720000, Y 140; X 360000, Y 70, dll.). Jadi saya salah tentang 2b.

Saya juga menemukan bahwa jika saya hanya menarik semua ubin ke QGIS, itu merender dalam waktu kurang dari satu menit, sementara jika saya menarik vrt yang mereferensikan ubin, dibutuhkan> 5 menit (tidak tahu berapa lama tepatnya sejak saya membunuh proses).


Saya melakukan beberapa pengujian pada komputer dengan SSD, dan saya menemukan bahwa saya dapat memuat, menampilkan, dan membuat vrts global (tanpa ikhtisar apa pun) dengan sukses dan pada tingkat yang dapat diterima. Saya telah memesan 1TB PCIe SSD dengan harapan itu akan memungkinkan saya untuk melakukan hal yang sama di komputer saya. Akan diperbarui dengan hasil.


Apakah Anda membuat ikhtisar untuk file VRT atau gambar individual dari file VRT? GDAL memungkinkan Anda untuk menggunakan gambaran umum VRT pada resolusi rendah (yaitu untuk 64 x 64, 128 x 128) dan menggunakan ikhtisar dari raster individual pada resolusi menengah. Untuk membuat ikhtisar untuk masing-masing raster dari VRT gunakan gdaladdo pada skrip yang akan melempar Anda file. Pertama-tama buat ikhtisar individual. Daripada membuat ikhtisar untuk seluruh VRT. Jangan tumpang tindih ikhtisar!
Dmitry Baryshnikov

Terasa seperti opsi 2c di atas dan 2+ hari untuk membuat ikhtisar untuk seluruh VRT dianggap tidak dapat diterima.
user30184

Karena tiang ikhtisar individu dibuat sebelumnya. Dan juga bagi saya tingkat tinjauan umum memilih yang salah. Perlu gdaladdo tmp.vrt 2 4 8 16 dan gdaladdo individual.tif 2 4 8 16 32 64 ... Topicstarter harus menghitung tingkat ikhtisar vrt max sebagai: ukuran vrt dalam jumlah pix / gambar * 64 pix = gambaran maksimum untuk vrt. Kami membuat ikhtisar seperti itu untuk Amerika utara untuk Landsat 30 m di PC desktop. Hasilnya dibuat dalam beberapa hari. Dan rendering VRT di QGIS lebih cepat daripada geotiff mosa di ArcGIS.
Dmitry Baryshnikov

1
Mari kita lihat, mereka menulis I also tried a hybrid of building overviews for the tiles for levels 1-6 and building levels 7-8 directly on the vrtyang terasa sama dengan urutan yang Anda rekomendasikan dan itu wajar saja. Saya sendiri tidak akan menghitung 2 4 8 ... ikhtisar untuk VRT jika setiap ubin memilikinya untuk menghemat waktu dan ruang disk. ROI kecil kemudian akan menemukan ikhtisar dari beberapa ubin dan itu harus cukup cepat.
user30184

Ini tidak benar karena 2 4 8 file individual (bukan ubin!) Tidak sama dengan 2 4 8 vrt. Misalnya kita memiliki gambar individual dengan ukuran 8000 x 8000 dan 1000 x 1000 gambar di vrt. Ukuran gambar ikhtisar 64 x 64 pix akan berada di 8 level untuk file individual dan untuk keseluruhan vrt akan berada di level 18! Dan level min untuk seluruh vrt akan menjadi 8. Jadi untuk seluruh vrt perlu menggunakan level dari 9 hingga 18 dan untuk file individual dari 2 hingga 8.
Dmitry Baryshnikov

Jawaban:


6

Anda tampaknya memiliki dua masalah utama: Id VRT lambat dengan penjelajahan dan lambat untuk membangun tinjauan global.


Walaupun saya yakin bahwa GDAL VRT dulu lambat bagi saya dan MapServer saya bertahun-tahun yang lalu, mungkin situasinya telah berubah. Saya membuat lapisan uji dengan 10.000 gambar udara (ukuran gambar / ubin dari 10000x10000 hingga 12000x12000 piksel) dan sekarang GDAL VRT sebenarnya lebih cepat daripada indeks shapefile MapServer asli dan melayani dengan komputer uji 6 ubin (256x256) per detik dalam tes sederhana dengan 1 utas tempat GetMaps menekan selalu tingkat tinjauan pertama. Mosaik dengan 10.000 gambar masih cukup kecil dan saya kira dalam pengujian saya Linux memiliki seluruh file VRT dalam memori cache. Berapa banyak gambar yang Anda miliki di VRT Anda?

Bab berikut mungkin berisi informasi lama, dibaca secara bertanggung jawab:

Ada beberapa bukti bahwa VRT lambat ketika mengandung sejumlah besar gambar. Itu bukan karena VRT adalah indeks dalam format XML dan itu tidak mendukung indeks spasial yang mengarah ke pemindaian penuh seluruh file XML setiap waktu. Tidak ada yang dapat Anda lakukan untuk meningkatkannya dengan GDAL biasa bahkan telah ada beberapa diskusi tentang penerapan indeks spasial untuk VRT http://osgeo-org.1560.x6.nabble.com/gdal-dev-Don-t-we- have-any-ideas-for-GSoC-2017-td5309810.html .

Jika Anda ingin menginstal perangkat lunak baru, solusi termudah adalah menggunakan MapServer dengan tileindex http://www.mapserver.org/optimization/tileindex.html . Jika Anda membuat tileindex dengan gdaltindex http://www.gdal.org/gdaltindex.html dan membuat indeks untuk tileindex juga dengan shptree http://www.mapserver.org/utilities/shptree.htmlmaka MapServer harus dapat mengakses dengan sangat cepat semua file gambar yang Anda miliki. Buat ikhtisar untuk ubin individu dan sajikan lapisan melalui WMS untuk QGIS dan Anda telah menyelesaikan bagian pertama dari masalah tetapi tidak masalah dengan ikhtisar global. Bahkan jika Anda telah membuat ikhtisar untuk ubin individu, akan lambat untuk membuka ribuan file gambar untuk mencakup area yang luas dan karenanya Anda harus membatasi jumlah file dengan membuat gambar gambaran umum yang mencakup area yang lebih besar. Itulah yang sudah Anda coba lakukan dengan membangun ikhtisar untuk lubang VRT dengan gdaladdo.

Saya tidak tahu alat yang siap pakai di dunia GDAL / MapServer untuk membuat piramida global secara otomatis. Anda dapat mengubah ubin dari VRT global menjadi satu set gambar dengan ukuran piksel lebih besar dengan menulis skrip yang menjalankan gdal_translate http://www.gdal.org/gdal_translate.html dengan geser -prowjin atau -srswin. Kemudian Anda bisa menggabungkan ubin yang dihasilkan ke dalam lapisan ikhtisar baru dengan gdalbuildvrt atau gdaltindex.

Karena Anda juga mempertimbangkan untuk menggunakan GeoServer, saya akan merekomendasikan untuk menjarah di skrip gdal_retile http://www.gdal.org/gdal_retile.html yang ditulis untuk menangani kasus Anda. Bisa juga menggunakan ubin yang dibuat gdal_retile secara langsung sebagai gambaran umum dengan QGIS dengan membangun VRT di atasnya. Namun, masalah pertama dengan file VRT besar yang lambat akan tetap ada.


1
Saya menghargai downvotes tetapi saya ingin membaca juga penjelasan atau jawaban yang lebih baik. Rute MapServer adalah pilihan saya ketika VRT terlalu lambat dan itu melayani saya dengan baik dengan beberapa terabyte gambar.
user30184

Yah, saya belum dapat sepenuhnya menyelesaikan vrt global dengan ikhtisar jadi saya tidak tahu seberapa cepat itu akan membuat. Tanpa ikhtisar, Anda benar bahwa terlalu lama untuk ditampilkan. Saya dapat memiliki sebanyak atau beberapa gambar dalam vrt saya seperti yang saya inginkan. Saya telah mencoba sedikitnya 60 dan sebanyak 4000. Tidak pernah sebanyak 10.000. Saya ingin menghindari kompleksitas solusi tipe-Mapserver. Saya melakukan penelitian lebih lanjut dan saya berpikir bahwa mungkin tinjauan ubin individu memang dipertahankan ketika saya membangun vrt - saya akan menguji ini dan mengirim pembaruan pada hari Senin.
Jon

5

Ok, well saya menyelesaikan kedua masalah saya ... terutama dengan membeli NVMe SSD. Disk saya baca / tulis telah berubah dari 125 MB / s menjadi 1200 MB / s.

Secara pemrograman, ada beberapa hal yang dapat Anda lakukan untuk membantu kecepatan baca / tulis Anda. Pertama, pertimbangkan pemblokiran tiff Anda. Jika Anda menggunakan tiff bergaris, saat Anda memperbesar ke wilayah tertentu, perangkat lunak GIS harus membaca setiap baris lengkap wilayah, termasuk bagian tiff yang tidak akan ditampilkan, untuk menampilkan wilayah. Misalnya, jika Anda memperbesar wilayah 256 x 256 piksel, jika Anda memiliki garis bergaris perangkat lunak harus membaca setidaknya 256 blok (satu per baris). Jika Anda memiliki ubin tiff (ubin 256 x 256), jumlah maksimum blok yang harus dibaca adalah 4 (dan minimum 1). Jadi hal pertama yang dapat Anda lakukan adalah memastikan bahwa Anda menggunakan tiff tiff (TILED = opsi pembuatan YES di gdal),

Kedua, pendekatan hibrida untuk ikhtisar tampaknya bekerja dengan baik. Jika Anda dapat memparalelkan operasi Anda, Anda dapat menambahkan ikhtisar ke ubin individu dengan cepat, tetapi ini hanya akan menguntungkan Anda untuk resolusi yang lebih kecil dari ubin Anda. Saya membuat ikhtisar internal level 2 4 8 16 32 dan 64 pada ubin individu. Kemudian bangun VRT dan buat ikhtisar level 128, 256, dan 512 pada VRT (perlu diingat bahwa ini adalah untuk kumpulan data global dengan resolusi 30m - level Anda akan berubah tergantung pada jumlah piksel dalam tiff Anda). Total waktu untuk membuat ikhtisar individual adalah dalam urutan menit (tergantung pada berapa banyak utas yang dapat Anda jalankan dan berapa banyak ubin yang Anda miliki), tetapi membuat ikhtisar pada VRT masih dalam urutan satu jam. Peningkatan runtime atas posting awal saya adalah karena SSD dan membuat level lebih sedikit pada VRT.

Ketiga, Anda dapat bermain dengan opsi GDAL_MAX_DATASET_POOL_SIZE saat membuat vrts seperti dijelaskan di bagian bawah halaman ini . Ini mengatur jumlah maksimum tiff untuk disimpan dalam memori sekaligus.

Keempat, saya menemukan bahwa mengompresi dengan PACKBITS memberikan waktu tampilan tercepat. File-file ini tidak sekecil LZW, tetapi itu adalah tradeoff yang mungkin Anda bersedia buat.

Hasilnya adalah VRT yang memuat dengan cepat dan wajan / zoom hampir mulus.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.