Wiele algorytmów przetwarzania ma opcję zapisywania danych wyjściowych jako pamięci. W przypadku uruchomienia z przybornika działa to dobrze, ponieważ można zaznaczyć pole „Otwórz plik wyjściowy po uruchomieniu algorytmu”.
Patrząc na kod źródłowy QGIS, kod do ładowania warstwy pamięci wydaje się być zdefiniowany w funkcji Postprocessing.handleAlgorithmResults
. Funkcja korzysta z dostępu do alg.outputs
listy i wykonuje następujące czynności:
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:
# ...
Czy po uruchomieniu algorytmów przetwarzania z konsoli można załadować warstwę bez dostępu do tego obiektu? mogę biec
processing.runalg("qgis:intersection", layer1, layer2, "memory:")
lub nawet
processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")
Nie mogę jednak znaleźć sposobu na uzyskanie wynikowego wyniku.
QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
spróbuj tego:QgsMapLayerRegistry.instance().mapLayers()
jest to właściwy sposób, wyjaśniono to w dokumentacji http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html
następny kod działa w pamięci wszystkie oprócz ostatniego, który jest ładowany
processing.runalg
zwraca słownika w tym przypadkubu['OUTPUT']
.OUTPUT
JEST KLUCZEM, a wartością jest ścieżka tymczasowa. Możesz zobaczyć klucz z przetwarzaniem.alghelp („przetwarzanie nazw”) jako przetwarzaniem, alghelp („grass: r.drain”)powrót
w tym przypadku klucz jest wyprowadzany , uważaj na duże litery, które musisz pisać dużymi literami lub bez, w tym przypadku nie dużymi literami.
źródło
output['OUTPUT']
ścieżkęQgsVectorLayer
zprovider_name
o"ogr"
. Odczyta to ścieżkę .shp i utworzy warstwę w pamięci. To podejście nie dodaje warstwy do rejestru, więc nie jest flashowane w panelu warstw.Nie jestem pewien, czy to pomoże ci w twoim kontekście (czy chcesz uruchomić swój kod jako samodzielny czy w QGIS po zakończeniu algorytmu przetwarzania?). Jeśli jest to drugie, możesz łatwo wyszukać załadowane obiekty
QGsVector-
i przeszukaćQGsRasterlayer
obiekty, przeglądając rejestr QGIS MapLayer.Zasadniczo wszystkie warstwy muszą mieć źródło gdzieś na dysku twardym, nawet jeśli wynik zostanie dodany dopiero po zakończeniu obliczeń przez algorytm przetwarzania. Jeśli spojrzysz na metadane warstw, możesz znaleźć faktyczne źródło warstwy (jeśli pochodzi ona z przetwarzania jej zwykle gdzieś w folderze tymczasowym)
źródło
getLayersByName
funkcja rejestru rejestru, ale chcę uruchomić algorytm z konsoli, więc to naprawdę nie pomoże (warstwa pamięci nigdy nie jest ładowana do rejestru, to właśnie próbuję zrobić) . Ale czy mówisz, że korzystanie z wyjścia pamięci nie ma przewagi nad przekazywaniemNone
i generowaniem pliku tymczasowego? Jesteś pewien?None
jest przekazywany, jeśli warstwy nie można znaleźć w rejestrze. Nie tworzy pliku tymczasowego i i tak musisz go sprawdzić ręcznie. Korzystam z tej funkcji, aby wyszukiwać załadowane warstwy w QGIS. Nie mogę ci pomóc na zewnątrz w konsoli.None
doprocessing.runalg
jako parametr wyjściowy, który moim zdaniem tworzy plik wyjściowy temp.mapLayersByName