GRASS-Module in pyQGIS aufrufen?

9

Ich möchte ein Grass-Modul (v.to.db) in QGis ohne die Grass-Toolbox verwenden.

Ich habe es mit der Python-Konsole versucht, aber ohne Erfolg:

  • Mit dem Sextante-Plugin kannte es aber offensichtlich nicht alle Grasmodule.

aus sextante.core.Sextante Sextante importieren

Sextante.alghelp ("Gras: v.to.db")

-> Algorithmus nicht gefunden

  • Ein anderer Test:

grass.run_command ("v.to.db", map = 'bl @ PERMANENT', layer = '2', option = 'start', Einheiten = 'meter', Spalten = 'X, Y, Z')

-> Traceback (letzter Anruf zuletzt):

Datei "", Zeile 1, im Modul

NameError: Name 'Gras' ist nicht definiert

Wissen Sie, ob es eine andere Möglichkeit gibt, das Grasmodul zu verwenden? Ich möchte es nicht in der Gras-Toolbox verwenden, da ich nur eine Spalte im "Attributfeld" auswählen kann und mehrere Spalten auswählen möchte.

MarieA
quelle
gis.stackexchange.com/questions/21867/… zeigt, wie man Gras importiert
underdark

Antworten:

3

Um Grasfunktionen von einem Plugin oder von der Konsole aus zu verwenden, müssen Sie zuerst das Grasmodul wie folgt importieren:

import grass.script as grass

Wenn Sie den Import vergessen, wird der NameError für ausgelöst grass.

Befolgen Sie die detaillierten Anweisungen zur Verwendung von Gras in Python

Wenn Sie unter Windows ausgeführt werden und beim Importieren von Gras der Fehler "Handle" angezeigt wird, ist dies auf einen ungelösten Python-Fehler zurückzuführen, der auf einigen Fenstersystemen auftritt. Um das Problem zu umgehen, fügen Sie den Code, der Gras importiert und aufruft, in ein separates Skript ein. Führen Sie dieses Skript dann als unabhängigen Prozess in Ihrem Plugin aus.

callgrass.py:

if __name__ == '__main__':

import grass.script as grass
grass.run_command("v.to.db", map='bl@PERMANENT', layer='2', option='start', units='meters', columns='X,Y,Z')

print "Grass OUtput"

From Console/Plugin:

import subprocess

p1=subprocess.Popen(['callgrass.py', 'arg1', ...], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p1.stdin.close()
ret= p1.communicate()[1] # grab grass output  
print ret 

Viel Glück!

MonsterMushroom
quelle