Entwickeln von unternehmenswichtiger Software mit Python: eine Erfolgsgeschichte

Mithilfe von Beiträgen der Fachleute bei Kunden und Branchenpartnern wurde bei Integrated Informatics Inc. das Handelsprodukt Geodetics Toolkit entwickelt. Mit diesem Toolkit können Benutzer Berichte für seismische und Bohrungsvermessungen laden, analysieren, kartografieren, überwachen und erstellen. Mithilfe der Werkzeuge der Toolbox werden Texte und binäre Daten, die sowohl benutzerdefiniert als nach Branchenstandards (z. B. UKOOA, SEG-Y, SEGP1 usw.) formatiert sind, in ein Schema von Feature-Classes und Tabellen geladen.

Im Folgenden erörtert Integrated Informatics Inc. die Gründe für die Wahl von Python als Sprache für das Entwickeln ihres Produkts. Es wird erläutert, welche Vorteile Python in der Softwareentwicklungsumgebung bietet, und warum es sich bei Python um weit mehr als nur eine einfache Skriptsprache handelt. Abschließend wird die Verwendung von Open Source-Bibliotheken im Produkt beschrieben.

Ein Meer von Messungen

Seismische und Bohrungsmessdaten sind ein integraler Bestandteil der Datenbanken aller Öl- und Gasunternehmen. Sie werden auf verschiedene Weise verwendet, z. B. als Visualisierungen, zum Auffinden von Ressourcen und für die Inventur. Die Öl- und Gasbranche verfügt über eine lange und umfassende Geschichte der Computernutzung und digitalen Datenspeicherung. Im Lauf dieser Geschichte sind viele Standards für das Speichern der Messdaten entstanden, und die Unternehmen mussten sich für geeignete Standards entscheiden oder gar eigene entwickeln. Als Ergebnis entstand eine Vielfalt an Messdateien, die ähnlich wirken, jedoch häufig kleine aber entscheidende Unterschiede aufweisen.

Da schon seit langer Zeit Messinformationen anfallen, kann es nicht überraschen, dass für die Verarbeitung dieser Daten viele Werkzeuge verfügbar sind. Das Problem besteht darin, dass diese Werkzeuge häufig nicht Teil einer umfassenderen Softwarelösung sind. Sie wurden für die Anzeige oder bestimmte Verarbeitungsaspekte entwickelt, sind jedoch häufig nicht kompatibel mit dem Rest der Unternehmensdatenbank. Dies ist nicht optimal, da diese Daten nur dann vollständig genutzt werden können, wenn sie überlagert, integriert und gemeinsam analysiert werden können. Wenn davon ausgegangen wird, dass die meisten Öl- und Gasunternehmen den Esri Stack als wichtigste GIS-Software verwenden, scheint es wünschenswert, Bohrungs- und seismische Daten verschiedener Formate direkt in ArcGIS zu laden.

Entwickeln in einer Unternehmensumgebung – Warum Python?

Für die Entwicklung des Geodetics Tools hatten wir die Option, einen ArcObjects-basierten Ansatz zu verwenden, doch wir entschieden uns aus zwei wesentlichen Gründen für Python: 1) Entwicklungsgeschwindigkeit und 2) Einfache Bereitstellung.

Entwicklungsgeschwindigkeit

Python und das Geoverarbeitungs-Framework sind eng integriert, und Python ist die empfohlene Sprache für Skriptwerkzeuge. Durch die Auswahl von Python können Entwickler sich auf das Codieren der Funktionen anstatt der Benutzeroberfläche konzentrieren. Dies bedeutet gleichzeitig, dass Sie in diesem Falle Ihren Kunden die Produkte schneller bereitstellen können, da Kernbestandteile des Projekts (die Benutzeroberfläche) bereits vorhanden sind. Wenn Sie beispielsweise im Geoverarbeitungs-Framework ein Werkzeug erstellen, entspricht dieses in der Anzeige- und Funktionsweise den Kernwerkzeugen von ArcGIS. Daher erhalten Sie Standardprüfungen, -Benutzeroberflächen-Steuerelemente und einen einheitlichen Dokumentationsstil, sodass Ihre benutzerdefinierten Werkzeuge nahtlos in andere Teile der Anwendung wie z. B. ModelBuilder integriert werden können.

Es sollte nicht unerwähnt bleiben, dass die Entwicklungszeit für den Programmierer aufgrund des Aufbaus von Python selbst zusätzlich verringert wird. Guido van Rossum, der Autor von Python, hat eine einfache, intuitive und für Alltagsaufgaben geeignete Open Source-Sprache in klarem Englisch geschaffen. Sie als GIS-Analyst können zum Entwickler werden, da Python einfach zu erlernen und zu lesen ist. Sie verbringen weniger Zeit mit Lernen und mehr mit dem Erstellen von Lösungen und dem Verbessern des Workflows.

Die Geodetics Toolbox umfasst derzeit mehr als 40 Werkzeuge. Es konnte ein enormer Zeitaufwand vermieden werden, da wir die Benutzeroberflächen für die einzelnen Werkzeuge nicht programmieren mussten. Die eingesparte Zeit konnten wir intensiv dem Testen der Werkzeuge, dem Aufbauen einer Testumgebung, dem Verbessern der Leistung und dem Einführen von Innovationen und neuen Funktionen widmen.

Einfache Bereitstellung

Einer der wichtigsten Vorzüge der Python-Lösung ist die einfache Bereitstellung. Es müssen keine DLLs registriert, keine komplizierten Installationen durchgeführt und keine COM-Abhängigkeiten berücksichtigt werden. Mithilfe der Geodetics Toolbox können wir die Lösung in unserem Büro einfach in eine ZIP-Datei verpacken und an einem für uns zugänglichen Speicherort im Netzwerk des Kunden wieder entpacken. Wenn der Code einmal vor Ort ist, müssen die Kunden die Toolbox lediglich zu ArcGIS Desktop hinzufügen, und sie können auf die Funktionen zugreifen.

In vielen großen Unternehmen unterliegt das Installieren von Software der IT-Abteilung. Diese muss die Software unter den Mitarbeitern verteilen, was mitunter kompliziert ist. Die IT-Abteilungen sind Lösungsanbietern dankbar, die möglichst einfache Installationen bereitstellen, mithilfe derer die Kunden schnell auf neue Funktionen zugreifen können. Bei Integrated Informatics führt die Verwendung von Python dazu, dass wir unseren Kunden sowohl das denkbar einfachste Installationsverfahren als auch die schnellstmögliche Lieferzeit anbieten können, was uns zufriedene Kunden einbringt.

Entwickeln in einer Unternehmensumgebung – Automatisierte Tests

Der Python-Code für die Geodetics Toolbox enthält weit mehr als 5000 Codezeilen (ohne Open Source-Pakete). Wie bei allen Handelsprodukten senden uns die Kunden regelmäßig Erweiterungsanfragen, die wir so schnell wie möglich umzusetzen versuchen. Die Anfragen reichen von neuen Parametern bis hin zu vollständig neuen Toolsets. Daher ist es uns wichtig zu wissen, ob sich Änderungen auf vorhandene Funktionen auswirken, und ob bestimmte Änderungen zum Fehlschlagen von Werkzeugen führen. Bei mehr als 40 Werkzeugen mit jeweils bis zu mehreren Dutzend Parametern ist ein manuelles Testen der einzelnen Werkzeuge schlicht ineffizient. Um die erwünschte Lieferzeit für die Anfragen unter Einhaltung der Qualitätsansprüche erfüllen zu können, sind automatisierte Tests ein absolutes Muss.

Python wird sozusagen "betriebsbereit geliefert", sodass wir für einen Teil der Lösung lediglich Python selbst prüfen mussten. Python verfügt über das hervorragende Standardmodul "unittest", das Bestandteil der Kerninstallation von Python ist. Wir verfügen für jedes Werkzeug über separate Testskripte, mit denen wir die vielen verschiedenen Permutationen der Parameter und Dateneingaben testen können. Dank der individuellen Testsuites für die einzelnen Werkzeuge können wir sehr präzise und im Laufe eines Arbeitstags zeitsparend und genau die gewünschten Aspekte testen.

Testsuites für die einzelnen Werkzeuge sind ein erster wichtiger Schritt. Es ist jedoch unerlässlich, dass diese Testskripte regelmäßig und automatisiert ausgeführt werden, und nicht nur dann, wenn es gerade jemandem einfällt. Mittlerweile ist es Mode geworden, eine "fortlaufende Integration" anzustreben, bei der nach jeder in die Codebasis eingecheckten Änderung alle Tests der Testsuite ausgelöst werden. Dies kann für einen bestimmten Typ von Codebasis oder manche Tests eine hervorragende Option sein. Für Werkzeuge mit großer Verarbeitungsauslastung wie z. B. Hochfrequenztests ist dies jedoch nicht immer praktisch. Wichtiger ist der Ansatz, den Test regelmäßig auszulösen. Dies kann nachts, wöchentlich oder gar monatlich in der Häufigkeit erfolgen, mit der die Codebasis aktualisiert wird. Wenn die Testsuite automatisch ausgeführt wird, haben Sie Ihren Code stets im Auge, sodass Sie gegebenenfalls rasch erkennen, ob und wann sich ein Fehler in den Code eingeschlichen hat, um diesen umgehend zu beheben.

Wiederverwenden von Code: Klassen in Python

Eine der Grundsätze beim Programmieren ist das Vermeiden von Doppelungen. Es gibt verschiedene Methoden, mit denen Sie Codedoppelungen vermeiden und Ihre Codebasis effizienter gestalten können. Zunächst können Sie Funktionen verwenden, die Codebestandteile enthalten, die Sie immer wieder verwenden. Funktionen sind äußerst hilfreich und der erste Schritt zum Vermeiden von Codedoppelungen. Bei einer großen Codebasis sind die Möglichkeiten (bei aller Berechtigung) begrenzt, sodass in vielen Fällen Klassen erstellt werden sollten.

Obwohl Python im Kontext der Software von Esri als Skriptsprache betrachtet wird (was z. B. im Namen "arcgisscripting" zum Ausdruck kommt), handelt es sich tatsächlich um eine vollständige objektorientierte Programmiersprache (OO). Daher können Programmierer Klassen sowie mithilfe von Vererbung vollständige Klassenhierarchien erstellen. In einer großen Codebasis kann sinnvoll geschriebener OO-Code beim konzeptionellen Abstrahieren komplexer Ideen, beim Verringern von Codedoppelungen und beim Isolieren von Code in kleine präzise Abschnitte helfen, die einfacher geändert, verwaltet und getestet werden können.

Das unten aufgeführte recht einfache Beispiel soll als erste Einführung in die Python-Klassen und eine kleine Klassenhierarchie dienen.

from os.path import basename

class AbstractReport(object):
    """
    Base parsing class
    """
    _table_fields = None

    def __init__(self, file_path, records):
        """
        initializes the class
        """
        self._file_path = file_path
        self._records = records

    def calc_coords(self):
        """
        calculates coordinates to be written to report table
        """
        raise NotImplementedError

    def write_table(self):
        """
        parses the records in the file
        """

        coords = self.calc_coords()
        print ('writes a table using fields %s '
               '\nand calculated coords %s to file %s' %
               (self._table_fields, coords, basename(self._file_path)))


class OrthoCheckReport(AbstractReport):
    """
    Orthongonal Check Report Class
    """
    _table_fields = ['FLD_A', 'FLD_B', 'FLD_C']

    def calc_coords(self):
        """
        calculates coordinates to be written to report table
        """
        print ('special Orthogonal Check report calculations using records %s' %
               self._records)
        return ['ortho', 'check', 'results']


class QAQCReport(AbstractReport):
    """
    QAQC Report class
    """
    _table_fields = ['FLD_X', 'FLD_Y', 'FLD_Z']

    def calc_coords(self):
        """
        calculates coordinates to be written to report table
        """
        print ('special QAQC report calculations using records %s' %
               self._records)
        return ['qaqc', 'report', 'results']


if __name__ == '__main__':
    input_file = r'c:\test\seismic_file.txt'
    records = ['reca', 'recb', 'recc']

    ocr = OrthoCheckReport(input_file, records)
    qqr = QAQCReport(input_file, records)

    ocr.write_table()
    qqr.write_table()

Beim Ausführen druckt dieser Code Folgendes:

special Orthogonal Check report calculations using records ['reca', 'recb', 'recc']
writes a table using fields ['FLD_A', 'FLD_B', 'FLD_C']
and calculated coords ['ortho', 'check', 'results'] to file seismic_file.txt

special QAQC report calculations using records ['reca', 'recb', 'recc']
writes a table using fields ['FLD_X', 'FLD_Y', 'FLD_Z']
and calculated coords ['qaqc', 'report', 'results'] to file seismic_file.txt

In der oben angeführten Hierarchie ist der Code für die write_table-Methode nur in einer der Klassen (der AbstractReport-Klasse) vorhanden. Instanzen der anderen Klassen ( OrthoCheckReport oder QAQCReport) können die Methode jedoch ebenfalls aufrufen. Dies liegt daran, dass sowohl OrthoCheckReport als auch QAQCReport "Unterklassen" der "Basisklasse" AbtractReport sind und von dieser "erben". Eine Unterklasse, die von einer Basisklasse erbt, verfügt über Zugriff auf alle Methoden und Eigenschaften der Basisklasse. Daher erfolgen Aufrufe an write_report unabhängig von der oben erstellten Klasse über dieselbe Methode.

Die calc_coords-Methode zeigt auf, was geschieht, wenn der Code in den Unterklassen sich von dem der Basisklasse unterscheiden muss. Die einzelnen Unterklassen verfügen über unterschiedliche Berechnungsverfahren für die für Tabellenkoordinaten und daher über eindeutigen Code. Um dies sicherzustellen "überladen" die Unterklassen die Methode calc_coords von der Basisklasse. Wie oben gezeigt erfolgt das "Überladen" in Python einfach durch das Hinzufügen einer Methode mit demselben Namen zu den Unterklassen. Dies bedeutet, dass die write_table-Methode beim Aufrufen von calc_coords einem eindeutigen Pfad durch die Unterklassen folgt, obwohl sie für alle Klassen über genau denselben Code verfügt. Dadurch wird der Code von unnötiger Logik (wie z. B. zusätzlichen "if"-Ausdrücken) befreit, sodass er optimiert und einfacher lesbar wird.

Damit eine Klasse von einer anderen erben kann, fügen Sie einfach den Namen der gewünschten Basisklasse in die Klassendeklaration ein:

class OrthoCheckReport(AbstractReport):

Stellen Sie hierbei sicher, dass die Initialisierung (__init__) der Unterklassen identisch mit der der Basisklasse ist. Wenn diese abweicht, müssen Sie auch für die Unterklassen eine "__init__" schreiben. In der Dokumentation und der Hilfe finden Sie Beispiele.

Verwenden und Bereitstellen von Open Source-Paketen

Warum Open Source?

Python hat sich zu einer der beliebtesten Open Source-Programmiersprachen entwickelt. Daher haben die Python-Benutzer sprichwörtlich Tausende von Open Source-Paketen erstellt, von denen viele direkt für die von Ihnen gewünschten Anwendungsfunktionen verwendet werden können. In der Geodetics Toolbox verwenden wir viele Open Source-Pakete, um die Ziele unserer Kunden zu erreichen.

Stellen Sie sich als Beispiel eine häufige Kundenanfrage vor: Erstellen eines PDF-Berichts aus einer in ArcGIS durchgeführten Analyse. Wie sich herausstellt, ist das benutzerfreundliche und plattformübergreifende Open Source-Paket "ReportLab Toolkit" verfügbar, das sich zum Erstellen von PDF-Dokumenten eignet. Dieses Paket beinhaltet umfassende und stabile PDF-Bearbeitungsfunktionen ebenso wie eine hervorragende Dokumentation und eine Anleitung für die ersten Schritte. Mithilfe dieses Pakets konnten wir relativ einfach und im Rahmen einer sehr kurzen Entwicklungszeit Berichte und Daten in PDF-Dokumente schreiben. Fragen Sie sich also bei der nächsten Anfrage: "hat dies schon einmal jemand gemacht?", und suchen Sie im Internet, bevor Sie sich auf die Entwicklung stürzen.

Die alles entscheidende Lizenz

Wenn Sie ein Paket mit exakt der gewünschten Funktion finden, lesen Sie im ersten Schritt die Lizenz. Open Source-Lizenzen weisen die unterschiedlichsten Formen auf, und viele wurden geschrieben, um zu vermeiden, dass Software zu einer "Closed Source" wird. Es ist von entscheidender Bedeutung, die Lizenz sehr genau zu lesen und sicherzustellen, dass Sie das Paket ordnungsgemäß verwenden. Im Fall des "ReportLab Toolkit" handelt es sich um eine Berkeley Software Distribution-Lizenz (i. d. R. als "BSD"-Lizenz) bezeichnet. Diese Lizenz ist sehr freizügig und gestattet im Rahmen einiger weniger, geringfügiger Bedingungen die Verwendung und Verteilung der Software in anderer proprietärer Software. Andere Lizenzen sind bei Weitem nicht so freizügig und sollen sicherstellen, dass es sich bei der Software, für die die Open Source-Software verwendet wird, ebenfalls um Open Source handelt (z. B. die GPL-Lizenz). Machen Sie sich ausreichend mit den häufigsten Lizenzen vertraut, um zu wissen, welche Open Source-Pakete Sie wie verwenden können.

Eine hilfreiche Lizenztabelle finden Sie hier: http://en.wikipedia.org/wiki/Comparison_of_free_software_licenses. Eine weitere sehr hilfreiche Website ist www.opensource.org, die Informationen zu allen Open Source-Lizenzen enthält.

Bereitstellen von Open Source-Paketen

In der Geodetics Toolbox wurde das "ReportLab Toolkit" als Unterpaket unseres Pakets eingebunden, sodass der Code mit unserem Code bereitgestellt wurde. Wiewohl es einfach scheinen mag, Open Source-Pakete in Ihrem Code zu referenzieren, ist es wichtig, dass das Paket tatsächlich eingebunden wird. Dadurch können Sie die Version des verwendeten Pakets steuern und sicherstellen, dass das Paket auf dem Computer des Kunden verfügbar ist. Den Kunden zu bitten, das Paket selbst zu installieren, ist umständlich und sollte vermieden werden. Noch einmal: Wenn Sie ein Open Source-Paket mit Ihrem Code bereitstellen, ist es von entscheidender Bedeutung, die Lizenz zu lesen und die entsprechenden Bedingungen zu erfüllen.

Zusammenfassung

Für die Bereitstellung der Funktionen der Geodetics Toolbox haben wir uns für Python als Entwicklungssprache entschieden. Python und das Geoverarbeitungs-Framework ermöglichten uns ein schnelles Bereitstellen der Funktionen, deren Erscheinungsbild und Funktionsweise dem Rest des ArcGIS-Produkts entsprachen. Mithilfe der Module, die Bestandteil jeder Python-Installation sind, konnten wir eine Suite von "unittests" erstellen, um die Qualität unseres Produkts über viele Codebereitstellungen und neue Funktionsanfragen hinweg sicherzustellen. Wir nutzten die Funktionen von Python als objektorientierte Programmiersprache, um Codedoppelungen in unserer Codebasis zu verringern, sodass der Code einfacher verwaltet werden kann. Abschließend konnten wir aufgrund der großen Open Source-Community von Python ein Open Source-Paket finden, das unsere Entwicklungszeit verkürzte und uns half, die Anforderungen des Kunden zu erfüllen.

Info zu Integrated Informatics

Integrated Informatics Inc. ist ein führendes Beratungsunternehmen für die Implementierung und Entwicklung von geographischen Informationssystemen. Integrated Informatics wurde 2002 gegründet und bietet mit Niederlassungen in Calgary (Alberta), St. John's (Neufundland) und Houston (Texas) die Verwaltung von räumlichen Daten und automatisierte Mapping-Lösungen für Kunden in Nordamerika an.

Integrated Informatics verfügt über langjährige Beziehungen zu den Kunden, die große und multinationale unabhängige Energieunternehmen und -organe, Kommunalverwaltungen, Landesregierungen sowie Entwicklungs- und Umweltberatungen umfassen. Wir verfügen über eine erfolgreiche Geschichte beim Entwickeln und Implementieren von Strategien, Systemen und Technologien, die die Unternehmensziele fördern und Unternehmenswerte schaffen.

Unsere Stärke sind unsere Mitarbeiter. Unser Team besteht aus erfahrenen Fachleuten auf den Gebieten geographische Informationssysteme, räumliche Datenverwaltung, Projektdatenmanagement und Anwendungsentwicklung sowie aus Experten verschiedener Disziplinen. Zu diesen Disziplinen gehören Pipelineentwicklung sowie Umwelt- und geowissenschaftliche Analyse. Unsere Arbeitsumgebung fördert Ideen, Innovationen und Implementierungen mithilfe professioneller Entwicklung, fortlaufender Weiterbildung, Branchenengagement und intern finanzierter Forschung und Entwicklung.

Integrated Informatics ist ein Silver Tier International Esri-Geschäftspartner, ein aktiver Teilnehmer am Beta-Programm für holistische Tests für Esri und Mitglied des Beirats für das GIS-Programm am Southern Alberta Institute of Technology (SAIT). Besuchen Sie uns unter www.integrated-informatics.com, oder wenden Sie sich unter gis@integrated-informatics.com an uns, um weitere Informationen über einzigartige Lösungen zu erhalten.