Giter Site home page Giter Site logo

nens / threeditoolbox Goto Github PK

View Code? Open in Web Editor NEW
7.0 16.0 4.0 275.68 MB

Plugin for working with 3Di models in QGIS

License: GNU General Public License v3.0

Makefile 0.14% Python 43.14% Shell 0.19% QML 56.51% Dockerfile 0.03%
3di water-management hydrology hydrologic-modeling subgrid netcdf

threeditoolbox's Introduction

3Di Results Analysis

A QGIS plugin for analyzing 3Di results and visualize computational grids in the 3Di Modeller Interface.

The tools that this plugin provides allow you to:

  • Make (maximum) water depth or water level rasters from raw 3Di simulation results.
  • Visualize results on the map canvas for a specific timestep
  • Plot timeseries of discharge, water level or any other variable in a graph
  • Make side view plots of water levels and water level gradients at any time during the simulation
  • Calculate the water balance for any given area in the model domain
  • Calculate aggregated results such as maximum water level per node or total discharge per flowline
  • Calculate the total discharge crossing a user-defined line
  • Find the upstream or downstream area for any node or group of nodes

Installation

Prerequisites

Windows

Install Qgis 3.28.5+ (the "long term release") from qgis.org.

Ubuntu

Install QGIS and the required python3-h5py dependency:

$ sudo apt install qgis python-h5py

Getting the plugin

  • In QGIS, goto "Plugins > Manage And Install Plugins... > Settings"
  • Add https://plugins.lizard.net/plugins.xml and reload
  • Install the plugin by selecting 3Di Results Analysis

Installation notes

If you have the PIP_REQUIRE_VIRTUALENV=1 setting you may have to (temporally) remove that in order to install the plugin, but be assured that all the required dependencies are bundled with the plugin and automatically installed into the deps directory of the plugin in your QGIS profile.

Local development

On Linux, local development happens with docker to make sure we're working in a nicely isolated environment. So first build the docker:

$ docker-compose build

The docker-qgis's settings are persisted in a "named docker volume", qgis-docker. To wipe it clean, run docker-compose down -v.

To run the full tests including coverage report and flake8:

$ docker-compose run -e QT_QPA_PLATFORM=offscreen qgis-desktop make test

You can also just run pytest. You won't get the coverage report. You can however then use one of the pytest options, like -x, which aborts the test at the first failure:

$ docker-compose run --rm qgis-desktop pytest -x

To get a "coverage" report for the docstrings or to run flake8:

$ docker-compose run --rm qgis-desktop make docstrings

To run black (standard pep8-compatible code formatting), isort (import sorting) and flake8 (reporting missing imports and so), run:

$ docker-compose run --rm qgis-desktop make beautiful

To run the QGIS application itself in the docker:

$ xhost +local:docker  # you may need this to run the gui
$ docker-compose run --rm qgis-desktop qgis

Release

Make sure you have zest.releaser with qgispluginreleaser installed. The qgispluginreleaser ensures the metadata.txt, which is used by the qgis plugin manager is also updated to the new version. To make a new release enter the following commands and follow their steps:

$ cd /path/to/the/plugin
$ fullrelease

This creates a new release and tag on github. Additionally, a zip file threedi_results_analysis.<version>.zip is created. Github actions is configured to also create this zip and upload it to https://plugins.lizard.net/ when a new tag is created, using the upload-artifact.sh script.

You can also manually create a zip file of the current checked out code with the following command:

$ docker-compose run --rm qgis-desktop make zip

threeditoolbox's People

Contributors

arjanverkerk avatar arnoldvantveld avatar bastiaan-roos avatar benvanbasten-ns avatar caspervdw avatar elisalle avatar emielverstegen avatar emile-debadts avatar geodin avatar hoanphungt avatar ivarlokhorst avatar jackieleng avatar jonasvsl avatar jsmits avatar larsclaussen avatar ldebek avatar leendertvanwolfswinkel avatar martijn-siemerink avatar nils-smits avatar overmeen avatar patrick-nijman avatar reinout avatar richardb9 avatar woutervanesse avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

threeditoolbox's Issues

RFC results on the map view functionality

In the current version, there is a experimental version which shows results on the map. This RFC shows what is required to finalize this function

User functionality

Flow for the user:

  1. User switch on the map animation functionality
  2. Through a popup the user selects: parameter + function for nodes and for links
  3. on closing the popup, the result layers are showed (in the 'tool' folder of the model legend map. There are 2 time indicators, one for nodes and one for links (in case an aggregation is selected and so the time steps)
  4. when moving one of the time sliders, the other one is also moving to the nearest available time-step
  5. There is a button setting the scalling features (rescale now based on ..., auto-rescale, select min and max). In this popup also a color ramp can be selected.

functions are:

  • current value
  • relative to initial value
  • water depth (water level minus bottom level)
  • absolute value
  • relative to previous time step

Todos:
[] popup for selection of parameter and function
[] function support for layer visualization
[] initialization of layers in correct legend folder
[] Time identification for nodes and links, linked to time slider
[] popup for legend scalling functions
[] legend scalling functions

get_timeseries multiple parameters

get_timeseries in datasource can accept a list of parameters, the resulting time series of those multiple parameters are then concatenated into one big list and returned. This can make things very error prone because the returned time series can be a mix of multiple parameters.

Solution: make get_timeseries accept only one parameter so that the time series that is returned is not ambiguous. This also requires changes in e.g. view/graph.py, etc.

Programma flow en leidende bestanden

Omschrijving probleem
De plugin gaat uit van de volgende 3 bronbestanden:

  • 1: Model Spatialite (note: later kunnen we ook de Turtle database hiervoor gaan ondersteunen);
  • 1 of meerdere Resultaten NetCDF's (note: later mogelijk ook de aggregatie netCDF's ondersteunen);
  • id_mapping file behorende bij de NetCDF (note: zou mooi zijn als deze wordt opgenomen in de resultaten netCDF).

Deze bestanden bevatten deels dubbele informatie. De vraag is welk bestand leidend is voor welke onderdeel en hoe we dit verwerken in een logische 'programma' flow.

Overwegingen

  • De sideview tool moet ook bruikbaar zijn op het model, zonder een resultaat. Niet alle informatie is aanwezig in de netCDF, een combinatie is hier dus nodig van Spatialite en informatie uit de NetCDF.
  • Grafieken ondersteund meerdere netCDF's tegelijk. Uitgangspunt dat we voorlopig hierbij kunnen aanhouden is dat het model gelijk is. In principe is de informatie in de (nieuwe) netCDF voldoende, maar voor oudere resultaten is ondersteuning van geometrien vanuit de spatialite ook wenselijk
  • De statistieken tool heeft genoeg aan alleen de netCDF resultaten. Deze worden vervolgens gekoppeld aan of de spatialite of de geometry die gegenereerd is uit de netCDF.

Uitwerking

spatialite <-> sqlite

utils/threedi_database.py uses sqlite as keyword for identifying the database type, while spatialite may be more appropriate in QGIS. Case in point: the vector layer uses spatialite as identifier for the data provider. As a result of this design choice, a lot of back and forth converting is done when using ThreediDatabase. For an example, see: #97

[RFC] breach location tooling

Enhancement existing tools

Implement re-run command [2 days]

As of now the tool predict_calc_pnts will populate the tables 'v2_calculation_point' and 'v2_connected_pnt' only once. Upon a second execution the tool will give an error. Therefore users manually have to delete the existing entries before running the tool again. This of course can be automated but clearly needs a warning before deleting the entries because all manually edited entries will be lost then.

Add a second entry to the 'v2_connected_pnt' table for double connected points [0.5 days]

Connected points that are derived from 1D objects with a calculation type "double connected" should be generated in twofold (at the moment only one point will be produced).

New tools

Add a tool to automatically move connected points across a levee [7 days]

Users need to move the generated connected points to the desired location manually at the moment. For parts of their model it is desired to automate this operation. The following requirements apply:

  • the user must be able to set a maximum search distance in which a levee must be encountered
  • the user must be able to select a subset of connected points which should be moved
  • the search algorithm must be able to distinguish between single and double connected points
  • for single connected points the search should be considered successful after the intersection with a levee at a minimum distance
  • for double connected points the search must be performed on both sides of the channel. The search direction must be vertical to the channel geometry (~avg 5 meters at the given location?). If the channel is being crossed a warning must be issued.

opening up a second sideview

Traceback (most recent call last):
File "C:/Users/ber.albers/.qgis2/python/plugins\threedi-qgis-plugin\threedi_sideview.py", line 101, in run
window.tabifyDockWidget(self.dock_widgets[0], new_widget)
RuntimeError: wrapped C/C++ object of type SideViewDockWidget has been deleted

Sideview for systems with embedded 1d elements

The sideview does not work with 1d systems with embedded elements (for example the model \rotterdam\archive\lombardijen_8_hybrid_rainevent_23june2016_lom).

On generation of the graph layer, the error is:

file \views\sideview.py, line 1249,in create_comined_layers
for line in channel_calc_points[channel['id']]:
KeyError: XX

remove netcdf cause error

• Als ik een netcdf verwijder terwijl ik alles leeg heb gegooid in mijn Layers Panel, krijg ik de volgende Python error:

image

o Als ik daarna een nieuw bestand inlaadt, zowel sqlite als netcdf krijg ik weer een python error:
o Ik krijg nu niet meer de Animatie aan. Hij maakt niet opnieuw de line_results en node_results lagen aan. Moet ik hiervoor altijd QGIS opnieuw opstarten?

v2_pipe_view in plugin = broken

  • v2_pipe_view toont geen leidingen op de kaart, oorzaak verkeerde naamgeving in de opmaak-file sewerage_type -> pipe_sewerage_type

On calc_structure_statistics.py and calc_manhole_statistics.py error

Traceback (most recent call last):
File "C:/Users/ber.albers/.qgis2/python/plugins\threedi-qgis-plugin\threedi_toolbox.py", line 144, in run_script
mod = imp.load_source(name, module_path)
File "C:/Users/ber.albers/.qgis2/python/plugins\threedi-qgis-plugin\commands\toolbox_tools\stap 5 - Resultaten nabewerken\calc_structure_statistics.py", line 8, in
from ThreeDiToolbox.stats.ncstats import NcStats
File "C:/PROGRA1/QGISWI1/apps/qgis-ltr/./python\qgis\utils.py", line 478, in _import
mod = _builtin_import(name, globals, locals, fromlist, level)
ImportError: No module named ThreeDiToolbox.stats.ncstats

segfault related to stats

To reproduce:

  1. Click on selecteer 3di resultaten and select a spatialite and netCDF file. Click yes when prompted to generate stats.
  2. Remove the root group layer in the layer panel (3di model: ...). This generates a segmentation fault.

import sufhyd key error

Bij import sufhyd van Velsen L:\Extern\Projecten R (2016)\R0122 - BRP gemeente Rijnwaarden\Gegevens\Aangeleverd\20160721 Aanlevering Riool enzo\Rijnwaarden.hyd kreeg ik een error. In getType lijkt het mis te gaan, de key kan soms None zijn. Ik weet niet genoeg hierover om te zeggen wat het gewenste gedrag moet zijn. Er is wel een stukje uitgecommentarieerd in de code eromheen die lijkt om te gaan met deze situatie:

    @classmethod
    def getType(cls, key):
        # todo: create short keys at class creation to improve speed
        shortKey = cls.shortSufHydKey(key)
        # if shortKey is not None:
        return cls.types[shortKey]
        # else:
        #    return (str, len(key))
KeyError: None 
Traceback (most recent call last):
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/views/import_sufhyd_dialog.py", line 129, in on_accept
    self.command.run_it(self.filename, db_set, settings['db_type'])
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/commands/toolbox_tools/stap 2 - Data conversie en inlezen/import_sufhyd.py", line 59, in run_it
    importer.run_import()
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/import_sufhyd.py", line 94, in run_import
    data = self.load_sufhyd_data()
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/import_sufhyd.py", line 143, in load_sufhyd_data
    unused_fields = reader.parse_input()
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/importer/sufhyd.py", line 182, in parse_input
    for obj in self.get_hydro_objects():
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/importer/sufhyd.py", line 146, in get_hydro_objects
    return hydrofact.hydroObjectListFromSUFHYD(self.content_string, self.log)
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/importer/turtleurbanclasses.py", line 913, in hydroObjectListFromSUFHYD
    result = [self.hydroObjectFromSUFHYD(i, strict) for i in re.split('[\n\r]+', input) if i]
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/importer/turtleurbanclasses.py", line 899, in hydroObjectFromSUFHYD
    {'line': fieldwise(tryingClass, persid)})
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/importer/turtleurbanclasses.py", line 51, in fieldwise
    for length in [obj.getType(k)[1] for k in obj.field_names]:
  File "/home/jackieleng/.qgis2/python/plugins/ThreeDiToolbox/utils/importer/turtleurbanclasses.py", line 244, in getType
    return cls.types[shortKey]
KeyError: None


Python version: 2.7.6 (default, Oct 26 2016, 20:33:43) [GCC 4.8.4] 
QGIS version: 2.14.9-Essen Essen, exported 

Python Path:
/home/jackieleng/git/ThreeDiToolbox/external
/home/jackieleng/.qgis2/python/plugins/processing
/usr/share/qgis/python
/home/jackieleng/.qgis2/python
/home/jackieleng/.qgis2/python/plugins
/usr/share/qgis/python/plugins
/usr/local/lib/python2.7/dist-packages/distribute-0.7.3-py2.7.egg
/usr/lib/python2.7
/usr/lib/python2.7/plat-x86_64-linux-gnu
/usr/lib/python2.7/lib-tk
/usr/lib/python2.7/lib-old
/usr/lib/python2.7/lib-dynload
/usr/local/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages
/usr/lib/python2.7/dist-packages/PILcompat
/usr/lib/python2.7/dist-packages/gtk-2.0
/usr/lib/pymodules/python2.7
/usr/lib/python2.7/dist-packages/ubuntu-sso-client
/home/jackieleng/.qgis2//python
.
/usr/share/qgis/python/plugins/fTools/tools

Predic_calculation_points werkt niet op DB

File "C:\Users\evelyn.aparicio.qgis2\python\plugins\ThreeDiToolbox\external\sqlalchemy\engine\default.py", line 385, in connect
return self.dbapi.connect(*cargs, **cparams)
File "C:\PROGRA1\QGIS21.14\apps\Python27\lib\site-packages\psycopg2_init_.py", line 164, in connect
conn = _connect(dsn, connection_factory=connection_factory, async=async)
OperationalError: (psycopg2.OperationalError) could not translate host name "nens-3di-db-03.nens.local " to address: Unknown

Melding als NetCDF niet meer ingeladen kan worden

Bij inladen van een grafiek/animatie als verbinding verbroken is met de NetCDF verschijnt deze melding:
Wens is om een betere melding te krijgen, zodat mensen snappen dat ze hem opnieuw moeten inladen.

An error has occurred while executing Python code:

RuntimeError: Invalid argument

Traceback (most recent call last):
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\views\graph.py", line 242, in on_insert_locations
self.current_parameter['parameters'], index))
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\models\graph.py", line 99, in plots
result_ds_nr=result_ds_nr)
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\models\graph.py", line 124, in timeseries_table
fill_value=np.NaN)
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\datasource\netcdf.py", line 550, in get_timeseries
vals = ds.variables[variable][:, netcdf_id]
File "netCDF4_netCDF4.pyx", line 3634, in netCDF4._netCDF4.Variable.getitem (netCDF4_netCDF4.c:37084)
File "netCDF4_netCDF4.pyx", line 4326, in netCDF4._netCDF4.Variable._get (netCDF4_netCDF4.c:46971)
RuntimeError: Invalid argument

Waterlijn in sideview minimaal op de bodem

Momenteel wordt er een rechte lijn getrokken tussen de waterstanden op de rekenpunten. Gebruikers hebben de wens geuit om dit 'realistischer' te tonen en bijvoorbeeld bij valputten de buis bodem aan te houden als minimum.

calculation and origin of stats

There is little documentation on how statistics are calculated and from what sources they come from (netCDF or agg. netCDF?). Maybe we should include more documentation (wiki?), or make things more explicit.

Add extra model views

CREATE VIEW v2_1d_lateral_view AS
SELECT a.*, b.the_geom
FROM v2_1d_lateral a
JOIN v2_connection_nodes b ON a.connection_node_id = b.id;

And maybe:

  • pumpstations_beginpunt (pumpstation_point_view)
  • 1d_bounday_conditions (1d_boundary_conditions_view)

FO werken met resultaten

Werken met resultaten
Voor het werken van resultaten zijn de onderstaande tools gewenst in een GIS achtige omgeving, zodat de modelleur naast deze tools ook 'standaard' functionaliteiten kan gebruiken. De optionele functionaliteiten staan tussen haakjes.

A1) Opvragen van een grafiek bij objecten (leidingen, watergangen, putten, kunstwerken, etc.). Er is momenteel een tool die dit kan, als de resultaten zijn ingelezen in een spatialite. Deze heeft beperkte gebruiksmogelijkheden (een tijdserie per grafiek, opent in apart window). De volgende verbeteringen worden voorgesteld:

  • Lezen van resultaten direct uit NetCDF
  • Meerdere tijdseries in een grafiek
  • Resultaten uit verschillende scenarios (netCDF’s) in een grafiek
  • Data uit grafiek kunnen exporteren naar csv en als PNG
  • Interne deployment (nog een onzekerheid, maar Reinout heeft hier ervaring mee)
  • Grafieken laten zien van watergangen
  • Grafieken laten zien van 1d-2d uitwisselingspunten en van de 2d reken nodes en links
  • (Aangeven van een aantal eigenschappen in de grafiek, zoals putbodem en maaiveld hoogte)
  • (Afgeleiden tonen zoals drooglegging of water op straat)
  • (Grafiek configuratie opslaan en weer kunnen laden)

A2) Afleiden van bepaalde statistieken uit resultaten en deze toevoegen aan de spatialite, zodat deze op de kaart kunnen worden getoond. Momenteel heeft Arnold hiervoor scripts. Als de resultaten niet meer ingelezen hoeven te worden in de spatialite, dan moeten deze met behulp van een script berekend worden. Hierin moeten ook de extra openwater resultaten (rekeninhouden met rekenpunten) worden meegenomen. Het gaat hierbij om de volgende afgeleiden (er worden nog een aantal extra eigenschappen bepaald, maar deze kunnen worden afgeleid uit onderstaande plus de eigenschappen van objecten):

  • Totaal verpompt volume op een aantal momenten
  • Waterstand in de leidingen op een aantal momenten
  • Duur water op straat
  • Maximale waarden
  • Moment van bereiken maximale waarden
  • Minimale waarden
  • Bereiken minimale waarden
  • Overstort volume (positief en negatief)

A3) Sideviews voor 1d elementen. Het kunnen selecteren van twee connection nodes (putten) en de route hiertussen kunnen bekijken in een sideview. De waterstanden (resultaten) kunnen vervolgens worden bekeken op een opgegeven moment (en mogelijk zelfs worden geanimeerd. Tool bestaat uit het volgende:

  • Selecteren twee punten en bepalen route tussen twee punten
  • Tonen van sideview, inclusief leiding, put, watergang en kunstwerk eigenschappen
  • Tonen van waterstanden op tijdstippen
  • (ook tussenpunt kunnen toevoegen)
  • (sideview kunnen animeren)
  • (Meerdere sideviews boven elkaar laten zien)
  • (Statistieken in sideview laten zien (maximale waterstand))
  • (Maaiveld boven leiding, watergang tonen)
  • (Water op maaiveld laten zien)
  • (sideview voor 2d)

A4) Resultaten op de kaart tonen op basis van gekozen tijdstip. Op basis van een gekozen tijdstip worden de waarden op de kaart getoond (bijvoorbeeld met slider). Deze kunnen ook worden geanimeerd (nog nader uitwerken).

A5) 2d resultaten naverwerken, inclusief interpolatie (kijken of echt noodzakelijk, nog verder uitwerken)

  • Op basis van DEM en resultaten op 2d rekencellen een geïnterpoleerd kaartbeeld berekenen.
  • (punt op de kaart kunnen selecteren en hier een grafiek in de tijd, inclusief maaiveld van zien of direct de waterdiepte)

bug project path

Bug van Arnold:

Deze melding krijg ik als ik een lokale QGIS file opstart (zonder resultaten):

ValueError: no path specified

Traceback (most recent call last):
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\utils\qprojects.py", line 254, in save_setting_to_project
value = self._get_relative_path(value)
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\utils\qprojects.py", line 153, in _get_relative_path
rel_path = os.path.relpath(file_path, home)
File "C:\OSGEO4~1\apps\Python27\lib\ntpath.py", line 498, in relpath
raise ValueError("no path specified")
ValueError: no path specified

toolbox widget uifile inconsistency

Opening threedi_toolbox_dockwidget_base.ui in Qt designer gives this error/warning:
Attempt to add a layout to a widget 'Form' (QDockWidget) which already has an unmanaged layout of type QDockWidgetLayout. This indicates an inconsistency in the ui-file.
The file also doesn't have the correct layout in Qt designer.

However, using the file in the code itself doesn't seem to give any problems. It's probably a good idea to recreate the file using Qt designer so we can edit it again in Qt designer.

Prevent wrong model / results combination

When switching and loading models using the result dialogue people often forget they're still in the old directory and will often just click on load and on e.g. 'subgrid_map.nc', and unknowingly loading an incorrect model-datasource combination. It might be helpful to analyse the path of the files and give a warning when loading from very different paths.

LOW PRIO.

import_sufhyd aansluiten op nieuwe db schema

import_sufhyd crasht omdat het "nieuwe" code veld niet wordt ingevuld door de plugin.
De plugin maakt echter wel, net als vroeger, het veld _code aan.
Lijkt me netter als dit veld verdwijnt als het wordt geupdate

An error has occurred while executing Python code:

IntegrityError: (psycopg2.IntegrityError) null value in column "code" violates not-null constraint DETAIL: Failing row contains (1, 1, 5.0, null, null, rectangle_w5.0_open). [SQL: 'INSERT INTO v2_cross_section_definition (width, shape, _code) VALUES (%(width)s, %(shape)s, %(_code)s)'] [parameters: ({'width': 5.0, 'shape': 1, '_code': 'rectangle_w5.0_open'}, {'width': 6.0, 'shape': 1, '_code': 'rectangle_w6.0_open'}, {'width': 2.3, 'shape': 1, '_code': 'rectangle_w2.3_open'})]

[RFC] Statistieken versnellen

Probleem

De statistieken zijn nu erg traag. Er wordt door de features van de lagen gelooped en iteratief statistieken berekend, wat traag is in Python.

Voorstel oplossing

Maak gebruik van Numpy gevectoriseerde operaties om de statistiekoperaties te versnellen. De vereist een andere opzet t.o.v. hoe het nu is geimplementeerd. I.p.v. iteratief per feature de statistieken te berekenen, moet dan een statistiek van te voren voor alle features worden berekend (gebruikmakend van de snelle vector operaties die werken op gehele arrays). Als eenmaal zo'n array met een bepaald statistiek is berekend, is het een kwestie van de statistiekwaarde toewijzen naar een bepaalde feature ID.

Close side-view by clicking x

Traceback (most recent call last):
File "C:/Users/ber.albers/.qgis2/python/plugins\threedi-qgis-plugin\views\sideview.py", line 708, in closeEvent
self.on_close()
File "C:/Users/ber.albers/.qgis2/python/plugins\threedi-qgis-plugin\views\sideview.py", line 701, in on_close
QgsMapLayerRegistry.instance().removeMapLayer(self.vl_tree_layer)
TypeError: QgsMapLayerRegistry.removeMapLayer(QString): argument 1 has unexpected type 'QgsVectorLayer'

refactor customcommandbase

Is too confusing with 3 abstract methods

Or at least use better names:
run_it should be run_headless or run_without_gui

Initieel technisch ontwerp

Samenvatting functionele behoefte
Om goed met 3di te kunnen werken heeft de (interne) 3di modelleur behoefte aan tools voor:

  1. Resultaten bekijken en verwerken;
  2. Maken van model en controle van data en schematisatie.

Voor beide handelingen is een basic opzet aanwezig en aangevuld met queries van modelleurs kunnen deze taken (moeizaam) worden uitgevoerd. Betere tools, met name rond het werken met resultaten, zijn noodzakelijk. Ook is er nog geen ondersteuning voor openwater schematisaties.
Voor het maken van modellen is het ideaal een standaard werkwijze met stappenplan en ondersteunende tools in de vorm van een toolbox (zoals we vroeger hadden voor Sobek modellen), het huidige werken met tools (queries) is vrij technisch en er zijn veel versies van (door modelleurs ontwikkelde) queries.
De gewenste functionaliteiten zijn voor de modelleur/ hydroloog, een specialist die een unieke rol heeft bij het begin en eind van de zogenaamde modellentrein, zie het volgende figuur. Bij het begin (modellen maken en aanpassen) en het eind (analyse en naverwerking) is vrijheid en flexibiliteit gewenst.

image

In de memo ‘Tools voor 3di modelleurs – 8 maart 2016’ is de functionele behoefte verder uitgewerkt. De eerste prioriteit ligt in het werken met 3di resultaten voor versie 2 (zowel riolering als oppervlaktewater).

Technische uitwerking
Het volgende moet duidelijk worden om een technische lijn uit te zetten voor de ontwikkeling van tools voor de 3di modelleur:

  1. Op welk ‘systeem’ bouwen we de ondersteunende tools;
  2. Hoe verhouden de tools zich tot de andere systemen in het 3di landschap;
  3. Wat zijn de (technische/ kwaliteits) eisen/ uitgangspunten die we aanhouden bij de ontwikkeling.

Keuze van het systeem waarbinnen de tools worden ontwikkeld
We hebben de volgende ‘logische’ mogelijkheden voor de ontwikkeling van de tools. Per mogelijkheid staan ook de voordelen en nadelen genoemd. De mogelijkheden zijn:
1. Bouw in Lizard (of site op basis van de Lizard backend):

  • + bestaand platform waarop veel kennis aanwezig is binnen N&S. Tevens B&O en support geregeld;
  • + synergievoordelen. Nieuwe functionaliteiten kunnen direct breder worden ingezet.
  • +/- bestaande functionaliteiten kunnen hergebruikt worden. Data is al aanwezig en functionaliteiten rond 2d resultaten komen eraan. 1d resultaten nog niet ondersteund. De wensen van modelleurs zijn waarschijnlijk wel te specialistisch voor wat we met Lizard willen ondersteunen.
  • – Te weinig flexibel voor de beoogde doelgroep (specialisten)
  • – Met name geschikt voor resultaten, niet voor het interactief maken van modellen.

2. Ontwikkeling in een 3di-turtle-server (combinatie PostGIS/ scripts via API eventueel met beperkte QGIS plugin):

  • + bestaand platform binnen N&S. Kennis aanwezig, zeker met bewerkingen met PostGIS databases (queries, etc.)
  • + Door link me QGIS (via standaard PostGIS link) veel andere tools beschikbaar – gewenste flexibiliteit binnen handbereik.
  • + PostGIS wordt momenteel al gebruikt door (interne) modelleurs.
  • + Meer code herbruikbaar (ook als bijvoorbeeld iets via ArcGIS moet gaan werken).
  • – voor QGIS plugin deel nog weinig ervaring
  • – Installatie van een Ubuntu server noodzakelijk (verbinding of via internet of installatie lokaal)
  • – Geen infrastructuur aanwezig voor resultaten, moet ontwikkeld worden (link met Lizard?).

3. Plugin in QGIS (gebruikmakend van lokale bestanden: spatialite en netCDF’s):

  • + QGIS wordt veel gebruikt door de (interne) modelleurs. Door volledige integratie in QGIS kan de beste ‘user experience’ worden geleverd.
  • + er zijn veel andere tools beschikbaar in QGIS, waarmee de gewenste flexibiliteit wordt bereikt.
  • + (en een beetje -) Model en resultaten kunnen met allerlei andere data worden gecombineerd, de gebruiker is zelf de baas over de (model en resultaten) bestanden. Verantwoordelijkheid over data/ resultaten beheer kan bij gebruiker worden gelegd.
  • + de tool kan ‘offline’ worden gebruikt (voordeel in buitenland).
  • + naast QGIS hoeft er niks/ weinig worden geïnstalleerd. Daarmee laagdrempelig t.o.v. gebruik PostGIS.
  • – nieuw platform. Als Nelen & Schuurmans hebben we hier weinig ervaring mee. Vraag is hoe snel we opgang zijn met ontwikkeling en of we een schaalbare architectuur kunnen vinden.
  • – Er zal relatief weinig code herbruikbaar zijn (alleen via copy-paste).
  • – distributie. De plugin wordt op elke computer geïnstalleerd, dit mag niet te veel werk/ ondersteuning met zich meebrengen.
  • – support. Installatie is decentraal, daardoor lastiger bij problemen op te lossen.

Vanuit de modelleur gezien is een integratie van de tools in QGIS, de omgeving waarin ze vaak werken, het meest ideaal. Optie 1, Lizard, valt hierdoor (voorlopig) af. We zien wel een mogelijkheid met integratie van een resultaten database, waarbij resultaten uit de lizard-backend worden geserveerd (via WMS/ WFS) of worden gedownload vanuit Lizard naar QGIS.

Vanuit de gebruiker is optie 3 het meest ideale. Met name voor de resultaten is het handig als iemand de resultaten in QGIS kan gebruiken en zijn model (beperkt) kan bewerken, zonder dat hiervoor zware installaties nodig zijn. Zo kunnen we klanten resultaten meegeven, die ze zelf nog kunnen bekijken en verwerken.

Optie 2 blijft een goede optie voor de (zwaardere) en geavanceerdere bewerkingen bij het model maken. Deze worden alleen maar uitgevoerd door degene die nieuwe modellen opzetten, en dit is maar een (deel) van de modelleurs. Een link naar/ opzetten van een Ubuntu server met PostGIS is in dat geval te rechtvaardigen.

Voor het werken met resultaten (de eerste stap in onze ontwikkelingen) is ons voorstel om – onder voorbehoud dat we een paar minpunten kunnen ondervangen - optie 3 te kiezen, een volledige QGIS plugin, gebruik makend van de spatialite en netCDF bestanden.

Pilot

Succes is afhankelijk in hoeverre we goed met de minpunten kunnen omgaan. Om dit uit te zoeken hebben we tijd besteed aan het opzetten van onze eerste opzet van 3 tools (grafieken, sideview, naverwerkings tool). Onze ervaringen hierbij waren:

Nieuw platform:

  • Voor QGIS interface onderdelen moet je een steile leercurve door. Het interface platform QT waarop QGIS is gebaseerd (1) kan veel, (2) is erg C++ georiënteerd, (3) maar er zijn genoeg voorbeelden te vinden (kwestie van veel Googlen).
  • Voor een schaalbare opzet moet een MVC opzet worden gehanteerd. Het is gelukt om deze structuur binnen de gestelde termijn op te zetten. De code blijft daardoor overzichtelijk (en daarmee waarschijnlijk schaalbaar).
  • QGIS onderdelen zijn minder goed gedocumenteerd, zeker als bijzondere functies nodig zijn. Het lezen van de c++ source code helpt in deze gevallen (het is opensource software, dus dit kan!).
  • Er kunnen op deze manier heel gebruiksvriendelijke tools worden gemaakt (in een specialistische omgeving met veel knoppen) die de modelleur bij zijn werk kan ondersteunen.
  • Herbruikbaarheid van code is inderdaad zeer beperkt, omdat door de lokale distributie het gebruik van (externe) pakketten lastiger wordt.

Distributie:

  • Hier was al ervaring mee binnen N&S voor een grondwater tool. De afhankelijkheid van een gecompileerde C++ binding (voor netCDF4) was een mooie use-case onder Windows. Het is gelukt om deze mee te leveren bij de installatie, waardoor de installatie binnen een minuut te doen is.

Support:

  • Dit moeten we duidelijk aangeven in readme/ disclaimer/ about. Geen garantie op ondersteuning (tenzij je ervoor betaald natuurlijk). Verder is het opensource, dus iedereen kan altijd een pull request maken met een bug-fix.

Op basis van deze bevindingen willen we voor het resultaten deel voorlopig doorgaan met optie 3 (waarbij we met 2d resultaten kijken hoe we kunnen aansluiten bij Lizard) en zodra we gaan kijken naar tools voor model ontwikkeling zullen we ook optie 2 bekijken (Postgis + tools op Ubuntu server).

Verhouding met andere tools

Zie het volgende figuur. Er is een overlap met 3di-Turtle, spatialite en de model generatie scripts (afstemming erg belangrijk + nadere afspraken over wie waarvoor verantwoordelijk is). Belangrijk overdrachtspunt is de modellendatabase.

plaatje

Aan de resultaten kant zullen de resultaten gedownload worden van de FTP server of uit Lizard (resultaten database). In eerste instantie zullen we vooral de bestanden downloaden, maar integratie met de back-end van Lizard ligt voor de hand en is ook wenselijk. Stap 1 zou zijn een selectie en download, stap 2 het gebruiken van de 2d resultaten en mocht het beschikbaar komen kan ten slotte ook de 1d resultaten ‘gestreamd’ worden naar de QGIS plugin. Afstemming en integratie dus ook aan deze kant.

Omdat er gebruik wordt gemaakt van resultaten zal afstemming over wegschrijven van resultaten, metadata, etc ook nodig zijn.

Technische eisen en uitgangspunten bij ontwikkeling

Functioneel-Technisch:

  • Installatie is binnen 5 minuten te doen. Een update binnen een minuut.
  • Te gebruiken (en getest) onder Windows (7 +10) en Ubuntu.
  • Support/ getest onder de laatste LTS en laatste versie (momenteel 2.08 en 2.14)

Data bestanden en omliggende systemen:

  • Voor resultaten nemen we de netCDF’s en Spatialite als uitgangspunt
  • In de spatialite komen geen resultaten (die linken we bijvoorbeeld via een csv of iets dergelijks). In de spatialite komen eventueel wel resultaten van model checks.
  • Voor werken met datasets worden zoveel mogelijk abstractie lagen gebruikt (datasources), zodat we in de toekomst goed kunnen switchen van bron (bijvoorbeeld naar Lizard data of van de spatialite naar PostGIS).
  • .....

Code/ ontwikkeling:

  • Opbouw code volgens Models en views, gebruikmakend van signals om interacties te linken.
  • Alle onderdelen die communiceren met de 3di data bestanden moeten voorzien zijn van unit-test, zodat we kunnen garanderen dat de juiste data wordt gebruikt. Voor de interface onderdelen wordt een testplan opgesteld, die handmatig wordt doorlopen.
  • Docstrings google style

Vervolgstappen

  • Technische eisen en uitgangspunten nog verder uitwerken en categoriseren
  • Figuur toevoegen met links naar andere systemen
  • Ontwerp laten reviewen door WOM.
  • De eerste 3 tools afmaken en intern laten gebruiken.
  • Code structuur zelf reviewen en verbeteren op basis van ervaring na eerste fase.
  • TO updaten.
  • Wensen rond netCDF's en Lizard resultaten database overleggen en vastleggen in een RFC
  • Code en geupdate TO laten reviewen door WOM
  • Ontwerp maken voor de eerst volgende tools en budget regelen

channel_mapping is incorrect

These mappings can have duplicate keys, because a spatialite element with a certain id can be split in multiple links by grid generation. So it's incorrect to do: dict(channel_mapping)

also check: node_mapping

pumpstation_point_view for statistics

Pump view does not contain all pumps, pumplines does, but doesn't have access to the pump attributes.

Consider a making a new layer using the pumpstation table (which should contain all pumps) using only the first pump node (thus making it a point layer).

[RFC] Statistics

Stats Changes

The stats module supports generating the following variables:

Using flow_aggregate.nc:

================ ================ =========================== ==============================
Variable Layer type Required parameter/field Information
================ ================ =========================== ==============================
q_cum structures Net Volume across flowline structures
q_cum_positive structures/pipes Total volume across flowline in positive drawing direction (ie. overstortvolume)
q_cum_positive structures/pipes Total volume across flowline in negative drawing direction (ie. overstortvolume)
q_max structures/pipes Maximum discharge across flowline (max discharge at strucutre)
q_min structures Minimum discharge across flowline (min discharge at strucutre)
s1_max manholes surface_level WOS height -> s1_max - surface_level
s1_max manholes Maximum waterlevel at manhole
s1_max manholes Maximum waterdepth -> s1_max - bath (Check whether we write this to flow_aggregate.nc)
q_pump_cum pumps Total volume pumped by pump
================ ================ =========================== ==============================

Using subgrid_map.nc:

======================= ============== ============================= =============================================================
Variable Layer type Required parameter/field Calculation method
======================= ============== ============================= =============================================================
q_end structures
s1_end manholes
======================= ============== ============================= =============================================================

Important note: When ther is no aggregation netcdf we do not calculate statistics. Only exception can be flow variables at end of simulation (q_end and s1_end.)

import_sufhyd werkt niet

import_sufhyd geeft deze melding bij het starten:
ImportError: No module named utils.threedi_database

Traceback (most recent call last):
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\threedi_toolbox.py", line 148, in run_script
mod = imp.load_source(name, module_path)
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\commands\toolbox_tools\stap 2 - Data conversie en inlezen\import_sufhyd.py", line 7, in
from ThreeDiToolbox.views.import_sufhyd_dialog import (
File "C:/OSGEO41/apps/qgis-ltr/./python\qgis\utils.py", line 572, in _import
mod = _builtin_import(name, globals, locals, fromlist, level)
File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\views\import_sufhyd_dialog.py", line 10, in
from utils.threedi_database import get_databases
File "C:/OSGEO4
1/apps/qgis-ltr/./python\qgis\utils.py", line 572, in _import
mod = _builtin_import(name, globals, locals, fromlist, level)
ImportError: No module named utils.threedi_database

predict_calc_points werkt niet met embedded channels

Vul je geen dist_calc_points in (logisch voor een embedded kanaal) dan geeft hij terug, kan niet NULL zijn

2016-10-27T16:37:59 1 Traceback (most recent call last):
File "C:/Users/ber.albers/.qgis2/python/plugins\ThreeDiToolbox\views\predict_calc_points_dialog.py", line 82, in on_accept
self.command.run_it(db_settings, db_type)
File "C:/Users/ber.albers/.qgis2/python/plugins\ThreeDiToolbox\commands\toolbox_tools\stap 3 - Schematisatie bewerken\predict_calc_points.py", line 54, in run_it
pal.build_calc_type_dict(epsg_code=epsg_code)
File "C:/Users/ber.albers/.qgis2/python/plugins\ThreeDiToolbox\utils\predictions.py", line 262, in build_calc_type_dict
line_length / (dist_calc_points * 1.0))
TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'

Vul je 100 in dan zegt ie:

2016-10-27T16:43:20 1 Traceback (most recent call last):
File "C:/Users/ber.albers/.qgis2/python/plugins\ThreeDiToolbox\views\predict_calc_points_dialog.py", line 82, in on_accept
self.command.run_it(db_settings, db_type)
File "C:/Users/ber.albers/.qgis2/python/plugins\ThreeDiToolbox\commands\toolbox_tools\stap 3 - Schematisatie bewerken\predict_calc_points.py", line 54, in run_it
pal.build_calc_type_dict(epsg_code=epsg_code)
File "C:/Users/ber.albers/.qgis2/python/plugins\ThreeDiToolbox\utils\predictions.py", line 328, in build_calc_type_dict
entry_end, calc_type, object_id, name
File "C:/Users/ber.albers/.qgis2/python/plugins\ThreeDiToolbox\utils\predictions.py", line 378, in _elect_new_leader
unranked_calc_types, key=constants.CALC_TYPE_RANKING.index
ValueError: tuple.index(x): x not in tuple

animatie werkt niet goed voor alle variabelen die je kan kiezen

  • veranderen van waterlevel naar infiltration_rate geeft deze melding (animatie):
    IndexError: index 33247 is out of bounds for axis 0 with size 33247
    Traceback (most recent call last):
    File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\views\map_animator.py", line 94, in on_node_parameter_change
    self.update_results()
    File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\views\map_animator.py", line 223, in update_results
    value = values[ids - 1]
    IndexError: index 33247 is out of bounds for axis 0 with size 33247

  • discharge_pump in drop-downbox in animatie geeft:
    IndexError: index 8 is out of bounds for axis 0 with size 8
    Traceback (most recent call last):
    File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\views\map_animator.py", line 86, in on_line_parameter_change
    self.update_results()
    File "C:/Users/Arnold.vantveld/.qgis2/python/plugins\ThreeDiToolbox\views\map_animator.py", line 223, in update_results
    value = values[ids - 1]
    IndexError: index 8 is out of bounds for axis 0 with size 8

pumpstation show both discharge and discharge_pump in graph

When I select discharge_pump I see what I would expect (only the values for the pumpstation). However, when I select discharge I see an apparently random discharge where I would expect to see nothing for the pumpstation (because a pumpstation should only shows discharge_pump).

Discharge_pump:
image

Discharge van pump en culvert:
image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.