Fließzeitkarte erstellen

Einleitung

Im Zuge der Bearbeitung von Entwässerungsplänen stellt sich immer wieder die Frage nach den Fließzeiten innerhalb des Kanalnetzes, vor allem zur Abschätzung, wie rasch sich gefährliche Stoffe ausbreiten können, siehe beispielsweise das Musterbuch zum Generellen Entwässerungsplan (GEP) des VSA, Kapitel 5.4.6 "Zustandsbericht Gefahrenbereiche".

Im Folgenden zeigen wir, wie man die Fließzeit vom jedem Knoten eines Kanalnetzes bis zum Auslauf berechnet, und zwar unter der Annahme stationärer Verhältnisse. Dazu gehen wir von einem mittleren Trockenwetterabfluss aus. Benötigt werden:

Shape-Datei (Linie) mit den Fließgeschwindigkeiten

Shape-Datei (Punkt) mit den Knoten

Skript zum Berechnen der Fließzeiten (Herunterladen mittels Klick auf den Dateinamen "BerechneFliesszeit_v06.py" im Abschitt Listing)

Zum Ausprobieren haben wir für Sie Beispieldaten vorbereitet.

Die folgende Anleitung erfordert gewisse Kenntnisse von ArcGIS und von MIKE URBAN. Die Schritte werden an dieser Stelle nicht in aller Ausführlichkeit dargestellt.

Schritt für Schritt-Anleitung

1. Shape-Datei mit den Fließgeschwindigkeiten erstellen

(1a) Starten Sie MIKE URBAN

(1b) Führen Sie einen Berechnungslauf durch, bis sich stationäre Verhältnisse einstellen.

(1c) Laden Sie die Ergebnisdatei und aktivieren Sie den Ergebnistyp "Haltungen: Geschwindigkeit".

(1d) Fügen Sie einen Ergebnislayer "Fließgeschwindigkeit" hinzu.

(1e) Wählen Sie einen Zeitpunkt gegen Ende der Simulation. Achten Sie darauf, dass etwaige Pumpen nicht stillstehen, weil dies zu sehr geringen oder gar negativen Fließgeschwindigkeiten führt.

(1f) Exportieren Sie den Ergebnislayer als Shapedatei "geschwindigkeit.shp". Dieser Befehl exportiert immer den aktuellen Zeitschritt.

(1g) Führen Sie eine Fehlerprüfung für die Haltungen durch, damit die "msm_Link" mit den Feldern FROMNODE und TONODE versehen wird.

(1h) Beenden Sie MIKE URBAN.

2. Daten zu ArcMap hinzufügen und kontrollieren

(2a) Starten Sie ArcMap.

(2b) Fügen Sie die eben erstellte "geschwindigkeit.shp" als Layer "geschwindigkeit" hinzu.

(2c) Aus Ihrer MIKE URBAN-Datenbank fügen Sie die Featureklassen "msm_Node" und "msm_Link" als Layer hinzu.

(2d) Kontrollieren Sie in der Attributtabelle, ob alle Fließgeschwindigkeiten (Spalte "Results") positiv sind. Falls nicht, sind die entsprechenden Haltungen wahrscheinlich entgegen der Hauptfließrichtung orientiert. Sie können dies prüfen, indem Sie die Fließgeschwindigkeit mit dem Symbol "Pfeil rechts" darstellen.

3. Shape-Datei "geschwindigkeit.shp" erweitern

(3a) Erweitern Sie die "geschwindigkeit.shp" um folgende vier Felder:

fromnode, Text, 40 Zeichen

tonode, Text, 40 Zeichen

shplength, Double

velocity, Double

(3b) Befüllen Sie die Felder "fromnode" und "tonode"

Joinen Sie die "msm_Link" an die "geschwindigkeit".

Verwenden Sie den "Field Calculator" um "geschwindigkeit.fromnode" mit "msm_Link.FROMNODE"zu befüllen.

Verwenden Sie den "Field Calculator" um "geschwindigkeit.tonode" mit "msm_Link.TONODE" zu befüllen.

Entfernen Sie den Join.

(3c) Berechnen Sie shplength mittels Calculate Geometry. Die Einheit ist Meter.

(3d) Verwenden Sie den "Field Calculator", um "velocity" mit dem Inhalt von "Result" zu befüllen.

4. Shape-Datei "fliesszeit.shp" erstellen

(4a) Verbergen Sie in "msm_Node" alle Felder bis auf "MUID" und "TypeNo".

(4b) Exporten Sie "msm_Node" in eine Shape-Datei namens "fliesszeit.shp" und fügen Sie sie als Layer "fliesszeit" hinzu.

(4c) Erweitern Sie die "fliesszeit.shp" um folgende zwei Felder:

traveltime, Double

endnode, Text, 40 Zeichen

5. Führen Sie das Python-Script aus

(5a) Starten Sie die Bearbeitung des Layers "fliesszeit".

(5b) Öffnen Sie über das Menü "Geoprocessing" das Python-Fenster und laden Sie das Skript "BerechneFliesszeit_v06.py".

So sieht das Pyhton-Fenster nach dem Laden des Skripts aus:

(5c) Drücken Sie <Eingabe> zwei Mal. Das Skript läuft hoffentlich ohne Fehlermeldung durch.

Das Skript geht alle Knoten durch und sucht den Weg zum Endknoten, das sollte der Auslauf sein.

Auf dem Weg dorthin berechnet es pro Haltung die Fließzeit als Produkt aus Länge * Fließgeschwindigkeit, summiert diese Produkte auf, und schreibt sie ins Feld "traveltime". Einheit sind Minuten.

Zusätzlich schreibt das Skript die MUID des jeweils gefundenen Endknotens ins Feld "endnode". Dies sollte helfen, falls Netzteile voneinander getrennt sind, oder sich auf dem Weg nach unten verzweigen. Auch Fehler bei der Definitionsrichtung der Haltungen sollten hierbei auffallen.

(5d) Speichern Sie die Änderungen. Diesen Schritt dürfen Sie nicht überspringen, weil im nächsten Schritt keine Sicherheitsabfrage erfolgt.

(5e) Beenden Sie die Bearbeitung.

Darstellung der Ergebnisse

Klassifizieren Sie im Layer "fliesszeit" das Attribut "traveltime" mit abgestuften Farben. Im Beispiel unten steht rot für eine geringe Fließzeit zum Auslauf. Je stärker sich die Farbe dem Blau nähert, desto länger wird die Fließzeit zum Auslauf.

Die Farben in der Abbildung sind genau verkehrt

Links fällt auf, dass es zwei Bereiche mit geringer Fließzeit gibt. Das liegt daran, dass das Kanalnetz in zwei Bereiche getrennt sind.

Wenn Sie den Layer "fliesszeit" nach dem "endnode" klassifizieren, erkennen Sie, dass der nördliche Bereich den Enknoten 115, und der südliche Bereich den Endknoten 120 gefunden hat.

Spezialitäten

Fließzeit zwischen zwei Knoten im Netz

Die Fließzeit wird vom Skript immer bis zum Auslauf berechnet. Interessiert Sie nur die Fließzeit zwischen zwei bestimmten Knoten, so subtrahieren Sie die Fließzeit des unteren Knotens von der Fließzeit des oberen Knotens.

Für die grafische Darstellung entlang einer Strecke müssten Sie die restlichen Knoten löschen, und die Subtraktion mittels Feldberechnung für alle Knoten entlang der Strecke durchführen.

Vermaschungen

Bei Vermaschungen (Ringschlüsse innerhalb des Kanalnetzes) ist es dem Zufall überlassen, ob das Skript den Weg links oder rechts wählt1) Genau genommen hängt die Wahl davon ab, welche Haltung in der Datenbank weiter oben angeführt ist . Wollen Sie die Wahl steuern, also beispielsweise sicherstellen, dass der kürzere Weg berücksichtigt wird, müssen Sie in "geschwindigkeit.shp" den längeren Weg am oberen Ende kappen.

Vermaschungen können Sie in MIKE URBAN mit dem Werkzeug "Ringschluss" (Werkzeuge > Aufspüren > Ringschluss) auswählen und somit anzeigen lassen. Nehmen Sie dazu das Werkzeug in die Hand und klicken Sie auf einen beliebigen Knoten.

Was das Skript naturgemäß nicht berücksichtigen kann, ist die Fießzeit, die sich aus der Benutzung beider Pfade ergibt.

Wehre

Wehre sind ebensowenig berücksichtigt wie Pumpen. Eine angeschlossene Entlastungsleitung wird als separater Netzteil berücksichtigt. Wenn Sie davon ausgehen müssen, dass das Wehr in Ihrem Lastfall anspringt, müssen Sie in "geschwindigkeit.shp" eine passende Verbindung einfügen (siehe Pumpen).

Pumpen

Eine fehlende Pumpe, im obigen Beispiel zwischen Knoten 115 und seinem südlichen Nachbarn, können Sie händisch in "geschwindigkeit.shp" einfügen. Ergänzen Sie deon oberen Knoten, den unteren Knoten und die Länge. Die große Frage ist, welche Fließgeschwindigkeit Sie ansetzen möchten:

die Fließgeschwindigkeit bei laufenden Pumpen,

eine mittlere Fließgeschwindigkeit aus Laufzeit und Stehzeit,

oder sie lassen die Pumpe doch lieber weg, weil Sie in einem Störfall davon ausgehen können, dass die Pumpe abgeschaltet wird.

Eine allgemein gültige Antwort gibt es nicht, vielmehr hängt sie von Ihrer Aufgabenstellung ab.

Becken

Handelt es sich bei einem Knoten um ein Becken, wird dies Auswirkungen haben, je nachdem, ob das Becken im Hauptschluss oder im Nebenschluss liegt, und ob es bereits gefüllt ist: ein allfälliger Gefahrenstoff wird Zwischengespeichert, zusätzlich kommt es zu einer Verflachung der Frachtganglinie.

Die tatsächlichen Vorgänge sind komplex. Vereinfachend können Sie der abgehenden Haltung eine geringere Fließgeschwindigkeit zuweisen, sodass das Becken zeitlich weiter vom Auslauf entfernt wird.

Fließzeit bei Regenwetter

Bei Regenwetter und also bei dynamischen Fließverhältnissen hängt die Fließzeit eines Wasserteilchens davon ab, wann man das Wasserteilchen zu beobachten beginnt. Steigt die Fließgeschwindigkeit rasch an und ebbt auch rasch wieder ab, erlebt ein Wasserteilchen auf seiner Reise unterschiedliche Gegebenheiten, und wann die ungünstigste Kombination auftritt, kann so leicht nicht gesagt werden.

Nur wenn die Strecke verhältnismäßig kurz ist und die höchsten Fließgeschwindigkeiten länger anhalten, kann man davon ausgehen, dass diese höchsten Fließgeschwindigkeiten ausschlaggebend sind. Ansonsten führt der Ansatz, in jeder Haltung die maximale Fließgeschwindigkeit bei Regenwetter anzusetzen, zu einer Überschätzung der tatsächlichen Fließzeit; als Hinweis kann der Ansatz allemal verwendet werden.

Offene Punkte

Absturz abfangen, wenn "fromnode" gleich ist "tonode"; passiert vermutlich nur, wenn Felder falsch befüllt worden sind (Fall 1203)

Absturz abfangen, wenn Fließgeschwindigkeit = 0 ist, aus welchem Grund auch immer (Fall 1203)

Listing

# ZEITNEHMUNG # ----------- import time # Startzeit festhalten; wird bei abschliessender Meldung verwendet: StartZeit = time.time() # DICTIONARY MIT HALTUNGEN ERSTELLEN # ---------------------------------- # Leeres Dictionary erstellen HaDict = {} # Zeile fuer Zeile durch Haltungen und an Dictionary anhaengen: HaZeilen = arcpy.SearchCursor('geschwindigkeit') HaZeile = HaZeilen.next() while HaZeile: HaDict[HaZeile.fromnode] = [HaZeile.tonode, HaZeile.shplength, HaZeile.velocity] HaZeile = HaZeilen.next() print 'Haltungen eingelesen.' print ' ' print 'Beginne mit dem Berechnen der Fliesszeiten zum jeweiligen Endpunkt...' # KNOTEN DURCHGEHEN UND FLIESSZEIT BERECHNEN # ------------------------------------------ # Update cursor erstellen # with statement bietet verbessertes error handling: KnoFelder = ('MUID','traveltime','endnode') with arcpy.da.UpdateCursor('fliesszeit',KnoFelder) as KnoZeilen: # Durch Knoten arbeiten for KnoZeile in KnoZeilen: # GesamtZeit initiieren: GesamtZeit = 0.0 # Start und Von mit KnoZeile[0], das ist die MUID, befuellen: Start = KnoZeile[0] Von = KnoZeile[0] # Wenn dieser Knoten kein Endknoten ist, dann findet er sich auch # als Schluessel im Dictionary HaDict: while Von in HaDict.keys(): # Jetzt kann man auch den Nach-Knoten holen, das ist das erste # Element in der Werteliste HaDict.get(Von) Nach = HaDict.get(Von)[0] # Die Zeit der Haltung ist die Laenge / Geschwindigkeit, also # der Quotient aus zweitem und dritten Element in HaDict.get(Von). # zusaetzlich Sekunden in Minuten umwandeln: HaZeit = (HaDict.get(Von)[1] / HaDict.get(Von)[2]) / 60.0 # GesamtZeit erhoehen: GesamtZeit = GesamtZeit + HaZeit # Von-Knoten mit Nach-Knoten belegen: Von = Nach # Wenn der Knoten hingegen ein Endknonten ist, soll der Nach-Knoten # so heissen, wie der Von-Knoten: else: Nach = Von print 'Knoten, Fliesszeit, Endpunkt: ' + Start, GesamtZeit, Nach # Jetzt wird Update-Funktionalitaet wirksam. # KnoZeile[1] ist das Feld "Abstand" KnoZeile[1] = GesamtZeit # KnoZeile[2] ist das Feld "Endknoten" KnoZeile[2] = Nach # Schreibt offenbar die Zeile: KnoZeilen.updateRow(KnoZeile) # Cursors soll man angeblich immer loeschen, um Sperren und Konflikte beim # Zugriff zu vermeiden. Unklar, ob das beim "with" noch erforderlich ist. del KnoZeilen, KnoZeile print ' ' print 'Berechnen der Fliesszeiten zum jeweiligen Endpunkt abgeschlossen.' print 'Bearbeitungsdauer [s]: ' + str(time.time() - StartZeit) print 'Vergessen Sie nicht, die Aenderungen zu speichern!'