Bagaimana cara memuat output memori dari pemrosesan QGIS?

11

Banyak algoritma pemrosesan memiliki opsi untuk menghemat output sebagai memori. Jika dijalankan dari kotak alat, ini berfungsi dengan baik, karena Anda dapat mencentang kotak "Buka file keluaran setelah menjalankan algoritma".

Melihat kode sumber untuk QGIS, kode untuk memuat lapisan memori tampaknya didefinisikan dalam fungsi Postprocessing.handleAlgorithmResults. Fungsi ini menggunakan akses ke alg.outputsdaftar, dan melakukan hal berikut:

for out in alg.outputs:
    progress.setPercentage(100 * i / float(len(alg.outputs)))
    if out.hidden or not out.open:
        continue
    if isinstance(out, (OutputRaster, OutputVector, OutputTable)):
        try:
            if out.value.startswith('memory:'):
                layer = out.memoryLayer                                # NOTE!!
                QgsMapLayerRegistry.instance().addMapLayers([layer])   # NOTE!!
            else:
                # ... 

Ketika Anda menjalankan pemrosesan algoritma dari konsol, apakah ada cara untuk memuat layer tanpa akses ke objek ini? saya bisa berlari

processing.runalg("qgis:intersection", layer1, layer2, "memory:")

atau bahkan

processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")

Namun saya tidak dapat menemukan cara untuk mengambil output yang dihasilkan.

Oystein
sumber

Jawaban:

15

Aaa dan aku menemukannya. Gunakan processing.runandload, yang memuat lapisan output ke dalam daftar isi setelah menjalankan algoritma.

processing.runandload("qgis:intersection", layer1, layer2, "memory:myLayerName")
layer = QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
# Should do error checking as well, but this works!!
Oystein
sumber
1
Saya tertarik dengan jawaban yang Anda temukan. Apakah Anda tahu jika ada cara serupa untuk membuat lapisan memori - dan dapat mengaksesnya tanpa menerapkan runandload? Saya berharap untuk melakukan beberapa pemrosesan posting pada output pemrosesan sebelum menambahkannya ke kanvas - dan bertanya-tanya apakah itu mungkin terjadi ...
Katalpa
1
Saya tidak dapat menemukan satu pada saat itu, tidak untuk mengatakan bahwa itu tidak mungkin ... Saya kira Anda dapat memuatnya dan menyembunyikannya, jika itu membantu.
Oystein
Jika Anda tidak dapat menemukan nama lapisan menggunakan QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]coba ini:QgsMapLayerRegistry.instance().mapLayers()
Kamerad Che
@Katalpa Anda dapat mencoba, processing.runalg ("qgis: intersection", layer1, layer2, 'out.shp')
drama
4

itu adalah cara yang benar, dijelaskan dalam dokumentasi http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html

kode selanjutnya berfungsi dengan semua kecuali yang terakhir dimuat

MDT=path/mdt.tif
drain=processing.runalg("grass:r.drain",MDT,"",(pun),False,False,False,"%f,%f,%f,%f"% (xmin, xmax, ymin, ymax),0,-1,0.00100,None)
vect=processing.runalg("grass:r.to.vect",drain['output'],0,False,"%f,%f,%f,%f"% (xmin, xmax, ymin, ymax),0,None)
bu=processing.runalg("qgis:fixeddistancebuffer",vect['output'],Metros_afecta,1,False,None)
buf=bu['OUTPUT']
bufe= QgsVectorLayer(buf,"area", "ogr")
#the last load the layer 
QgsMapLayerRegistry.instance().addMapLayers([bufe])

yang processing.runalgmengembalikan kamus dalam kasus ini bu['OUTPUT']. OUTPUTADALAH KUNCI, dan nilainya adalah temp temp. Anda dapat melihat kunci dengan processeing.alghelp ("pemrosesan nama") sebagai pemrosesan, alghelp ("rumput: r.drain")

kembali

processing.alghelp("grass:r.drain")
ALGORITHM: r.drain - Traces a flow through an elevation model on a raster map.
input <ParameterRaster>
coordinate <ParameterString>
vector_points <ParameterMultipleInput>
-c <ParameterBoolean>
-a <ParameterBoolean>
-n <ParameterBoolean>
GRASS_REGION_PARAMETER <ParameterExtent>
GRASS_REGION_CELLSIZE_PARAMETER <ParameterNumber>
GRASS_SNAP_TOLERANCE_PARAMETER <ParameterNumber>
GRASS_MIN_AREA_PARAMETER <ParameterNumber>
output <OutputRaster>

dalam hal ini kuncinya adalah output , berhati-hatilah dengan huruf kapital Anda harus menulis dalam huruf kapital atau tanpa modal, dalam hal ini bukan modal.

corting
sumber
Harap hindari jawaban duplikat ( gis.stackexchange.com/a/211730/8104 ), mengikuti kebijakan Stack Exchange. Lebih detail: meta.stackexchange.com/q/104227
Aaron
Inilah yang akhirnya bekerja untuk saya. Info kunci yang hilang di tempat lain adalah bahwa Anda dapat melewati output['OUTPUT']jalan untuk QgsVectorLayerdengan provider_namedari "ogr". Ini akan membaca di jalur .shp dan membuat lapisan dalam memori. Pendekatan ini tidak menambahkan lapisan ke registri, sehingga tidak berkedip di Panel Layers.
Nick K9
Menurut halaman buku panduan yang Anda referensi, "Metode runalg mengembalikan kamus dengan nama output (yang diperlihatkan dalam deskripsi algoritma) sebagai kunci dan path file dari output tersebut sebagai nilai." Jadi pendekatan ini tampaknya tidak menggunakan lapisan memori - semua hasil antara akan disimpan dalam sistem file.
Håvard Tveite
0

Saya tidak yakin apakah ini akan membantu Anda dalam konteks Anda (apakah Anda ingin menjalankan kode Anda sebagai mandiri atau dalam QGIS setelah algoritme pemrosesan selesai?). Jika ini yang terakhir, Anda dapat dengan mudah meminta dimuat QGsVector-dan QGsRasterlayerobjek dengan melihat ke dalam registri QGIS MapLayer.

# General function to retrieve a layer with a given name
def getLayerByName( layerName ):
  layerMap = QgsMapLayerRegistry.instance().mapLayers()
  for name, layer in layerMap.iteritems():
    if layer.name() == layerName:
        if layer.isValid():
          return layer
        else:
          return None

Secara umum semua lapisan harus memiliki sumber di suatu tempat di harddisk bahkan jika hasilnya baru saja ditambahkan setelah pemrosesan-alg menyelesaikan perhitungannya. Jika Anda melihat ke dalam metadata lapisan Anda dapat menemukan sumber sebenarnya dari suatu lapisan (jika itu berasal dari pemrosesan biasanya di suatu tempat di folder sementara)

Curlew
sumber
Terima kasih atas jawaban Anda. Saya pikir sudah ada getLayersByNamefungsi untuk registri peta, tapi saya ingin menjalankan sendiri algoritma dari konsol, jadi ini tidak akan membantu (lapisan memori tidak pernah dimuat ke dalam registri, itulah yang saya coba lakukan) . Tetapi apakah Anda mengatakan bahwa tidak ada keuntungan menggunakan output memori dibandingkan dengan melewatkan Nonedan menghasilkan file temp? Apa kamu yakin akan hal itu?
Oystein
Nonebaru saja dilewati jika lapisan tidak dapat ditemukan di registri. Itu tidak membuat tempfile dan Anda perlu memeriksanya secara manual. Saya menggunakan fungsi ini untuk meminta lapisan yang dimuat dalam QGIS. Tidak dapat membantu Anda di luar di konsol.
Curlew
Saya pikir Anda salah paham, saya sedang berbicara tentang kelulusan Noneuntuk processing.runalgsebagai parameter output, yang saya percaya menciptakan file output temp.
Oystein
FYI: Baru saja menemukan fungsi QgsMapLayerRegistry lagi, namanyamapLayersByName
Oystein