Page Title

Benutzer-Werkzeuge

Webseiten-Werkzeuge


mikeplus:anleitungen:fliesszeitkarten

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_mup.py" im Abschitt Listing)

Zum Ausprobieren haben wir für Sie Beispieldaten vorbereitet.

Die folgende Anleitung erfordert gewisse Kenntnisse von ArcGIS und von MIKE+. 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+ und öffnen Sie das bestehende Projekt.

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

(1c) Laden Sie die Ergebnisdatei, wenn diese nicht sowieso automatisch geladen ist.

(1d) Erstellen Sie eine Ergebniskarte mit dem Ergebniselement "FlowVelocity".

(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) Beenden Sie MIKE+.

2. Daten zu ArcMap hinzufügen und kontrollieren

(2a) Starten Sie ArcMap.

(2b) Aus Ihrer MIKE+ Datenbank fügen Sie die Featureklassen "main.msm_Node" als Layer hinzu.

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

(2d) Kontrollieren Sie in der Attributtabelle, ob alle Fließgeschwindigkeiten (Spalte "TsValue") 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.

(2e) Falls die Attributtabelle kein Feld "Length" enthält, fügen Sie ein Feld mit dem Namen "Length" vom Typ Double hinzu. Öffnen Sie mit einem rechten Mausklick auf den Spaltenkopf das Kontextmenu, wählen Sie "Calcucate Geometry" und berechnen Sie die "Length".

3. Shape-Datei "fliesszeit.shp" erstellen

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

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

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

  • traveltime, Double
  • endnode, Text, 40 Zeichen

4. Führen Sie das Python-Script aus

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

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

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

(4c) 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.

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

(4e) 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.

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.

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

BerechneFliesszeit_mup.py
#   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.FromNodeID] = [HaZeile.ToNodeID, HaZeile.Length, HaZeile.TSValue]
    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!'
mikeplus/anleitungen/fliesszeitkarten.txt · Zuletzt geändert: 2023/11/23 16:17 von thomas