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.outputs
daftar, 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.
QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
coba ini:QgsMapLayerRegistry.instance().mapLayers()
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
yang
processing.runalg
mengembalikan kamus dalam kasus inibu['OUTPUT']
.OUTPUT
ADALAH KUNCI, dan nilainya adalah temp temp. Anda dapat melihat kunci dengan processeing.alghelp ("pemrosesan nama") sebagai pemrosesan, alghelp ("rumput: r.drain")kembali
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.
sumber
output['OUTPUT']
jalan untukQgsVectorLayer
denganprovider_name
dari"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.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-
danQGsRasterlayer
objek dengan melihat ke dalam registri QGIS MapLayer.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)
sumber
getLayersByName
fungsi 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 melewatkanNone
dan menghasilkan file temp? Apa kamu yakin akan hal itu?None
baru 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.None
untukprocessing.runalg
sebagai parameter output, yang saya percaya menciptakan file output temp.mapLayersByName