Verständnisprobleme bei der Objektorientierung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
KlausS
User
Beiträge: 40
Registriert: Donnerstag 24. Januar 2008, 08:52
Wohnort: Leverkusen

Hallo Liste,
ich muss mit ArcGIS viele Schritte der Geoverarbeitung erledigen und nutze dazu Python 2.4 (durch ArcGIS vorgegeben).
Da ich zu Beginn immer die gleichen Schritte machen muss wie:

Code: Alles auswählen

import arcgisscripting
# Erstellen des Geoprocessor-Objektes
gp = arcgisscripting.create()
# Produkt setzen
gp.SetProduct("ArcView")
# Setzen des Workspace
gp.Workspace = self.workSpaceName
# Vorhandene Daten ueberschreiben
gp.overwriteoutput = 1
# Benoetigte Toolboxen fuer Test mit dem Editor laden
gp.AddToolbox("C:/Programme/ArcGIS/ArcToolbox/Toolboxes/Analysis Tools.tbx")
gp.AddToolbox("C:/Programme/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx")
u.s.w
habe ich mir überlegt, ob man das nicht auch OO lösen kann, um eine Codeverdoppelung zu vermeiden.
Dazu habe ich folgende Klasse erstellt (GeoProzessor.py):

Code: Alles auswählen

# Importieren des  Systemmodules
import arcgisscripting

class GeoProzessorObjekt(object):
  def __init__(self, workSpaceName, fcName):
    self.workSpaceName = workSpaceName
    self.fcName = fcName
    # Erstellen des Geoprocessor-Objektes
    gp = arcgisscripting.create()
    # Produkt setzen
    gp.SetProduct("ArcView")
    # Setzen des Workspace
    gp.Workspace = self.workSpaceName
    # Vorhandene Daten ueberschreiben
    gp.overwriteoutput = 1
    # Benoetigte Toolboxen fuer Test mit dem Editor laden
    gp.AddToolbox("C:/Programme/ArcGIS/ArcToolbox/Toolboxes/Analysis Tools.tbx")
    gp.AddToolbox("C:/Programme/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx")
Diese Oberklasse möchte ich jetzt für die verschiedenen Verarbeitungsschritte nutzen.
Beispiel:

Code: Alles auswählen

# Importieren des  Systemmodules
import arcgisscripting
from GeoProzessor import GeoProzessorObjekt

class ReihenfolgeBerechnen(GeoProzessorObjekt):
  def __init__(self, workSpaceName, fcName, sortFeld):
    GeoProzessorObjekt.__init__(self, workSpaceName, fcName)
    self.sortFeld = sortFeld
    self.getGeoBerechnung()
  def getGeoBerechnung(self):

    # SearchCursor definieren
    rows = gp.SearchCursor(self.fcName, "","","",self.sortFeld)
Die Vererbung aus der Oberklasse scheint zu funktionieren, denn mit

Code: Alles auswählen

print self.workSpaceName
wird dieser ausgegeben.
Aber offensichtlich ist kein Zugriff auf Geoprozessorobjekt gp möglich, da die letzte Zeile den Fehler
NameError: global name 'gp' is not defined
hervorruft. Kann mir jemand auf die Sprünge helfen und mir einen Tipp geben, wie ich aus der abgeleiteten Klasse an das gp-Objekt komme.

Klaus
BlackJack

Na auch an das Objekt binden genau wie Du das mit `workSpaceName` und `fcName` getan hast. Sonst sind das in der Basisklasse einfach nur lokale Namen in der `__init__()`, die nach Abarbeitung selbiger wieder verschwunden sind.

Von der `__init__()` kannst Du nichts zurück geben, also z.B. das Ergebnis von `self.getGeoBerechnung()`.

Falls das immer Klassen werden, die nach dem Muster "Instanz erstellen und eine Methode aufrufen um das Ergebnis zu bekommen" verwendet werden, sind Klassen vielleicht etwas übertrieben und eine Funktion, mit den "Grundschritten", die das `gp`-Objekt zurück gibt, reicht aus.

Nach dem was ich hier im Forum so von ArcGIS gesehen habe, sollte sich da sowieso mal jemand, der ArcGIS und Python kann, hinsetzen und ein paar Hilfsfunktionen schreiben, die das ganze "pythonischer" machen. :-)
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo KlausS,

du musst die Attribute deiner Klasse einfach nur an das selfobjekt binden (so wie du es bei workSpaceName gemacht hast)
Dann kannst du auch aus der Abgeleiteten Klasse über self.gp.Irgendwas auf diese Attribute zugreifen.

Gruß Zap
KlausS
User
Beiträge: 40
Registriert: Donnerstag 24. Januar 2008, 08:52
Wohnort: Leverkusen

Zunächst mal danke für die Tipps. Aber leider habe ich es immer noch nicht verstanden.
@BlackJack
Falls das immer Klassen werden, die nach dem Muster "Instanz erstellen und eine Methode aufrufen um das Ergebnis zu bekommen" verwendet werden, sind Klassen vielleicht etwas übertrieben und eine Funktion, mit den "Grundschritten", die das `gp`-Objekt zurück gibt, reicht aus.
Eigentlich sehe ich das auch so, aber wie man sieht, fehlt die Übung bzw. das Verständnis für OOP. Und ohne Übung geht's offensichtlich nicht.

Wenn ich euch richtig verstanden habe, muss ich die Basisklasse wie folgt ändern:

Code: Alles auswählen

# Importieren des  Systemmodules
import arcgisscripting

class GeoProzessorObjekt(object):
  def __init__(self, workSpaceName, fcName):
    self.workSpaceName = workSpaceName
    self.fcName = fcName
    # Erstellen des Geoprocessor-Objektes
    self.gp = arcgisscripting.create()
    # Produkt setzen
    self.gp.SetProduct("ArcView")
    # Setzen des Workspace
    self.gp.Workspace = self.workSpaceName
    # Vorhandene Daten ueberschreiben
    self.gp.overwriteoutput = 1
    # Benoetigte Toolboxen fuer Test mit dem Editor laden
    self.gp.AddToolbox("C:/Programme/ArcGIS/ArcToolbox/Toolboxes/Analysis Tools.tbx")
    self.gp.AddToolbox("C:/Programme/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx")
Wenn ich dann in der abgeleiteten Klasse

Code: Alles auswählen

rows = self.gp.SearchCursor(self.fcName,"","","",self.sortFeld)
aufrufe, kommt die Fehlermeldung
AttributeError: 'ReihenfolgeBerechnen' object has no attribute 'gp'
Bin jetzt auf der völlig falschen Fährte?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Das sieht soweit richtig aus.
Programmierst du mit IDLE?
Wenn ja dann kann ein Neustart von IDLE helfen, das Tool kann manchmal ganz schön ärger machen.
KlausS
User
Beiträge: 40
Registriert: Donnerstag 24. Januar 2008, 08:52
Wohnort: Leverkusen

Hallo Zap,

ich nutzte den PyScripter. Aber wo du es jetzt ansprichst, auch der hat schon mal die gleichen Probleme. Ich werde das morgen testen, wenn ich wieder Zugriff auf den Rechner habe und dann berichten.
Aber es beruhigt mich, dass der Code aus deiner Sicht OK ist.
Nach dem was ich hier im Forum so von ArcGIS gesehen habe, sollte sich da sowieso mal jemand, der ArcGIS und Python kann, hinsetzen und ein paar Hilfsfunktionen schreiben, die das ganze "pythonischer" machen.
@BlackJack: Das wäre eine tolle Sache.
KlausS
User
Beiträge: 40
Registriert: Donnerstag 24. Januar 2008, 08:52
Wohnort: Leverkusen

Nach einem Neustart funktioniert alles. Danke für die Tipps.

Klaus
Benutzeravatar
wollmich
User
Beiträge: 9
Registriert: Montag 11. Februar 2008, 16:31
Wohnort: Bern (CH)

Das geht auch ohne Neustart von Python Scripter.

Installiere RPyC http://rpyc.wikispaces.com/install

Danach kannst du im Menu unter Run / Python Engine / Remote wählen.

Nun kannst du die Python Engine mit CTRL + F2 zurücksetzen ohne den PyScripter neu zu starten. :)
Dies kann nötig sein, wenn dein Programm hängen bleibt, importierte Klassen sich ändern und so weiter ...

Gruss wollmich
Antworten