De nombreux algorithmes de traitement ont une option pour enregistrer la sortie en mémoire. Si exécuté à partir de la boîte à outils, cela fonctionne très bien, car vous pouvez cocher la case "Ouvrir le fichier de sortie après l'exécution de l'algorithme".
En regardant le code source de QGIS, le code de chargement de la couche mémoire semble être défini dans la fonction Postprocessing.handleAlgorithmResults
. La fonction utilise l'accès à une alg.outputs
liste et effectue les opérations suivantes:
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:
# ...
Lorsque vous exécutez des algorithmes de traitement à partir de la console, existe-t-il un moyen de charger la couche sans accéder à cet objet? je peux courir
processing.runalg("qgis:intersection", layer1, layer2, "memory:")
ou même
processing.runalg("qgis:intersection", layer1, layer2, "memory:myLayerName")
Je ne peux cependant pas trouver un moyen de saisir la sortie résultante.
QgsMapLayerRegistry.instance().mapLayersByName("memory:myLayerName")[0]
essayez ceci:QgsMapLayerRegistry.instance().mapLayers()
c'est la bonne façon, c'est expliqué dans la documentation http://docs.qgis.org/2.14/es/docs/user_manual/processing/console.html
le prochain code fonctionne avec en mémoire tout sauf le dernier qu'il est chargé
le
processing.runalg
retourne un dictionnaire dans ce casbu['OUTPUT']
.OUTPUT
EST LA CLÉ, et la valeur est un chemin temporaire. Vous pouvez voir la clé avec processeing.alghelp ("traitement de nom") comme traitement, alghelp ("grass: r.drain")revenir
dans ce cas la clé est sortie , attention aux majuscules vous devez écrire en majuscule ou sans majuscule, dans ce cas pas de majuscule.
la source
output['OUTPUT']
chemin àQgsVectorLayer
avec unprovider_name
de"ogr"
. Cela lira dans le chemin .shp et créera une couche en mémoire. Cette approche n'ajoute pas la couche au registre, elle ne clignote donc pas dans le panneau Calques.Je ne sais pas si cela vous aidera dans votre contexte (voulez-vous exécuter votre code de manière autonome ou dans QGIS après la fin d'un algorithme de traitement?). Si c'est le dernier, vous pouvez facilement interroger les objets chargés
QGsVector-
etQGsRasterlayer
en consultant le registre QGIS MapLayer.En général, tous les calques doivent avoir une source quelque part sur le disque dur, même si le résultat est ajouté juste après qu'un alg de traitement ait terminé ses calculs. Si vous examinez les métadonnées des couches, vous pouvez trouver la source réelle d'une couche (si elle provient du traitement, elle est normalement quelque part dans un dossier temporaire)
la source
getLayersByName
fonction pour le registre de carte, mais je veux exécuter l'algorithme moi-même depuis la console, donc cela n'aidera pas vraiment (la couche mémoire n'est jamais chargée dans le registre, c'est ce que j'essaie de faire) . Mais dites-vous qu'il n'y a aucun avantage à utiliser une sortie mémoire par rapport au passageNone
et à la génération d'un fichier temporaire? Êtes-vous sûr de cela?None
est juste passé si la couche est introuvable dans le registre. Il ne crée pas de fichier temporaire et vous devez quand même le vérifier manuellement. J'utilise cette fonction pour interroger les couches chargées dans QGIS. Je ne peux pas vous aider à l'extérieur dans la console.None
enprocessing.runalg
tant que paramètre de sortie, ce qui, je crois, crée un fichier de sortie temporaire.mapLayersByName