diff --git a/.github/workflows/datamodel-create-dumps.yml b/.github/workflows/datamodel-create-dumps.yml index 9329e3fe6..30b1ac2c6 100644 --- a/.github/workflows/datamodel-create-dumps.yml +++ b/.github/workflows/datamodel-create-dumps.yml @@ -25,20 +25,28 @@ jobs: env: COMPOSE_PROFILES: schemaspy + strategy: + matrix: + extension: ["", "agxx"] + steps: - uses: actions/checkout@v4 - name: Docker build run: docker compose up -d --build + env: + EXTENSION_NAMES: ${{ matrix.extension }} - name: Initialize container run: docker compose exec db init_db.sh wait - name: Create dumps - run: docker compose exec db /src/datamodel/scripts/create-dumps.py + run: docker compose exec db /src/datamodel/scripts/create-dumps.py --extension_name=${{ matrix.extension }} - name: Schemaspy - run: docker compose run schemaspy + run: docker compose run schemaspy + env: + EXTENSION_NAMES: ${{ matrix.extension }} - name: Docker logs if: failure() @@ -46,12 +54,12 @@ jobs: - uses: actions/upload-artifact@v4 with: - name: datamodel-dumps + name: ${{ matrix.extension && format('datamodel-dumps-{0}', matrix.extension) || 'datamodel-dumps' }} path: datamodel/artifacts/ if-no-files-found: error - uses: actions/upload-artifact@v4 with: - name: datamodel-schemaspy + name: ${{ matrix.extension && format('datamodel-schemaspy-{0}', matrix.extension) || 'datamodel-schemaspy' }} path: datamodel/schemaspy/ if-no-files-found: error diff --git a/.github/workflows/datamodel-test.yml b/.github/workflows/datamodel-test.yml index daf3a944b..93b83eb39 100644 --- a/.github/workflows/datamodel-test.yml +++ b/.github/workflows/datamodel-test.yml @@ -28,6 +28,7 @@ jobs: strategy: matrix: psycopg-version: [ 2, 3 ] + extension: ["", "agxx"] fail-fast: true steps: @@ -43,7 +44,7 @@ jobs: - name: Initialize container run: | - docker run -d -p 5432:5432 --name teksi-wastewater teksi/wastewater:unstable + docker run -d -p 5432:5432 --name teksi-wastewater -e EXTENSION_NAMES=${{ matrix.extension }} teksi/wastewater:unstable docker exec teksi-wastewater init_db.sh wait - name: Run tests diff --git a/.github/workflows/plugin-test.yml b/.github/workflows/plugin-test.yml index 726644b58..a1d124767 100644 --- a/.github/workflows/plugin-test.yml +++ b/.github/workflows/plugin-test.yml @@ -30,6 +30,7 @@ jobs: fail-fast: false matrix: qgis_version: [3.34-jammy, latest] + extension: ["", "agxx"] env: QGIS_TEST_VERSION: ${{ matrix.qgis_version }} COMPOSE_PROFILES: qgis @@ -57,12 +58,16 @@ jobs: - name: Clear Database run: docker compose exec db init_db.sh build + env: + EXTENSION_NAMES: ${{ matrix.extension }} - name: Test on QGIS DSS dataset run: docker compose run qgis /usr/src/plugin/.docker/run-docker-tests.sh teksi_wastewater/tests/test_interlis.py::TestInterlis::test_dss_dataset_import_export - name: Clear Database run: docker compose exec db init_db.sh build + env: + EXTENSION_NAMES: ${{ matrix.extension }} - name: Test command line import orgs run: docker compose run qgis sh -c 'xvfb-run /usr/src/plugin/tww_cmd.py interlis_import --xtf_file /usr/src/plugin/teksi_wastewater/tests/data/minimal-dataset-organisation-arbon-only.xtf --pghost db --pgdatabase tww --pguser postgres --pgpass postgres --pgport 5432' diff --git a/README.md b/README.md index 5d7ff6c0d..10da3ef67 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # TEKSI Wastewater module (TWW) + NEW TEKSI wastewater module, adapted datamodel to fit Swiss Norm VSA-DSS Release 2020.1 new standard. This repository holds all code related to the TEKSI Wastewater module (formerly QGEP). @@ -10,7 +11,6 @@ It contains: - A QGIS .qgs project : TEKSI wastewater and General Wastewater Management Plan (GWMP) - The documentation : https://teksi.github.io/wastewater/ -This will replace actual [QGIS QGEP Project](https://github.com/qgep) How to start [testing](https://github.com/teksi/wastewater/discussions/72) diff --git a/datamodel/app/create_app.py b/datamodel/app/create_app.py index 3ba258bff..21e2d222c 100755 --- a/datamodel/app/create_app.py +++ b/datamodel/app/create_app.py @@ -9,6 +9,7 @@ except ImportError: import psycopg2 as psycopg +from extensions.extension_manager import load_extension from pirogue import MultipleInheritance, SimpleJoins, SingleInheritance from triggers.set_defaults_and_triggers import set_defaults_and_triggers from view.vw_tww_additional_ws import vw_tww_additional_ws @@ -45,6 +46,7 @@ def create_app( tww_wastewater_structure_extra: Optional[Path] = None, tww_ii_extra: Optional[Path] = None, wastewater_structure_extra: Optional[Path] = None, + extension_names: Optional[list] = [], ): """ Creates the schema tww_app for TEKSI Wastewater & GEP @@ -75,6 +77,10 @@ def create_app( run_sql_file("functions/organisation_functions.sql", pg_service, variables) run_sql_file("functions/meta_functions.sql", pg_service, variables) + if extension_names: + for extension in extension_names: + load_extension(srid, pg_service, "tww", extension) + # open YAML files if tww_reach_extra: tww_reach_extra = safe_load(open(tww_reach_extra)) @@ -271,6 +277,13 @@ def create_app( default=False, action=BooleanOptionalAction, ) + parser.add_argument( + "-x", + "--extension_names", + nargs="*", + required=False, + help="extensions that should be loaded into application schema", + ) args = parser.parse_args() create_app( @@ -279,4 +292,5 @@ def create_app( drop_schema=args.drop_schema, tww_reach_extra=args.tww_reach_extra, tww_wastewater_structure_extra=args.tww_wastewater_structure_extra, + extension_names=args.extension_names, ) diff --git a/datamodel/app/extensions/__init__.py b/datamodel/app/extensions/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/datamodel/app/extensions/config.yaml b/datamodel/app/extensions/config.yaml new file mode 100644 index 000000000..a8a6aef71 --- /dev/null +++ b/datamodel/app/extensions/config.yaml @@ -0,0 +1,9 @@ +extensions: + - id: template + directory: template_extension + variables: + myVariable: "Hello World" + myNumber: 0 + - id: agxx + directory: tww2ag6496 + variables: {} diff --git a/datamodel/app/extensions/demo_extension/001_demo.sql b/datamodel/app/extensions/demo_extension/001_demo.sql new file mode 100644 index 000000000..e0ac49d1e --- /dev/null +++ b/datamodel/app/extensions/demo_extension/001_demo.sql @@ -0,0 +1 @@ +SELECT 1; diff --git a/datamodel/app/extensions/demo_extension/002_demo.py b/datamodel/app/extensions/demo_extension/002_demo.py new file mode 100644 index 000000000..b7e972cfa --- /dev/null +++ b/datamodel/app/extensions/demo_extension/002_demo.py @@ -0,0 +1,17 @@ +from argparse import ArgumentParser + + +def demo(myVariable, myNumber): + print(f"{myVariable}! My favorite number is {myNumber}") + + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument("-v", "--myVariable", help="my variable") + parser.add_argument("-n", "--myNumber", help="my number") + args = parser.parse_args() + + demo( + args.myVariable, + args.myNumber, + ) diff --git a/datamodel/app/extensions/extension_manager.py b/datamodel/app/extensions/extension_manager.py new file mode 100644 index 000000000..b0f5c2cb6 --- /dev/null +++ b/datamodel/app/extensions/extension_manager.py @@ -0,0 +1,118 @@ +import os +import subprocess +import sys +from argparse import ArgumentParser +from pathlib import Path + +from yaml import safe_load + +try: + import psycopg +except ImportError: + import psycopg2 as psycopg + + +def read_config(config_file: str, extension_name: str): + abs_file_path = Path(__file__).parent.resolve() / config_file + with open(abs_file_path) as file: + config = safe_load(file) + for entry in config.get("extensions", []): + if entry.get("id") == extension_name: + return entry + raise ValueError(f"No entry found with id: {extension_name}") + + +def run_py_file(file_path: str, variables: dict = None): + abs_file_path = Path(__file__).parent.resolve() / file_path + varlist = [sys.executable, str(abs_file_path)] + for key, value in variables.iteritems(): + varlist.append("--" + key) + varlist.append(value) + result = subprocess.run(varlist, capture_output=True, text=True) + if result.returncode != 0: + raise RuntimeError(f"Error running file: {result.stderr}") + + +def run_sql_file(file_path: str, pg_service: str, variables: dict = None): + abs_file_path = Path(__file__).parent.resolve() / file_path + with open(abs_file_path) as f: + sql = f.read() + run_sql(sql, pg_service, variables) + + +def run_sql(sql: str, pg_service: str, variables: dict = None): + if variables: + sql = psycopg.sql.SQL(sql).format(**variables) + conn = psycopg.connect(f"service={pg_service}") + cursor = conn.cursor() + cursor.execute(sql) + conn.commit() + conn.close() + + +def load_extension( + srid: int = 2056, + pg_service: str = "pg_tww", + module_name: str = "tww", + extension_name: str = None, +): + """ + initializes the TWW database for usage of an extension + + Args: + pgservice: pg service string + extension_name: Name of the extension to load + + """ + + # load definitions from config + config = read_config("config.yaml", extension_name) + variables = config.get("variables", {}) + + # We also disable symbology triggers as they can badly affect performance. This must be done in a separate session as it + # would deadlock other sessions. + conn = psycopg.connect(f"service={pg_service}") + cursor = conn.cursor() + cursor.execute(f"SELECT {module_name}_app.alter_symbology_triggers('disable');") + conn.commit() + conn.close() + + directory = config.get("directory", None) + if directory: + files = os.listdir(Path(__file__).parent.resolve() / directory) + files.sort() + for file in files: + filename = os.fsdecode(file) + if filename.lower().endswith(".sql"): + print(f"Running {filename}") + run_sql_file(os.path.join(directory, filename), pg_service, variables) + if filename.endswith(".py"): + print(f"Running {filename}") + run_py_file(os.path.join(directory, filename), variables) + + # re-create symbology triggers + conn = psycopg.connect(f"service={pg_service}") + cursor = conn.cursor() + cursor.execute(f"SELECT {module_name}_app.alter_symbology_triggers('enable');") + conn.commit() + conn.close() + + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument("-p", "--pg_service", help="postgres service") + parser.add_argument("-m", "--module_name", help="name of TEKSI module", default="tww") + parser.add_argument( + "-s", "--srid", help="SRID EPSG code, defaults to 2056", type=int, default=2056 + ) + parser.add_argument( + "-x", "--extension_name", help="name of the database extension", type=str, default="demo" + ) + args = parser.parse_args() + + load_extension( + args.srid, + args.pg_service, + args.module_name, + args.extension_name, + ) diff --git a/datamodel/app/extensions/tww2ag6496/002_extensions_cfg_agxx_sys.sql b/datamodel/app/extensions/tww2ag6496/002_extensions_cfg_agxx_sys.sql new file mode 100644 index 000000000..9735e341b --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/002_extensions_cfg_agxx_sys.sql @@ -0,0 +1,76 @@ +-- Funktion zum Mapping der Organisations-ID + +CREATE OR REPLACE FUNCTION tww_app.fct_agxx_organisationid_to_vsa(oid varchar) +RETURNS varchar(16) +AS +$BODY$ +DECLARE + out_oid varchar(16); +BEGIN + SELECT obj_id INTO out_oid FROM tww_od.organisation WHERE right(obj_id,8) = right(oid,8); + return out_oid; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.fct_agxx_linkup_secondary_nodes(oid varchar) +RETURNS VOID +AS +$BODY$ +DECLARE +DECLARE + ws_oid varchar(16); + wn_oids varchar(16)[]; + sp_oids varchar(16)[]; +BEGIN + SELECT ws.obj_id, array_agg(wn.obj_id) INTO ws_oid, wn_oids + FROM (SELECT ws.obj_id, + st_buffer(detail_geometry3d_geometry,0.0001) + as detail_geometry2d_geometry + FROM tww_od.wastewater_structure ws + LEFT JOIN tww_od.channel ch on ws.obj_id=ch.obj_id + WHERE ws.detail_geometry3d_geometry IS NOT NULL + AND ch.obj_id is NULL) ws + LEFT JOIN (SELECT obj_id,situation3d_geometry + from tww_od.wastewater_node) wn ON + ST_CoveredBy(wn.situation3d_geometry + , detail_geometry2d_geometry) + LEFT JOIN (SELECT obj_id,fk_wastewater_structure FROM tww_od.wastewater_networkelement) ne on ne.obj_id=wn.obj_id + WHERE ne.fk_wastewater_structure IS NULL + GROUP BY ws.obj_id; + + SELECT array_agg(co.obj_id) INTO sp_oids + FROM tww_od.wastewater_node wn + LEFT JOIN tww_od.cover co on co.ag64_fk_wastewater_node=wn.obj_id + WHERE wn.obj_id = any(wn_oids) + GROUP BY wn.obj_id; + + CASE WHEN ws_oid is not NULL THEN + UPDATE tww_od.wastewater_networkelement + SET fk_wastewater_structure = ws_oid + WHERE obj_id = wn_oid; + + UPDATE tww_od.structure_part + SET fk_wastewater_structure = ws_oid + WHERE obj_id = ANY(sp_oids); + + ELSE NULL; + END CASE; + RETURN; +END; +$BODY$ +LANGUAGE plpgsql; + +-- wird für Updates von letzte_aenderung_wi/gep genutzt +CREATE TABLE IF NOT EXISTS tww_cfg.agxx_last_modification_updater( + username varchar(200) PRIMARY KEY + , ag_update_type varchar(4) NOT NULL + , CONSTRAINT ag_update_type_valid CHECK (ag_update_type = ANY(ARRAY['None','WI','GEP','Both']))); + +------------------ +-- System tables +------------------ +INSERT INTO tww_sys.dictionary_od_table (id, tablename, shortcut_en) VALUES +(2999998,'measure_text','MX'), +(2999999,'building_group_text','GX') +ON CONFLICT DO NOTHING; diff --git a/datamodel/app/extensions/tww2ag6496/003_extensions_vl.sql b/datamodel/app/extensions/tww2ag6496/003_extensions_vl.sql new file mode 100644 index 000000000..6a6eae65f --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/003_extensions_vl.sql @@ -0,0 +1,792 @@ + +----------------- +-- Forward relations for import +----------------- + +CREATE TABLE IF NOT EXISTS tww_vl.value_list_agxx_import_rel_base +( + code integer NOT NULL, + value_de character varying(100) COLLATE pg_catalog."default", + CONSTRAINT pkey_tww_value_list_agxx_import_rel_code PRIMARY KEY (code) +) +TABLESPACE pg_default; + + +----------------- +-- Backward relations for export +----------------- + +CREATE TABLE IF NOT EXISTS tww_vl.value_list_agxx_export_rel_base +( + code integer NOT NULL, + value_de character varying(100) COLLATE pg_catalog."default", + CONSTRAINT pkey_tww_value_list_agxx_export_rel_code PRIMARY KEY (code) +) +TABLESPACE pg_default; + +----------------- +-- Organisation +----------------- +INSERT INTO tww_vl.organisation_organisation_type (code,vsacode,value_de,value_en,active) VALUES +(1999952,8605,'Amt','government_office',true) -- VSA mapping auf Kanton +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + +----------------- +-- Einzugsgebiet +----------------- + +-- Entwaesserungssystem_geplant +INSERT INTO tww_vl.catchment_area_drainage_system_planned (code,vsacode,value_de,value_en,active) VALUES +(1999994,5193,'TeilTrennsystem_mit_Dachwasserversickerung_oder_Ableitung_in_Gewaesser','part_sep_sys_infil_or_water_body',true), +(1999995,5193,'TeilTrennsystem_mit_Dachwasserableitung_in_Gewaesser','part_sep_sys_in_water_body',true), +(1999996,5193,'TeilTrennsystem_mit_Dachwasserversickerung','part_sep_sys_infiltration',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; +UPDATE tww_vl.catchment_area_drainage_system_planned SET active = FALSE where code = ANY( ARRAY[ +5193 -- ModifiziertesSystem +, 8692 -- vorbereitetes_Trennsystem +, 9067 -- Drainagesystem +]); + +CREATE TABLE IF NOT EXISTS tww_vl.catchment_area_drainage_system_planned_import_rel_agxx +(CONSTRAINT pkey_catchment_area_drainage_system_planned_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.catchment_area_drainage_system_planned_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.catchment_area_drainage_system_planned WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +CREATE TABLE IF NOT EXISTS tww_vl.catchment_area_drainage_system_planned_export_rel_agxx +(CONSTRAINT pkey_catchment_area_drainage_system_planned_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.catchment_area_drainage_system_planned_export_rel_agxx (code,value_de) VALUES +(5193,'TeilTrennsystem_mit_Dachwasserversickerung_oder_Ableitung_in_Gewaesser'), +(8692,'Trennsystem'), +(9067,'unbekannt') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + + +-- Entwaesserungssystem_ist +INSERT INTO tww_vl.catchment_area_drainage_system_current (code,vsacode,value_de,value_en,active) VALUES +(1999997,5188,'TeilTrennsystem_mit_Dachwasserversickerung_oder_Ableitung_in_Gewaesser','part_sep_sys_infil_or_water_body',true), +(1999998,5188,'TeilTrennsystem_mit_Dachwasserableitung_in_Gewaesser','part_sep_sys_in_water_body',true), +(1999999,5188,'TeilTrennsystem_mit_Dachwasserversickerung','part_sep_sys_infiltration',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; +UPDATE tww_vl.catchment_area_drainage_system_current SET active = FALSE where code = ANY( ARRAY[ +5188 -- ModifiziertesSystem +, 8693 -- vorbereitetes_Trennsystem +, 9068 -- Drainagesystem +]); + +CREATE TABLE IF NOT EXISTS tww_vl.catchment_area_drainage_system_current_import_rel_agxx +(CONSTRAINT pkey_catchment_area_drainage_system_current_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.catchment_area_drainage_system_current_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.catchment_area_drainage_system_current WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +CREATE TABLE IF NOT EXISTS tww_vl.catchment_area_drainage_system_current_export_rel_agxx +(CONSTRAINT pkey_catchment_area_drainage_system_current_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default;; + +INSERT INTO tww_vl.catchment_area_drainage_system_current_export_rel_agxx (code,value_de) VALUES +(5188,'TeilTrennsystem_mit_Dachwasserversickerung_oder_Ableitung_in_Gewaesser'), +(8693,'Trennsystem'), +(9068,'unbekannt') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +----------------- +-- Knoten +----------------- + + + +-- Ist_Schnittstelle +CREATE TABLE IF NOT EXISTS tww_vl.wastewater_node_ag96_is_gateway +(CONSTRAINT pkey_tww_vl_wastewater_node_ag96_is_gateway PRIMARY KEY (code)) + INHERITS (tww_vl.value_list_base) + TABLESPACE pg_default; --Werteliste + +ALTER TABLE tww_vl.wastewater_node_ag96_is_gateway DROP CONSTRAINT IF EXISTS pkey_tww_vl_wastewater_node_ag96_is_gateway CASCADE; +ALTER TABLE tww_vl.wastewater_node_ag96_is_gateway ADD CONSTRAINT pkey_tww_vl_wastewater_node_ag96_is_gateway PRIMARY KEY (code); +INSERT INTO tww_vl.wastewater_node_ag96_is_gateway (code,vsacode,value_de,value_en,active) VALUES +(1999951,1999951,'Schnittstelle','gateway',true), +(1999950,1999950,'keine_Schnittstelle','no_gateway',true), +(1999949,1999949,'unbekannt','unknown',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + + +-- FunktionAG Anschluss +CREATE TABLE IF NOT EXISTS tww_vl.wastewater_node_ag64_function +(CONSTRAINT pkey_tww_vl_wastewater_node_ag64_function PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_base); + +ALTER TABLE tww_vl.wastewater_node_ag64_function DROP CONSTRAINT IF EXISTS pkey_tww_vl_wastewater_node_ag64_function CASCADE; +ALTER TABLE tww_vl.wastewater_node_ag64_function ADD CONSTRAINT pkey_tww_vl_wastewater_node_ag64_function PRIMARY KEY (code); +INSERT INTO tww_vl.wastewater_node_ag64_function (code,vsacode,value_de,active) VALUES +(1999948,1999948,'Anschluss',true), +(1999933,1999933,'andere',true) -- für Zweitdeckel +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + +--FunktionAG Normschacht +INSERT INTO tww_vl.manhole_function (code,vsacode,value_de,value_en,active) VALUES +(1999968,2742,'Schlammfang','sludge_trap',true) -- Schlammsammler +-- (1999937,8736,'Kontrollschacht','manhole',true), -- Wird auf Kontroll-Einstiegschacht gemappt +--(1999936,8703,'Vorbehandlung','pretreatment',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; +UPDATE tww_vl.manhole_function SET active = false WHERE code = ANY(Array[ + 8828 -- Entwaesserungsrinne_mit_Schlammsack +, 8601 -- Fettabscheider +--, 8654 -- Kombischacht +, 8702 -- Behandlungsanlage +--, 8736 -- Kontroll-Einstiegschacht, +--, 8703 -- Vorbehandlungsanlage +]); + +CREATE TABLE IF NOT EXISTS tww_vl.manhole_function_import_rel_agxx +(CONSTRAINT pkey_manhole_function_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.manhole_function_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.manhole_function WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.manhole_function_import_rel_agxx (code,value_de) VALUES +(8736,'Kontrollschacht'), +(8703,'Vorbehandlung') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +CREATE TABLE IF NOT EXISTS tww_vl.manhole_function_export_rel_agxx +(CONSTRAINT pkey_manhole_function_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.manhole_function_export_rel_agxx (code,value_de) VALUES +(8828,'Entwaesserungsrinne'), +(8601,'Schwimmstoffabscheider'), +(8654,'Kontrollschacht'), +(8702,'Vorbehandlung'), +(8736,'Kontrollschacht'), +(8703,'Vorbehandlung') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +--FunktionAG Spezialbawerk +INSERT INTO tww_vl.special_structure_function (code,vsacode,value_de,value_en,active) VALUES +(1999967,8704,'Oelrueckhaltebecken','oil_retention_basin',true), -- Mappt auf Behandlungsanlage +(1999940,8704,'Strassenwasserbehandlungsanlage','streetwater_treatment_plant',true) +-- (1999935,8739,'Kontrollschacht','manhole',true), -- Wird auf Kontroll-Einstiegschacht gemappt +-- (1999934,8704,'Vorbehandlung','pretreatment',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; +UPDATE tww_vl.special_structure_function SET active = false WHERE code = ANY(Array[ + 8704 -- Behandlungsanlage +, 8600 -- Fettabscheider +, 8657 -- Havariebecken +--, 9302 -- Kombischacht +--, 8739 -- Kontroll-Einstiegschacht, +--, 9089 -- Vorbehandlungsanlage +]); + +CREATE TABLE IF NOT EXISTS tww_vl.special_structure_function_import_rel_agxx +(CONSTRAINT pkey_special_structure_function_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.special_structure_function_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.special_structure_function WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.special_structure_function_import_rel_agxx (code,value_de) VALUES +(8739,'Kontrollschacht'), +(9089,'Vorbehandlung') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +CREATE TABLE IF NOT EXISTS tww_vl.special_structure_function_export_rel_agxx +(CONSTRAINT pkey_special_structure_function_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.special_structure_function_export_rel_agxx (code,value_de) VALUES +(8704,'Strassenwasserbehandlungsanlage'), -- Behandlungsanlage +(8600,'andere'), -- Fettabscheider +(8657,'andere'), --Havariebecken +(9302,'Kontrollschacht'), --Kombischacht +(8739,'Kontrollschacht'), -- Kontroll-Einstiegschacht +(9089,'Vorbehandlung') -- Vorbehandlungsanlage +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +--FunktionAG Versickerungsanlage +INSERT INTO tww_vl.infiltration_installation_kind (code,vsacode,value_de,value_en,active) VALUES +(1999966,3087,'andere','other',true), -- Mappt auf unbekannt +(1999965,3282,'Retentionsfilterbecken','retention_filter_basin',true) -- Mappt auf andere_mit_Bodenpassage +--(1999942,3283,'Versickerungsstrang','infiltration_pipe',true), -- Versickerungsstrang_Galerie +--(1999941,3284,'Versickerungsschacht_Strang','infiltration_pipe_manhole',true) -- Kombination_Schacht_Strang +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + +UPDATE tww_vl.infiltration_installation_kind SET active = FALSE where code = ANY( ARRAY[ + 3279 -- Flaechenfoermige_Versickerung +, 3280 -- Versickerung_ueber_die_Schulter +, 3281 -- MuldenRigolenversickerung +, 3282 -- andere_mit_Bodenpassage +--, 3283 -- Versickerungsstrang_Galerie +--, 3284 -- Kombination_Schacht_Strang +, 3285 -- andere_ohne_Bodenpassage +]); + +CREATE TABLE IF NOT EXISTS tww_vl.infiltration_installation_kind_import_rel_agxx +(CONSTRAINT pkey_infiltration_installation_kind_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.infiltration_installation_kind_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.infiltration_installation_kind WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.infiltration_installation_kind_import_rel_agxx (code,value_de) VALUES +(276,'Versickerungsanlage.Versickerungsbecken'), +(277,'Versickerungsanlage.Kieskoerper'), +(278,'Versickerungsanlage.Versickerungsschacht'), +(3283,'Versickerungsanlage.Versickerungsstrang'), +(3284,'Versickerungsanlage.Versickerungsschacht_Strang'), +(1999965,'Versickerungsanlage.Retentionsfilterbecken'), +(1999966,'Versickerungsanlage.andere'), +(3087,'Versickerungsanlage.unbekannt') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +CREATE TABLE IF NOT EXISTS tww_vl.infiltration_installation_kind_export_rel_agxx +(CONSTRAINT pkey_infiltration_installation_kind_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.infiltration_installation_kind_export_rel_agxx (code,value_de) VALUES +(3279,'andere'), +(3280,'andere'), +(3281,'andere'), +(3282,'andere'), +--(3283,'Versickerungsstrang'), +--(3284,'Versickerungsschacht_Strang'), +(3285,'andere') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +CREATE TABLE IF NOT EXISTS tww_vl.discharge_point_relevance_import_rel_agxx +(CONSTRAINT pkey_discharge_point_relevance_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.discharge_point_relevance_import_rel_agxx (code,value_de) VALUES +(5080,'Einleitstelle.gewaesserrelevant'), +(5081,'Einleitstelle.nicht_gewaesserrelevant') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +-- bauwerkstatus +CREATE TABLE IF NOT EXISTS tww_vl.wastewater_structure_status_import_rel_agxx +(CONSTRAINT pkey_wastewater_structure_status_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.wastewater_structure_status_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.wastewater_structure_status WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.wastewater_structure_status_import_rel_agxx (code,value_de) VALUES +(8493,'in_Betrieb.in_Betrieb') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +----------------- +-- Haltung +----------------- +--NutzungsartAG_ist +INSERT INTO tww_vl.channel_usage_current (code,vsacode,value_de,value_en,active) VALUES +(1999993,9023,'Platzwasser','square_water',true), +(1999989,9023,'Strassenwasser','street_water',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + +UPDATE tww_vl.channel_usage_current +SET tww_symbology_order= + array_position( + ARRAY[ + 4526 --wastewater + ,4522 --combined_wastewater + ,4516 --discharged_combined_wastewater + ,4524 --industrial_wastewater + ,1999989 --street_water + ,1999993 -- square_water + ,4514 --clean_wastewater + ,9023 --surface_water + ,4518 --creek_water + ,4571 --other + ,5322 --unknown + ] + ,code); + +CREATE TABLE IF NOT EXISTS tww_vl.channel_usage_current_import_rel_agxx +(CONSTRAINT pkey_channel_usage_current_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.channel_usage_current_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.channel_usage_current WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.channel_usage_current_import_rel_agxx (code,value_de) VALUES +(4522,'Mischwasser'), +(4514,'Fremdwasser'), +(9023,'Sauberwasser'), +(4518,'Gewaesser'), +(4516,'Entlastetes_Mischwasser'), +(4526,'Schmutzwasser') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +CREATE TABLE IF NOT EXISTS tww_vl.channel_usage_current_export_rel_agxx +(CONSTRAINT pkey_channel_usage_current_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.channel_usage_current_export_rel_agxx (code,value_de) VALUES +(4522,'Mischwasser'), +(4514,'Fremdwasser'), +(9023,'Sauberwasser'), +(4518,'Gewaesser'), +(4516,'Entlastetes_Mischwasser'), +(4526,'Schmutzwasser') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +--NutzungsartAG_geplant +INSERT INTO tww_vl.channel_usage_planned (code,vsacode,value_de,value_en,active) VALUES +(1999992,9024,'Platzwasser','square_water',true), +(1999990,9024,'Strassenwasser','street_water',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + +CREATE TABLE IF NOT EXISTS tww_vl.channel_usage_planned_import_rel_agxx +(CONSTRAINT pkey_channel_usage_planned_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.channel_usage_planned_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.channel_usage_planned WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.channel_usage_planned_import_rel_agxx (code,value_de) VALUES +(4523,'Mischwasser'), +(4515,'Fremdwasser'), +(9022,'Sauberwasser'), +(4519,'Gewaesser'), +(4517,'Entlastetes_Mischwasser'), +(4527,'Schmutzwasser') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- DSS-Nutzungsarten werden nur rückwärts gematcht, damit die Visualisierungen übernommen werden können +CREATE TABLE IF NOT EXISTS tww_vl.channel_usage_planned_export_rel_agxx +(CONSTRAINT pkey_channel_usage_planned_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.channel_usage_planned_export_rel_agxx (code,value_de) VALUES +(4523,'Mischwasser'), +(4515,'Fremdwasser'), +(9022,'Sauberwasser'), +(4519,'Gewaesser'), +(4517,'Entlastetes_Mischwasser'), +(4527,'Schmutzwasser') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +--Kanal_FunktionHierarchisch +INSERT INTO tww_vl.channel_function_hierarchic (code,vsacode,value_de,value_en,active) VALUES +(1999991,5071,'PAA.Arealentwaesserung','pwwf.site_drainage',true) +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + +UPDATE tww_vl.channel_function_hierarchic +SET tww_symbology_order= + array_position( + ARRAY[ + 5068 --pwwf.water_bodies + ,5070 --pwwf.main_drain_regional + ,5069 --pwwf.main_drain + ,5071 --pwwf.collector_sewer + ,1999991 --pwwf.site_drainage + ,5062 --pwwf.renovation_conduction + ,5064 --pwwf.residential_drainage + ,5072 --pwwf.road_drainage + ,5066 --pwwf.other + ,5074 --pwwf.unknown + ,5063 --swwf.renovation_conduction + ,5065 --swwf.residential_drainage + ,5073 --swwf.road_drainage + ,5067 --swwf.other + ,5075 --swwf.unknown + ] + ,code); + +--Profiltyp +INSERT INTO tww_vl.pipe_profile_profile_type (code,vsacode,value_de,value_en,active) VALUES +(1999947,3357,'andere','other',true) -- 3357 = unbekannt +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + + +----------------- +-- GEPMassnahme +----------------- + +-- Kategorie +INSERT INTO tww_vl.measure_category (code,vsacode,value_de,value_en,active) VALUES +(1999988,8639,'Bachrenaturierung','creek_renaturalisation',true), -- 8639 = Massnahme_im_Gewaesser +(1999987,8639,'Bachsanierung','creek_renovation',true), -- 8639 = Massnahme_im_Gewaesser +(1999986,8707,'Einstellung_anpassen_hydraulisch','alter_hydr_settings',true), -- 8707 = Sonderbauwerk_Anpassung +(1999985,4660,'GEP_Vorbereitungsarbeiten','GEP_preparations',true) , -- 4660 = GEP_Bearbeitung +(1999984,8706,'Leitungsersatz_diverse_Gruende','reach_replacement_other',true) , -- 8706 = Erhaltung_Erneuerung +(1999983,8706,'Leitungsersatz_hydraulisch','reach_replacement_hydraulic',true) , -- 8706 = Erhaltung_Erneuerung +(1999982,8706,'Leitungsersatz_Zustand','reach_replacement_condition',true) , -- 8706 = Erhaltung_Erneuerung +--(1999981,8648,'Reinigung','maintenance_cleaning',true) , -- 8648 = Erhaltung_Reinigung +(1999980,8646,'Renovierung','maintenance_renovation_renovation',true) , -- 8646 = Erhaltung_Renovierung_Reparatur +(1999979,8646,'Reparatur','maintenance_renovation_repair',true) , -- 8646 = Erhaltung_Renovierung_Reparatur +-- (1999978,8649,'Retention','runoff_prevention_retention_infiltration',true) , -- 8649 = Abflussvermeidung_Retention_Versickerung +-- (1999977,8705,'Sonderbauwerk.Neubau','special_construction_new_buildung',true) , -- 8705 = Sonderbauwerk_Neubau +(1999976,8707,'Sonderbauwerk.Aus_Umbau','special_construction_extension',true) , -- 8707 = Sonderbauwerk_Anpassung +(1999975,8707,'Sonderbauwerk.Anpassung_hydraulisch','special_construction_customization_hydraulic',true) , -- 8707 = Sonderbauwerk_Anpassung +(1999974,4654,'Sonderbauwerk.Rueckbau','special_construction_abolishment',true) , -- 4654 = Aufhebung +(1999973,4662,'Untersuchung.andere','control_and_surveillance_other',true) , -- 4662 = Kontrolle_und_Ueberwachung +(1999972,4662,'Untersuchung.Begehung','control_and_surveillance_site_inspection',true) , -- 4662 = Kontrolle_und_Ueberwachung +(1999971,4662,'Untersuchung.Dichtheitspruefung','control_and_surveillance_tightness_check',true) , -- 4662 = Kontrolle_und_Ueberwachung +(1999970,4662,'Untersuchung.Kanalfernsehen','control_and_surveillance_TV',true) , -- 4662 = Kontrolle_und_Ueberwachung +(1999969,4662,'Untersuchung.unbekannt','control_and_surveillance_unknown',true) -- 4662 = Kontrolle_und_Ueberwachung +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; +UPDATE tww_vl.measure_category SET active = FALSE where code = ANY( ARRAY[ +9144 -- ALR +, 8706 -- Erhaltung_Erneuerung +--, 8648 -- Erhaltung_Reinigung +, 8646 -- Erhaltung_Renovierung_Reparatur +, 8647 -- Erhaltung_unbekannt +, 4662 -- Kontrolle_und_Ueberwachung +, 8639 -- Massnahme_im_Gewaesser +-- , 8649 -- Abflussvermeidung_Retention_Versickerung +, 8707 -- Sonderbauwerk_Anpassung +--, 8705 -- Sonderbauwerk_Neubau +]); + +CREATE TABLE IF NOT EXISTS tww_vl.measure_category_import_rel_agxx +(CONSTRAINT pkey_measure_category_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.measure_category_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.measure_category WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.measure_category_import_rel_agxx (code,value_de) VALUES +(8648,'Reinigung'), +(8649,'Retention'), +(8705,'Sonderbauwerk.Neubau') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +CREATE TABLE IF NOT EXISTS tww_vl.measure_category_export_rel_agxx +(CONSTRAINT pkey_measure_category_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.measure_category_export_rel_agxx (code,value_de) VALUES +(9144,'andere'), +(8706,'andere'), +(8648,'Reinigung'), +(8646,'Renovierung'), +(8647,'andere'), +(4662,'Untersuchung.unbekannt'), +(8639,'Bachsanierung'), +(8649,'Retention'), +(8707,'Sonderbauwerk.Anpassung_hydraulisch'), +(8705,'Sonderbauwerk.Neubau') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +--Priorität +UPDATE tww_vl.measure_priority SET active = FALSE where code = ANY( ARRAY[ +4763 -- M4 +]); +CREATE TABLE IF NOT EXISTS tww_vl.measure_priority_export_rel_agxx +(CONSTRAINT pkey_measure_priority_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.measure_priority_export_rel_agxx (code,value_de) VALUES +(4763,'unbekannt') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +----------------- +-- VersickerungsbereichAG +----------------- + +INSERT INTO tww_vl.infiltration_zone_infiltration_capacity (code,vsacode,value_de,value_en,active) VALUES +(1999946,371,'gut.Anlagenwahl_nicht_eingeschraenkt','good.free_choice',true), -- 371 = gut +(1999945,371,'gut.Anlagenwahl_eingeschraenkt','good.restricted_choice',true), -- 371 = gut +(1999944,372,'mittel.Anlagenwahl_nicht_eingeschraenkt','medium.free_choice',true), -- 372 = maessig +(1999943,372,'mittel.Anlagenwahl_eingeschraenkt','medium.restricted_choice',true) -- 372 = maessig +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; +UPDATE tww_vl.infiltration_zone_infiltration_capacity SET active = FALSE where code = ANY( ARRAY[ +371 -- gut +, 372 -- maessig +]); + +CREATE TABLE IF NOT EXISTS tww_vl.infiltration_zone_infiltration_capacity_export_rel_agxx +(CONSTRAINT pkey_infiltration_zone_infiltration_capacity_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.infiltration_zone_infiltration_capacity_export_rel_agxx (code,value_de) VALUES +(371,'gut.Anlagenwahl_nicht_eingeschraenkt'), +(372,'mittel.Anlagenwahl_nicht_eingeschraenkt') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + + +----------------- +-- BautenAusserhalbBaugebiet +----------------- + +-- EntsorgungsArt +CREATE TABLE IF NOT EXISTS tww_vl.building_group_ag96_disposal_type (CONSTRAINT pkey_tww_vl_building_group_ag96_disposal_type PRIMARY KEY (code)) INHERITS (tww_vl.value_list_base); +ALTER TABLE tww_vl.building_group_ag96_disposal_type DROP CONSTRAINT IF EXISTS pkey_tww_vl_building_group_ag96_disposal_type CASCADE; +ALTER TABLE tww_vl.building_group_ag96_disposal_type ADD CONSTRAINT pkey_tww_vl_building_group_ag96_disposal_type PRIMARY KEY (code); +INSERT INTO tww_vl.building_group_ag96_disposal_type (code,vsacode,value_de,value_en,active) VALUES +(1999964,1999964,'Ableitung_Verwertung','drainage',true), -- kein VSA mapping +(1999963,1999963,'Klaereinrichtung_Speicherung','clearing_storing',true), -- kein VSA mapping +(1999962,1999962,'keinBedarf','noDemand',true), -- kein VSA mapping +(1999961,1999961,'pendent','pending',true) -- kein VSA mapping +ON CONFLICT (code) DO UPDATE SET + vsacode = EXCLUDED.vsacode +, value_de = EXCLUDED.value_de +, value_en = EXCLUDED.value_en +, active = EXCLUDED.active +; + +-- Sanierungsbedarf nicht Matchbar +UPDATE tww_vl.building_group_renovation_necessity SET active = FALSE where code = ANY( ARRAY[ + 8799 -- unbekannt +]); + +/* +Bautenausserhalbbaugebiet für Export nicht 100% matchbar +CREATE TABLE IF NOT EXISTS tww_vl.building_group_renovation_necessity_export_rel_agxx +(CONSTRAINT pkey_building_group_renovation_necessity_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.building_group_renovation_necessity_export_rel_agxx (code,value_de) VALUES + (8799,NULL) -- unbekannt, kann nicht auf Ja oder Nein gemappt werden +ON CONFLICT DO NOTHING;*/ + +CREATE TABLE IF NOT EXISTS tww_vl.building_group_function_export_rel_agxx +(CONSTRAINT pkey_building_group_function_export_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_export_rel_base) +TABLESPACE pg_default; + +INSERT INTO tww_vl.building_group_function_export_rel_agxx (code,value_de) VALUES +(4823,'andere'), +(4820,'Ferienhaus'), +(4821,'Gewerbegebiet'), +(4822,'Landwirtschaftsgebiet'), +(4818,'andere'), +(4819,'Wohnhaus') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +CREATE TABLE IF NOT EXISTS tww_vl.building_group_function_import_rel_agxx +(CONSTRAINT pkey_building_group_function_import_rel_agxx_code PRIMARY KEY (code)) +INHERITS (tww_vl.value_list_agxx_import_rel_base) +TABLESPACE pg_default; + +-- Copy the base +INSERT INTO tww_vl.building_group_function_import_rel_agxx (code,value_de) +SELECT code,value_de FROM tww_vl.building_group_function WHERE active +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-- alter 1:1 updated value_de +INSERT INTO tww_vl.building_group_function_import_rel_agxx (code,value_de) VALUES +(4823,'andere'), +(4820,'Ferienhaus'), +(4821,'Gewerbegebiet'), +(4822,'Landwirtschaftsgebiet'), +(4819,'Wohnhaus') +ON CONFLICT (code) DO UPDATE SET + value_de = EXCLUDED.value_de; + +-------------- +-- Texte +-------------- +CREATE TABLE IF NOT EXISTS tww_vl.building_group_text_plantype ( + CONSTRAINT pkey_tww_vl_building_group_text_plantype_code PRIMARY KEY (code) +) + INHERITS (tww_vl.value_list_base) +TABLESPACE pg_default; +INSERT INTO tww_vl.building_group_text_plantype +SELECT * FROM tww_vl.wastewater_structure_text_plantype +ON CONFLICT DO NOTHING; + +CREATE TABLE IF NOT EXISTS tww_vl.building_group_text_texthali ( + CONSTRAINT pkey_tww_vl_building_group_text_texthali_code PRIMARY KEY (code) +) + INHERITS (tww_vl.value_list_base) +TABLESPACE pg_default; +INSERT INTO tww_vl.building_group_text_texthali +SELECT * FROM tww_vl.wastewater_structure_text_texthali +ON CONFLICT DO NOTHING; + +CREATE TABLE IF NOT EXISTS tww_vl.building_group_text_textvali ( + CONSTRAINT pkey_tww_vl_building_group_text_textvali_code PRIMARY KEY (code) +) + INHERITS (tww_vl.value_list_base) +TABLESPACE pg_default; +INSERT INTO tww_vl.building_group_text_textvali +SELECT * FROM tww_vl.wastewater_structure_text_textvali +ON CONFLICT DO NOTHING; + +CREATE TABLE IF NOT EXISTS tww_vl.measure_text_plantype ( + CONSTRAINT pkey_tww_vl_measure_text_plantype_code PRIMARY KEY (code) +) + INHERITS (tww_vl.value_list_base) +TABLESPACE pg_default; +INSERT INTO tww_vl.measure_text_plantype +SELECT * FROM tww_vl.wastewater_structure_text_plantype +ON CONFLICT DO NOTHING; + +CREATE TABLE IF NOT EXISTS tww_vl.measure_text_texthali ( + CONSTRAINT pkey_tww_vl_measure_text_texthali_code PRIMARY KEY (code) +) + INHERITS (tww_vl.value_list_base) +TABLESPACE pg_default; +INSERT INTO tww_vl.measure_text_texthali +SELECT * FROM tww_vl.wastewater_structure_text_texthali +ON CONFLICT DO NOTHING; + +CREATE TABLE IF NOT EXISTS tww_vl.measure_text_textvali ( + CONSTRAINT pkey_tww_vl_measure_text_textvali_code PRIMARY KEY (code) +) + INHERITS (tww_vl.value_list_base) +TABLESPACE pg_default; +INSERT INTO tww_vl.measure_text_textvali +SELECT * FROM tww_vl.wastewater_structure_text_textvali +ON CONFLICT DO NOTHING; diff --git a/datamodel/app/extensions/tww2ag6496/004_extensions_od.sql b/datamodel/app/extensions/tww2ag6496/004_extensions_od.sql new file mode 100644 index 000000000..71d365c22 --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/004_extensions_od.sql @@ -0,0 +1,219 @@ +-- Abwasserknoten +ALTER TABLE tww_od.wastewater_node ADD COLUMN IF NOT EXISTS ag96_is_gateway bigint; +COMMENT ON COLUMN tww_od.wastewater_node.ag96_is_gateway IS 'Extension for AG-96/ Erweiterung aus AG-96, IstSchnittstelle /xxx_fr'; +ALTER TABLE tww_od.wastewater_node ADD COLUMN IF NOT EXISTS ag64_function bigint; +COMMENT ON COLUMN tww_od.wastewater_node.ag64_function IS 'Extension for AG-96/ Erweiterung aus AG-96 zur Erfassung der Funktionag Anschluss /xxx_fr'; + +ALTER TABLE tww_od.wastewater_node DROP CONSTRAINT IF EXISTS fkey_vl_wastewater_node_ag96_is_gateway CASCADE; +ALTER TABLE tww_od.wastewater_node ADD CONSTRAINT fkey_vl_wastewater_node_ag96_is_gateway FOREIGN KEY (ag96_is_gateway) REFERENCES tww_vl.wastewater_node_ag96_is_gateway MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; +ALTER TABLE tww_od.wastewater_node DROP CONSTRAINT IF EXISTS fkey_vl_wastewater_node_ag64_function CASCADE; +ALTER TABLE tww_od.wastewater_node ADD CONSTRAINT fkey_vl_wastewater_node_ag64_function FOREIGN KEY (ag64_function) REFERENCES tww_vl.wastewater_node_ag64_function MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; + +-- Deckel +ALTER TABLE tww_od.cover ADD COLUMN IF NOT EXISTS ag64_fk_wastewater_node varchar(16); +COMMENT ON COLUMN tww_od.cover.ag64_fk_wastewater_node IS 'Extension for AG-64/ Erweiterung für AG-64, Export von Zweitdeckeln /xxx_fr'; +ALTER TABLE tww_od.cover DROP CONSTRAINT IF EXISTS rel_cover_wastewater_node CASCADE; +ALTER TABLE tww_od.cover ADD CONSTRAINT rel_cover_wastewater_node FOREIGN KEY (ag64_fk_wastewater_node) REFERENCES tww_od.wastewater_node MATCH SIMPLE ON UPDATE CASCADE ON DELETE SET NULL; + +ALTER TABLE tww_od.wastewater_structure ADD COLUMN IF NOT EXISTS ag96_fk_measure varchar(16); +-- Topologische Verknüpfung Massnahme/Abwasserbauwerk +ALTER TABLE tww_od.wastewater_structure DROP CONSTRAINT IF EXISTS ag96_rel_wastewater_structure_measure; +ALTER TABLE tww_od.wastewater_structure ADD CONSTRAINT ag96_rel_wastewater_structure_measure FOREIGN KEY (ag96_fk_measure) REFERENCES tww_od.measure(obj_id) ON DELETE SET NULL; +COMMENT ON COLUMN tww_od.wastewater_structure.ag96_fk_measure IS 'Extension for AG-96/ Erweiterung aus AG-96, 1:n-Beziehung /xxx_fr'; + +-- Topologische Verknüpfung Haltung Ist und Soll +ALTER TABLE tww_od.reach ADD COLUMN IF NOT EXISTS ag96_clear_height_planned integer; +ALTER TABLE tww_od.reach ADD COLUMN IF NOT EXISTS ag96_clear_width_planned integer; +COMMENT ON COLUMN tww_od.reach.ag96_clear_height_planned IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.reach.ag96_clear_width_planned IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; + +-- SBW_Einzugsgebiet.Fremdwasseranfall_geplant +ALTER TABLE tww_od.catchment_area_totals ADD COLUMN IF NOT EXISTS ag96_sewer_infiltration_water_dim decimal(9,3); +COMMENT ON COLUMN tww_od.catchment_area_totals.ag96_sewer_infiltration_water_dim IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; + +ALTER TABLE tww_od.catchment_area_totals ADD COLUMN IF NOT EXISTS ag96_waste_water_production_dim decimal(9,3); +COMMENT ON COLUMN tww_od.catchment_area_totals.ag96_waste_water_production_dim IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; + +ALTER TABLE tww_od.catchment_area_totals ADD COLUMN IF NOT EXISTS ag96_perimeter_geometry geometry(MultiSurface,2056); +COMMENT ON COLUMN tww_od.catchment_area_totals.ag96_waste_water_production_dim IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; + +-- Bauten Ausserhalb Baugebiet +ALTER TABLE tww_od.building_group + ADD COLUMN IF NOT EXISTS ag96_owner_address varchar(80) +, ADD COLUMN IF NOT EXISTS ag96_owner_name varchar(40) +, ADD COLUMN IF NOT EXISTS ag96_label_number integer +, ADD COLUMN IF NOT EXISTS ag96_disposal_wastewater bigint +, ADD COLUMN IF NOT EXISTS ag96_disposal_industrial_wastewater bigint +, ADD COLUMN IF NOT EXISTS ag96_disposal_square_water bigint +, ADD COLUMN IF NOT EXISTS ag96_disposal_roof_water bigint +, ADD COLUMN IF NOT EXISTS ag96_population bigint; + +COMMENT ON COLUMN tww_od.building_group.ag96_owner_address IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.building_group.ag96_owner_name IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.building_group.ag96_label_number IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.building_group.ag96_disposal_wastewater IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.building_group.ag96_disposal_industrial_wastewater IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.building_group.ag96_disposal_square_water IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.building_group.ag96_disposal_roof_water IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; +COMMENT ON COLUMN tww_od.building_group.ag96_population IS 'Extension for AG-96/ Erweiterung aus AG-96 /xxx_fr'; + +ALTER TABLE tww_od.building_group DROP CONSTRAINT IF EXISTS fkey_vl_building_group_ag96_disposal_wastewater CASCADE; +ALTER TABLE tww_od.building_group ADD CONSTRAINT fkey_vl_building_group_ag96_disposal_wastewater FOREIGN KEY (ag96_disposal_wastewater) REFERENCES tww_vl.building_group_ag96_disposal_type MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; +ALTER TABLE tww_od.building_group DROP CONSTRAINT IF EXISTS fkey_vl_building_group_ag96_disposal_industrial_wastewater CASCADE; +ALTER TABLE tww_od.building_group ADD CONSTRAINT fkey_vl_building_group_ag96_disposal_industrial_wastewater FOREIGN KEY (ag96_disposal_industrial_wastewater) REFERENCES tww_vl.building_group_ag96_disposal_type MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; +ALTER TABLE tww_od.building_group DROP CONSTRAINT IF EXISTS fkey_vl_building_group_ag96_disposal_square_water CASCADE; +ALTER TABLE tww_od.building_group ADD CONSTRAINT fkey_vl_building_group_ag96_disposal_square_water FOREIGN KEY (ag96_disposal_square_water) REFERENCES tww_vl.building_group_ag96_disposal_type MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; +ALTER TABLE tww_od.building_group DROP CONSTRAINT IF EXISTS fkey_vl_building_group_ag96_disposal_roof_water CASCADE; +ALTER TABLE tww_od.building_group ADD CONSTRAINT fkey_vl_building_group_ag96_disposal_roof_water FOREIGN KEY (ag96_disposal_roof_water) REFERENCES tww_vl.building_group_ag96_disposal_type MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT; + + +ALTER TABLE tww_od.wastewater_networkelement + ADD COLUMN IF NOT EXISTS ag96_fk_provider varchar(16) -- Verweis auf Datenbewirtschafter_GEP in Organisationstabelle +, ADD COLUMN IF NOT EXISTS ag96_last_modification TIMESTAMP without time zone DEFAULT now() +, ADD COLUMN IF NOT EXISTS ag96_remark varchar(80) +, ADD COLUMN IF NOT EXISTS ag64_fk_provider varchar(16) -- Verweis auf Datenbewirtschafter_wi in Organisationstabelle +, ADD COLUMN IF NOT EXISTS ag64_last_modification TIMESTAMP without time zone DEFAULT now() +, ADD COLUMN IF NOT EXISTS ag64_remark varchar(80); + +ALTER TABLE tww_od.wastewater_networkelement DROP CONSTRAINT IF EXISTS ag96_rel_wastewater_networkelement_provider CASCADE; +ALTER TABLE tww_od.wastewater_networkelement ADD CONSTRAINT ag96_rel_wastewater_networkelement_provider FOREIGN KEY (ag96_fk_provider) REFERENCES tww_od.organisation(obj_id); +ALTER TABLE tww_od.wastewater_networkelement DROP CONSTRAINT IF EXISTS ag64_rel_wastewater_networkelement_provider CASCADE; +ALTER TABLE tww_od.wastewater_networkelement ADD CONSTRAINT ag64_rel_wastewater_networkelement_provider FOREIGN KEY (ag64_fk_provider) REFERENCES tww_od.organisation(obj_id); + + +ALTER TABLE tww_od.overflow + ADD COLUMN IF NOT EXISTS ag96_fk_provider varchar(16) -- Verweis auf Datenbewirtschafter_GEP in Organisationstabelle +, ADD COLUMN IF NOT EXISTS ag96_last_modification TIMESTAMP without time zone DEFAULT now() +, ADD COLUMN IF NOT EXISTS ag96_remark varchar(80) +, ADD COLUMN IF NOT EXISTS ag64_fk_provider varchar(16) -- Verweis auf Datenbewirtschafter_wi in Organisationstabelle +, ADD COLUMN IF NOT EXISTS ag64_last_modification TIMESTAMP without time zone DEFAULT now() +, ADD COLUMN IF NOT EXISTS ag64_remark varchar(80); + +ALTER TABLE tww_od.overflow DROP CONSTRAINT IF EXISTS ag64_rel_overflow_provider CASCADE; +ALTER TABLE tww_od.overflow ADD CONSTRAINT ag64_rel_overflow_provider FOREIGN KEY (ag64_fk_provider) REFERENCES tww_od.organisation(obj_id); +ALTER TABLE tww_od.overflow DROP CONSTRAINT IF EXISTS ag96_rel_overflow_provider CASCADE; +ALTER TABLE tww_od.overflow ADD CONSTRAINT ag96_rel_overflow_provider FOREIGN KEY (ag96_fk_provider) REFERENCES tww_od.organisation(obj_id); + + +ALTER TABLE tww_od.infiltration_zone + ADD COLUMN IF NOT EXISTS ag96_permeability varchar(50) -- Durchlässigkeit +, ADD COLUMN IF NOT EXISTS ag96_limitation varchar(100) -- Einschränkung +, ADD COLUMN IF NOT EXISTS ag96_thickness varchar(50) -- Mächtigkeit +, ADD COLUMN IF NOT EXISTS ag96_q_check character varying(50); + +-- Rückfallebene für Knoten ohne Topologische Verknüpfung beim Import +CREATE TABLE IF NOT EXISTS tww_od.agxx_unconnected_node_bwrel ( + obj_id character varying(16), + year_of_construction integer, + structure_condition bigint, + status bigint, + co_level numeric(7,3), + detail_geometry3d_geometry geometry(CurvePolygonZ,2056), + financing bigint, + ch_function_hierarchic bigint, + status_survey_year integer, + co_positional_accuracy bigint, + renovation_necessity bigint, + accessibility bigint, + fk_operator varchar(16), + fk_owner varchar(16), + ag96_fk_measure varchar(16), + CONSTRAINT pkey_od_agxx_unconnected_node_bwrel_obj_id PRIMARY KEY (obj_id)); + +CREATE INDEX IF NOT EXISTS in_od_agxx_unconnected_node_bwrel_detail_geometry3d_geometry + ON tww_od.agxx_unconnected_node_bwrel USING gist + (detail_geometry3d_geometry) + TABLESPACE pg_default; + +CREATE TABLE IF NOT EXISTS tww_od.measure_text +( + obj_id character varying(16) COLLATE pg_catalog."default" NOT NULL DEFAULT tww_app.generate_oid('tww_od'::text, 'measure_text'::text), + classname text COLLATE pg_catalog."default", + plantype integer, + remark text COLLATE pg_catalog."default", + text text COLLATE pg_catalog."default", + texthali smallint, + textori numeric(4,1), + textpos_geometry geometry(Point,2056), + textvali smallint, + last_modification timestamp without time zone DEFAULT now(), + fk_measure character varying(16) COLLATE pg_catalog."default", + CONSTRAINT pkey_tww_od_measure_text_obj_id PRIMARY KEY (obj_id), + CONSTRAINT fkey_vl_measure_text_plantype FOREIGN KEY (plantype) + REFERENCES tww_vl.measure_text_plantype (code) MATCH SIMPLE + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT fkey_vl_measure_text_texthali FOREIGN KEY (texthali) + REFERENCES tww_vl.measure_text_texthali (code) MATCH SIMPLE + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT fkey_vl_measure_text_textvali FOREIGN KEY (textvali) + REFERENCES tww_vl.measure_text_textvali (code) MATCH SIMPLE + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT rel_measure_text_measure FOREIGN KEY (fk_measure) + REFERENCES tww_od.measure (obj_id) MATCH SIMPLE + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT mx_classname_length_max_50 CHECK (char_length(classname) <= 50), + CONSTRAINT mx_remark_length_max_80 CHECK (char_length(remark) <= 80) +) + +TABLESPACE pg_default; +COMMENT ON TABLE tww_od.measure_text IS 'Extension for AG-96/ Erweiterung für AG-96 / Extension pour AG-96'; + + +CREATE TABLE IF NOT EXISTS tww_od.building_group_text +( + obj_id character varying(16) COLLATE pg_catalog."default" NOT NULL DEFAULT tww_app.generate_oid('tww_od'::text, 'building_group_text'::text), + classname text COLLATE pg_catalog."default", + plantype integer, + remark text COLLATE pg_catalog."default", + text text COLLATE pg_catalog."default", + texthali smallint, + textori numeric(4,1), + textpos_geometry geometry(Point,2056), + textvali smallint, + last_modification timestamp without time zone DEFAULT now(), + fk_building_group character varying(16) COLLATE pg_catalog."default", + CONSTRAINT pkey_tww_od_building_group_text_obj_id PRIMARY KEY (obj_id), + CONSTRAINT fkey_vl_building_group_text_plantype FOREIGN KEY (plantype) + REFERENCES tww_vl.building_group_text_plantype (code) MATCH SIMPLE + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT fkey_vl_building_group_text_texthali FOREIGN KEY (texthali) + REFERENCES tww_vl.building_group_text_texthali (code) MATCH SIMPLE + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT fkey_vl_building_group_text_textvali FOREIGN KEY (textvali) + REFERENCES tww_vl.building_group_text_textvali (code) MATCH SIMPLE + ON UPDATE RESTRICT + ON DELETE RESTRICT, + CONSTRAINT rel_building_group_text_building_group FOREIGN KEY (fk_building_group) + REFERENCES tww_od.building_group (obj_id) MATCH SIMPLE + ON UPDATE CASCADE + ON DELETE CASCADE, + CONSTRAINT gx_classname_length_max_50 CHECK (char_length(classname) <= 50), + CONSTRAINT gx_remark_length_max_80 CHECK (char_length(remark) <= 80) +) + +TABLESPACE pg_default; +COMMENT ON TABLE tww_od.building_group_text IS 'Extension for AG-96/ Erweiterung für AG-96 / Extension pour AG-96'; + +------------------ +-- Organisation extension +------------------ + +-- 05.03.2024: Neuer OID-Prefix für Mapping durch Waldburger bestellt: ch24eax1 + +INSERT INTO tww_od.organisation( + obj_id, identifier, remark, uid, last_modification, fk_dataowner, fk_provider,organisation_type,status,tww_local_extension) + VALUES + ('ch24eax100000000', 'AfU Aargau', 'bei Import AG-64/AG-96 generiert','CHE114809310', now(), 'ch24eax100000000','ch24eax100000000',8605,9047,TRUE), + ('ch24eax100000154', 'Gemeinde Wettingen', NULL, 'CHE115075438', '2016-02-05', 'ch24eax100000000', 'ch24eax100000000',8604,9047,TRUE), + ('ch24eax100000315', 'Avia Tanklager Beteiligungs AG, Mellingen', NULL, 'CHE102501414', '2017-09-29', 'ch24eax100000000', 'ch24eax100000000',8606,9047,TRUE), + ('ch24eax100000333', 'Kernkraftwerk Leibstadt AG', 'für_AraKKW_Leibstadt', 'CHE101719293', '2017-10-30', 'ch24eax100000000', 'ch24eax100000000',8606,9047,TRUE), + ('ch24eax100000335', 'Axpo Power AG', 'u.a. für Ara Beznau', 'CHE105781196', '2017-10-30', 'ch24eax100000000', 'ch24eax100000000',8606,9047,TRUE), + ('ch24eax100000343', 'Recyclingcenter Freiamt AG', NULL, 'CHE102501414', '2018-11-28', 'ch24eax100000000', 'ch24eax100000000',8606,9047,TRUE), + ('ch24eax100000348', 'PDAG-Fonds-Verein', 'Areal Königsfelden', 'CHE116398921', '2020-07-02', 'ch24eax100000000', 'ch24eax100000000',8606,9047,TRUE) + ON CONFLICT DO NOTHING; diff --git a/datamodel/app/extensions/tww2ag6496/005_export_views.sql b/datamodel/app/extensions/tww2ag6496/005_export_views.sql new file mode 100644 index 000000000..15c61bc8d --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/005_export_views.sql @@ -0,0 +1,631 @@ +---------------- +-- organisation +---------------- +DROP VIEW IF EXISTS tww_app.vw_agxx_organisation; +CREATE VIEW tww_app.vw_agxx_organisation +AS +SELECT +concat_ws('','ch113jqg0000',right(obj_id,8)) AS obj_id, +REGEXP_REPLACE(uid,'(^.{{3}})(.{{3}})(.{{3}})','\1-\2.\3.') AS uid, +identifier AS bezeichnung, +identifier_short AS kurzbezeichnung, +'AfU Aargau' AS datenbewirtschafter_kt, +ot.value_de AS organisationtyp, +last_modification AS letzte_aenderung, +remark AS bemerkung +FROM tww_od.organisation org +LEFT JOIN tww_vl.organisation_organisation_type ot ON ot.code = org.organisation_type +WHERE tww_active +; + +------------------ +-- GEPKnoten +------------------ + +-- Mapping: +/* +FunktionBauwerkAG = ( + abflussloseGrube, --> special_structure + Absturzbauwerk, --> detailgeometrie + Abwasserfaulraum, --> special_structure + andere, --> detailgeometrie + Be_Entlueftung, --> detailgeometrie + Dachwasserschacht, --> manhole + Duekerkammer, --> special_structure + Duekeroberhaupt, --> special_structure + Einlaufschacht, --> manhole + Einleitstelle_gewaesserrelevant, --> discharge_point + Einleitstelle_nicht_gewaesserrelevant, --> discharge_point + Entwaesserungsrinne, --> manhole + Faulgrube, --> special_structure + Gelaendemulde, --> special_structure + Geleiseschacht, --> manhole + Geschiebefang, --> special_structure + Guellegrube, --> special_structure + Klaergrube, --> special_structure + Kontrollschacht, --> detailgeometrie + Leitungsknoten, --> wastewater_node + Messstelle, --> detailgeometrie, measurement + Oelabscheider, --> detailgeometrie + Pumpwerk, --> detailgeometrie + Regenbecken_Durchlaufbecken, --> special_structure + Regenbecken_Fangbecken, --> special_structure + Regenbecken_Fangkanal, --> special_structure + Regenbecken_Regenklaerbecken, --> special_structure + Regenbecken_Regenrueckhaltebecken, --> special_structure + Regenbecken_Regenrueckhaltekanal, --> special_structure + Regenbecken_Stauraumkanal, --> special_structure + Regenbecken_Verbundbecken, --> special_structure + Regenueberlauf, --> detailgeometrie + Schlammsammler, --> manhole + Schwimmstoffabscheider, --> detailgeometrie + seitlicherZugang, --> special_structure + Spuelschacht, --> detailgeometrie + Trennbauwerk, --> detailgeometrie + unbekannt, --> detailgeometrie + Versickerungsanlage ( --> infiltration_installation + Versickerungsbecken, + Kieskoerper, + Versickerungsschacht, + Versickerungsstrang, + Versickerungsschacht_Strang, + Retentionsfilterbecken, + andere, + unbekannt), + Wirbelfallschacht, --> special_structure + Abwasserreinigungsanlage, --> wastewater_node, wwtp + Anschluss, --> wastewater_node, ag64_function + Bodenablauf, --> manhole + Oelrueckhaltebecken, --> special_structure + Regenwasserrechen, --> special_structure.other + Regenwassersieb, --> special_structure.other + Rohrbruecke, --> special_structure.other + Schlammfang, --> manhole + Strassenwasserbehandlungsanlage, --> special_structure + Vorbehandlung --> detailgeometrie + ); + + +*/ +DROP MATERIALIZED VIEW IF EXISTS tww_app.vw_agxx_knoten_bauwerksattribute CASCADE; + +CREATE MATERIALIZED VIEW tww_app.vw_agxx_knoten_bauwerksattribute +AS +WITH re_meta AS( + SELECT re.obj_id, + re.fk_reach_point_from, + re.fk_reach_point_to, + ws.year_of_construction, + ws.structure_condition, + ws.financing, + ws.status, + ws.status_survey_year, + ws.renovation_necessity, + ws.fk_owner, + ws.fk_operator, + CH.function_hierarchic as ch_function_hierarchic, + tww_symbology_order, + ag96_fk_measure + FROM + (SELECT obj_id, + fk_reach_point_from, + fk_reach_point_to from tww_od.reach) re + LEFT JOIN (SELECT obj_id, fk_wastewater_structure + FROM tww_od.wastewater_networkelement) ne ON ne.obj_id = re.obj_id + LEFT JOIN (SELECT obj_id, function_hierarchic + FROM tww_od.channel) CH ON CH.obj_id = ne.fk_wastewater_structure + LEFT JOIN (SELECT obj_id, + year_of_construction, + structure_condition, + financing, + status, + status_survey_year, + renovation_necessity, + fk_owner, + fk_operator, + ag96_fk_measure + FROM tww_od.wastewater_structure ) ws ON ws.obj_id = ne.fk_wastewater_structure + LEFT JOIN (SELECT code, tww_symbology_order + FROM tww_vl.channel_function_hierarchic) vl_fct_hier ON CH.function_hierarchic = vl_fct_hier.code ) + SELECT DISTINCT ON (wn.obj_id) wn.obj_id AS obj_id, + COALESCE(first_value(ws.year_of_construction) OVER w + , first_value(re_from.year_of_construction) OVER w + , first_value(re_to.year_of_construction) OVER w + , first_value(unc.year_of_construction) OVER w) AS year_of_construction, + COALESCE( first_value(ws.structure_condition) OVER w + , first_value(re_from.structure_condition) OVER w + , first_value(re_to.structure_condition) OVER w + , first_value(unc.structure_condition) OVER w) AS structure_condition, + COALESCE( first_value(ws.status) OVER w + , first_value(re_from.status) OVER w + , first_value(re_to.status) OVER w + , first_value(unc.status) OVER w) AS status, + COALESCE(first_value(ws.financing) OVER w + , first_value(re_from.financing) OVER w + , first_value(re_to.financing) OVER w + , first_value(unc.financing) OVER w) AS financing, + COALESCE(first_value(ws.status_survey_year) OVER w + , first_value(re_from.status_survey_year) OVER w + , first_value(re_to.status_survey_year) OVER w + , first_value(unc.status_survey_year) OVER w) AS status_survey_year, + COALESCE(first_value(ws.renovation_necessity) OVER w + , first_value(re_from.renovation_necessity) OVER w + , first_value(re_to.renovation_necessity) OVER w + , first_value(unc.renovation_necessity) OVER w) AS renovation_necessity, + COALESCE(first_value(ws.fk_owner) OVER w + , first_value(re_from.fk_owner) OVER w + , first_value(re_to.fk_owner) OVER w + , first_value(unc.fk_owner) OVER w) AS fk_owner, + COALESCE(first_value(ws.fk_operator) OVER w + , first_value(re_from.fk_operator) OVER w + , first_value(re_to.fk_operator) OVER w + , first_value(unc.fk_operator) OVER w) AS fk_operator, + COALESCE( first_value(re_from.ch_function_hierarchic) OVER w + , first_value(re_to.ch_function_hierarchic) OVER w + , first_value(unc.ch_function_hierarchic) OVER w) AS ch_function_hierarchic, + ws.fk_main_cover, + ws.accessibility, + COALESCE(first_value(ws.ag96_fk_measure) OVER w + , first_value(re_from.ag96_fk_measure) OVER w + , first_value(re_to.ag96_fk_measure) OVER w + , first_value(unc.ag96_fk_measure) OVER w) AS ag96_fk_measure + + FROM + tww_od.wastewater_node wn + LEFT JOIN (SELECT obj_id, fk_wastewater_structure + FROM tww_od.wastewater_networkelement) ne ON ne.obj_id = wn.obj_id + LEFT JOIN (SELECT obj_id, + year_of_construction, + structure_condition, + financing, + status, + status_survey_year, + renovation_necessity, + fk_owner, + fk_operator, + fk_main_cover, + accessibility, + ag96_fk_measure + FROM tww_od.wastewater_structure ) ws ON ws.obj_id = ne.fk_wastewater_structure + + LEFT JOIN (SELECT obj_id, fk_wastewater_networkelement + FROM tww_od.reach_point) rp ON wn.obj_id = rp.fk_wastewater_networkelement + LEFT JOIN re_meta AS re_from ON re_from.fk_reach_point_from = rp.obj_id + LEFT JOIN re_meta AS re_to ON re_to.fk_reach_point_to = rp.obj_id + LEFT JOIN (SELECT obj_id, + year_of_construction, + structure_condition, + financing, + status, + status_survey_year, + renovation_necessity, + fk_owner, + fk_operator, + ch_function_hierarchic, + ag96_fk_measure + FROM tww_od.agxx_unconnected_node_bwrel) unc ON unc.obj_id=wn.obj_id + LEFT JOIN tww_vl.channel_function_hierarchic vl_fct_hier_unc ON unc.ch_function_hierarchic = vl_fct_hier_unc.code + WINDOW w AS ( PARTITION BY wn.obj_id + ORDER BY re_from.tww_symbology_order ASC NULLS LAST + , re_to.tww_symbology_order ASC NULLS LAST + , vl_fct_hier_unc.tww_symbology_order ASC NULLS LAST + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) + +WITH DATA; + +CREATE INDEX in_app_vw_agxx_knoten_bauwerksattribute_obj_id + ON tww_app.vw_agxx_knoten_bauwerksattribute USING btree + (obj_id) + TABLESPACE pg_default; + +DROP VIEW IF EXISTS tww_app.vw_agxx_gepknoten; +CREATE VIEW tww_app.vw_agxx_gepknoten +AS +SELECT + wn.obj_id AS obj_id + , wn.wwtp_number AS ara_nr + , COALESCE(ws.year_of_construction,1800) AS baujahr + , COALESCE(sc.value_de,'unbekannt') AS baulicherzustand + , CASE WHEN st.value_de = 'in_Betrieb' THEN 'in_Betrieb.in_Betrieb' ELSE COALESCE(st.value_de,'unbekannt') END AS bauwerkstatus + , ne.ag64_remark AS bemerkung_wi + , ne.identifier AS bezeichnung + , COALESCE(co.level,main_co.level,unc.co_level) AS deckelkote + , ST_Force2D(COALESCE(main_ws.detail_geometry3d_geometry,unc.detail_geometry3d_geometry)) AS detailgeometrie + , COALESCE(fi.value_de,'unbekannt') AS finanzierung + , COALESCE( + CASE + when + meas_pt.obj_id IS NOT NULL + AND ss_fu.value_de NOT LIKE ANY (ARRAY['Regenbecken%','Regenueberlauf','Pumpwerk','Dueker%','Versickerungsanlage%']) + THEN + 'Messstelle' + when wn.ag64_function IS NOT NULL THEN 'Anschluss' + when wwtp.obj_id IS NOT NULL THEN 'Abwasserreinigungsanlage' + ELSE NULL + END + , ma_fu_rev.value_de + , ma_fu.value_de + , ss_fu_rev.value_de + , ss_fu.value_de + ,'Einleitstelle_'||dp_rel.value_de + ,'Versickerungsanlage.'||ii_ki_rev.value_de --Versickerungsanlage.andere wird auf unbekannt gemappt + ,'Versickerungsanlage.'||ii_ki.value_de --Versickerungsanlage.andere wird auf unbekannt gemappt + , 'Leitungsknoten') AS funktionag + , COALESCE(left(fhi.value_de,3),'SAA') AS funktionhierarchisch + , COALESCE(isgate.value_de,'unbekannt') AS istschnittstelle + , COALESCE(ws.status_survey_year,1800) AS jahr_zustandserhebung + , ST_Force2D(COALESCE(co.situation3d_geometry,wn.situation3d_geometry)) AS lage + , ne.ag64_last_modification AS letzte_aenderung_wi + , co_pa.value_de AS lagegenauigkeit + , wn.backflow_level_current AS maxrueckstauhoehe + , COALESCE(rn.value_de,'unbekannt') AS sanierungsbedarf + , wn.bottom_level AS sohlenkote + , COALESCE(ac.value_de,'unbekannt') AS zugaenglichkeit + , concat_ws('','ch113jqg0000',right(COALESCE(ws.fk_operator,'00000107'),8)) AS betreiber + , concat_ws('','ch113jqg0000',right(COALESCE(ne.ag64_fk_provider,'00000107'),8)) AS datenbewirtschafter_wi + , concat_ws('','ch113jqg0000',right(COALESCE(ws.fk_owner,'00000107'),8)) AS eigentuemer + , ws.ag96_fk_measure AS gepmassnahmeref + , concat_ws('','ch113jqg0000',right(COALESCE(ne.ag96_fk_provider,'00000107'),8)) AS datenbewirtschafter_gep + , ne.ag96_remark AS bemerkung_gep + , COALESCE(ne.ag96_last_modification,TO_TIMESTAMP('1800-01-01','YYYY-MM-DD')) AS letzte_aenderung_gep + , NULL::boolean AS ignore_ws + , CASE + WHEN ma.obj_id IS NOT NULL THEN 'manhole' + WHEN ss.obj_id IS NOT NULL THEN 'special_structure' + WHEN dp.obj_id IS NOT NULL THEN 'discharge_point' + WHEN ii.obj_id IS NOT NULL THEN 'infiltration_installation' + WHEN wwtp.obj_id IS NOT NULL THEN 'wwtp_structure' + ELSE 'unknown' + END AS ws_type + + +FROM tww_od.wastewater_node wn +LEFT JOIN tww_od.wastewater_networkelement ne ON wn.obj_id = ne.obj_id +LEFT JOIN tww_app.vw_agxx_knoten_bauwerksattribute ws ON wn.obj_id=ws.obj_id +LEFT JOIN tww_od.wastewater_structure main_ws ON wn.obj_id=main_ws.fk_main_wastewater_node + +LEFT JOIN tww_od.measuring_point meas_pt ON main_ws.obj_id=meas_pt.fk_wastewater_structure +LEFT JOIN tww_od.connection_object conn_obj ON ne.obj_id=conn_obj.fk_wastewater_networkelement +LEFT JOIN tww_od.building build ON build.obj_id=conn_obj.obj_id +LEFT JOIN tww_od.wwtp_structure wwtp ON main_ws.obj_id=wwtp.obj_id --tbd: Filtern, dass nur ARA-Zulauf gemappt wird + +LEFT JOIN tww_vl.wastewater_node_ag96_is_gateway isgate ON wn.ag96_is_gateway=isgate.code +LEFT JOIN (SELECT + obj_id, + co_level, + detail_geometry3d_geometry, + co_positional_accuracy + FROM + tww_od.agxx_unconnected_node_bwrel) unc ON unc.obj_id=wn.obj_id + +LEFT JOIN tww_vl.wastewater_structure_status st ON st.code=ws.status + +LEFT JOIN tww_od.manhole ma ON main_ws.obj_id = ma.obj_id +LEFT JOIN tww_vl.manhole_function ma_fu ON ma_fu.code=ma.function +LEFT JOIN tww_vl.manhole_function_export_rel_agxx ma_fu_rev ON ma_fu_rev.code=ma.function +LEFT JOIN tww_od.special_structure ss ON main_ws.obj_id = ss.obj_id +LEFT JOIN tww_vl.special_structure_function ss_fu ON ss_fu.code=ss.function +LEFT JOIN tww_vl.special_structure_function_export_rel_agxx ss_fu_rev ON ss_fu_rev.code=ss.function +LEFT JOIN tww_od.infiltration_installation ii ON main_ws.obj_id = ii.obj_id +LEFT JOIN tww_vl.infiltration_installation_kind ii_ki ON ii_ki.code=ii.kind +LEFT JOIN tww_vl.infiltration_installation_kind_export_rel_agxx ii_ki_rev ON ii_ki_rev.code=ii.kind +LEFT JOIN tww_od.discharge_point dp ON main_ws.obj_id = dp.obj_id +LEFT JOIN tww_vl.discharge_point_relevance dp_rel ON dp_rel.code=dp.relevance + +LEFT JOIN tww_vl.wastewater_structure_structure_condition sc ON sc.code=ws.structure_condition +LEFT JOIN tww_vl.wastewater_structure_renovation_necessity rn ON rn.code=ws.renovation_necessity +LEFT JOIN tww_vl.wastewater_structure_financing fi ON fi.code=ws.financing +LEFT JOIN tww_vl.channel_function_hierarchic fhi ON fhi.code=wn._function_hierarchic + +LEFT JOIN tww_od.cover co ON co.ag64_fk_wastewater_node = wn.obj_id -- only overwrite position of main wn +LEFT JOIN tww_od.cover main_co ON main_co.obj_id=ws.fk_main_cover +LEFT JOIN tww_vl.cover_positional_accuracy co_pa ON co_pa.code=coalesce(co.positional_accuracy,main_co.positional_accuracy,unc.co_positional_accuracy) +LEFT JOIN tww_vl.wastewater_structure_accessibility ac ON ac.code=ws.accessibility; + +------------------ +-- GEPHaltung +------------------ + +DROP VIEW IF EXISTS tww_app.vw_agxx_gephaltung; +CREATE OR REPLACE VIEW tww_app.vw_agxx_gephaltung +AS + +SELECT + re.obj_id AS obj_id + , ws.year_of_construction AS baujahr + , sc.value_de AS baulicherzustand + , CASE WHEN st.value_de = 'in_Betrieb' THEN 'in_Betrieb.in_Betrieb' ELSE st.value_de END AS bauwerkstatus + , ne.ag64_remark AS bemerkung_wi + , ne.identifier AS bezeichnung + , fi.value_de AS finanzierung + , fhi.value_de AS funktionhierarchisch + , fhy.value_de AS funktionhydraulisch + , ea_to.value_de AS hoehengenauigkeit_nach + , ea_from.value_de AS hoehengenauigkeit_von + , re.hydraulic_load_current AS hydraulischebelastung + , ws.status_survey_year AS jahr_zustandserhebung + , NULLIF(rp_from.level,0) AS kote_beginn + , NULLIF(rp_to.level,0)AS kote_ende + , ne.ag64_last_modification AS letzte_aenderung_wi + , re.ag96_clear_width_planned AS lichte_breite_geplant + , CASE + WHEN pp.height_width_ratio IS NOT NULL THEN round(re.clear_height::numeric / pp.height_width_ratio)::smallint::integer + ELSE re.clear_height + END AS lichte_breite_ist + , re.ag96_clear_height_planned AS lichte_hoehe_geplant + , re.clear_height AS lichte_hoehe_ist + , re.length_effective AS laengeeffektiv + , mat.value_de AS material + , ppt.value_de AS profiltyp + , COALESCE (up_rev.value_de,up.value_de) AS nutzungsartag_geplant + , COALESCE (uc_rev.value_de, uc.value_de) AS nutzungsartag_ist + , relkind.value_de AS reliner_art + , relcons.value_de AS reliner_bautechnik + , relmat.value_de AS reliner_material + , re.reliner_nominal_size AS reliner_nennweite + , rn.value_de AS sanierungsbedarf + , ST_Force2D(re.progression3d_geometry) AS verlauf + , ws.rv_base_year AS wbw_basisjahr + , ws.replacement_value AS wiederbeschaffungswert + , concat_ws('','ch113jqg0000',right(COALESCE(ws.fk_operator,'00000107'),8)) AS betreiber + , concat_ws('','ch113jqg0000',right(COALESCE(ne.ag64_fk_provider,'00000107'),8)) AS datenbewirtschafter_wi + , concat_ws('','ch113jqg0000',right(COALESCE(ws.fk_owner,'00000107'),8)) AS eigentuemer + , rp_to.fk_wastewater_networkelement AS endknoten + , rp_from.fk_wastewater_networkelement AS startknoten + , ws.ag96_fk_measure AS gepmassnahmeref + , concat_ws('','ch113jqg0000',right(COALESCE(ne.ag96_fk_provider,'00000107'),8)) AS datenbewirtschafter_gep + , ne.ag96_remark AS bemerkung_gep + , COALESCE(ne.ag96_last_modification,TO_TIMESTAMP('1800-01-01','YYYY-MM-DD')) AS letzte_aenderung_gep + +FROM tww_od.reach re + LEFT JOIN tww_od.wastewater_networkelement ne ON ne.obj_id = re.obj_id + LEFT JOIN tww_od.reach_point rp_from ON rp_from.obj_id = re.fk_reach_point_from + LEFT JOIN tww_od.reach_point rp_to ON rp_to.obj_id = re.fk_reach_point_to + LEFT JOIN tww_od.wastewater_structure ws ON ne.fk_wastewater_structure = ws.obj_id + LEFT JOIN tww_od.channel ch ON ch.obj_id = ws.obj_id + LEFT JOIN tww_od.pipe_profile pp ON re.fk_pipe_profile = pp.obj_id + + LEFT JOIN tww_vl.reach_reliner_material relmat ON relmat.code=re.reliner_material + LEFT JOIN tww_vl.reach_relining_construction relcons ON relcons.code=re.relining_construction + LEFT JOIN tww_vl.reach_relining_kind relkind ON relkind.code=re.relining_kind + LEFT JOIN tww_vl.reach_point_elevation_accuracy ea_from ON ea_from.code=rp_from.elevation_accuracy + LEFT JOIN tww_vl.reach_point_elevation_accuracy ea_to ON ea_to.code=rp_to.elevation_accuracy + LEFT JOIN tww_vl.wastewater_structure_financing fi ON fi.code=ws.financing + LEFT JOIN tww_vl.wastewater_structure_renovation_necessity rn ON rn.code=ws.renovation_necessity + LEFT JOIN tww_vl.wastewater_structure_structure_condition sc ON sc.code=ws.structure_condition + + LEFT JOIN tww_vl.channel_function_hierarchic fhi ON fhi.code=ch.function_hierarchic + LEFT JOIN tww_vl.channel_function_hydraulic fhy ON fhy.code=ch.function_hydraulic + LEFT JOIN tww_vl.reach_material mat ON mat.code=re.material + LEFT JOIN tww_vl.pipe_profile_profile_type ppt ON ppt.code=pp.profile_type + LEFT JOIN tww_vl.wastewater_structure_status st ON st.code=ws.status + LEFT JOIN tww_vl.channel_usage_current uc ON uc.code=ch.usage_current + LEFT JOIN tww_vl.channel_usage_current_export_rel_agxx uc_rev ON uc_rev.code=ch.usage_current + LEFT JOIN tww_vl.channel_usage_planned up ON up.code=ch.usage_planned + LEFT JOIN tww_vl.channel_usage_planned_export_rel_agxx up_rev ON up_rev.code=ch.usage_planned + +; + + +------------------ +-- GEPMassnahme +------------------ +DROP VIEW IF EXISTS tww_app.vw_agxx_gepmassnahme; +CREATE VIEW tww_app.vw_agxx_gepmassnahme +AS +SELECT + msr.obj_id + , msr.line_geometry AS ausdehnung + , msr.description AS beschreibung + , msr.identifier AS bezeichnung + , msr.date_entry AS datum_eingang + , msr.total_cost AS gesamtkosten + , msr.intervention_demand AS handlungsbedarf + , msr.year_implementation_effective AS jahr_umsetzung_effektiv + , msr.year_implementation_planned AS jahr_umsetzung_geplant + , msr_ct.value_de AS kategorie + , msr.perimeter_geometry AS perimeter + , msr_pri.value_de AS prioritaetag + , msr_st.value_de AS status + , msr.symbolpos_geometry AS symbolpos + , msr.link AS verweis + , concat_ws('','ch113jqg0000',right(COALESCE(msr.fk_responsible_entity,'00000107'),8)) AS traegerschaft + , concat_ws('','ch113jqg0000',right(COALESCE(msr.fk_responsible_start,'00000107'),8)) AS verantwortlich_ausloesung + , concat_ws('','ch113jqg0000',right(COALESCE(msr.fk_provider,'00000107'),8)) AS datenbewirtschafter_gep + , msr.remark AS bemerkung_gep + , COALESCE(msr.last_modification,TO_TIMESTAMP('1800-01-01','YYYY-MM-DD')) AS letzte_aenderung_gep + +FROM tww_od.measure msr + LEFT JOIN tww_vl.measure_category msr_ct ON msr_ct.code = msr.category + LEFT JOIN tww_vl.measure_priority msr_pri ON msr_pri.code = msr.priority + LEFT JOIN tww_vl.measure_status msr_st ON msr_st.code = msr.status + + ; + + +------------------ +-- Einzugsgebiet +------------------ +DROP VIEW IF EXISTS tww_app.vw_agxx_einzugsgebiet; +CREATE VIEW tww_app.vw_agxx_einzugsgebiet +AS +SELECT + ca.obj_id + , ca.runoff_limit_planned AS abflussbegrenzung_geplant + , ca.runoff_limit_current AS abflussbegrenzung_ist + , ca.discharge_coefficient_rw_planned AS abflussbeiwert_rw_geplant + , ca.discharge_coefficient_rw_current AS abflussbeiwert_rw_ist + , ca.discharge_coefficient_ww_planned AS abflussbeiwert_sw_geplant + , ca.discharge_coefficient_ww_current AS abflussbeiwert_sw_ist + , ca.seal_factor_rw_planned AS befestigungsgrad_rw_geplant + , ca.seal_factor_rw_current AS befestigungsgrad_rw_ist + , ca.seal_factor_ww_planned AS befestigungsgrad_sw_geplant + , ca.seal_factor_ww_current AS befestigungsgrad_sw_ist + , ca.identifier AS bezeichnung + , ddp.value_de AS direkteinleitung_in_gewaesser_geplant + , ddc.value_de AS direkteinleitung_in_gewaesser_ist + , ca.population_density_planned AS einwohnerdichte_geplant + , ca.population_density_current AS einwohnerdichte_ist + , COALESCE (dsp_rev.value_de,dsp.value_de) AS entwaesserungssystemag_geplant + , COALESCE (dsc_rev.value_de,dsc.value_de) AS entwaesserungssystemag_ist + , ca.surface_area AS flaeche + , ca.sewer_infiltration_water_production_planned AS fremdwasseranfall_geplant + , ca.sewer_infiltration_water_production_current AS fremdwasseranfall_ist + , ca.perimeter_geometry AS perimeter + , 'Berechnungspunkt' AS perimetertyp + , rp.value_de AS retention_geplant + , rc.value_de AS retention_ist + , ca.waste_water_production_planned AS schmutzabwasseranfall_geplant + , ca.waste_water_production_current AS schmutzabwasseranfall_ist + , ip.value_de AS versickerung_geplant + , ic.value_de AS versickerung_ist + , ca.fk_wastewater_networkelement_rw_planned AS gepknoten_rw_geplantref + , ca.fk_wastewater_networkelement_rw_current AS gepknoten_rw_istref + , ca.fk_wastewater_networkelement_ww_planned AS gepknoten_sw_geplantref + , ca.fk_wastewater_networkelement_ww_current AS gepknoten_sw_istref + , concat_ws('','ch113jqg0000',right(COALESCE(ca.fk_provider,'00000107'),8)) AS datenbewirtschafter_gep + , ca.remark AS bemerkung_gep + , COALESCE(ca.last_modification,TO_TIMESTAMP('1800-01-01','YYYY-MM-DD')) AS letzte_aenderung_gep + +FROM tww_od.catchment_area ca + LEFT JOIN tww_vl.catchment_area_direct_discharge_current ddc ON ddc.code = ca.direct_discharge_current + LEFT JOIN tww_vl.catchment_area_direct_discharge_planned ddp ON ddp.code = ca.direct_discharge_planned + LEFT JOIN tww_vl.catchment_area_drainage_system_current dsc ON dsc.code = ca.drainage_system_current + LEFT JOIN tww_vl.catchment_area_drainage_system_planned dsp ON dsp.code = ca.drainage_system_planned + LEFT JOIN tww_vl.catchment_area_infiltration_current ic ON ic.code = ca.infiltration_current + LEFT JOIN tww_vl.catchment_area_infiltration_planned ip ON ip.code = ca.infiltration_planned + LEFT JOIN tww_vl.catchment_area_retention_current rc ON rc.code = ca.retention_current + LEFT JOIN tww_vl.catchment_area_retention_planned rp ON rp.code = ca.retention_planned + LEFT JOIN tww_vl.catchment_area_drainage_system_planned_export_rel_agxx dsp_rev ON dsp_rev.code = ca.drainage_system_planned + LEFT JOIN tww_vl.catchment_area_drainage_system_current_export_rel_agxx dsc_rev ON dsc_rev.code = ca.drainage_system_current +; + + +---------------------------- +-- Ueberlauf_Foerderaggregat +---------------------------- +DROP VIEW IF EXISTS tww_app.vw_agxx_ueberlauf_foerderaggregat; +CREATE VIEW tww_app.vw_agxx_ueberlauf_foerderaggregat +AS +SELECT + ov.obj_id + , CASE + WHEN pu.obj_id IS NOT NULL THEN 'Foerderaggregat' + WHEN lw.obj_id IS NOT NULL THEN 'Leapingwehr' + WHEN pw.obj_id IS NOT NULL THEN 'Streichwehr' + END AS art + , ov.identifier AS bezeichnung + , ov.fk_wastewater_node AS knotenref + , ov.fk_overflow_to AS knoten_nachref + , concat_ws('','ch113jqg0000',right(COALESCE(ne.ag64_fk_provider,'00000107'),8)) AS datenbewirtschafter_wi + , ov.ag64_remark AS bemerkung_wi + , ov.ag64_last_modification AS letzte_aenderung_wi + , concat_ws('','ch113jqg0000',right(COALESCE(ne.ag96_fk_provider,'00000107'),8)) AS datenbewirtschafter_gep + , ov.ag96_remark AS bemerkung_gep + , COALESCE(ov.ag96_last_modification,TO_TIMESTAMP('1800-01-01','YYYY-MM-DD')) AS letzte_aenderung_gep + , CASE + WHEN pu.obj_id IS NOT NULL THEN 'pump'::text + WHEN lw.obj_id IS NOT NULL THEN 'leapingweir'::text + WHEN pw.obj_id IS NOT NULL THEN 'prank_weir'::text + ELSE 'unknown'::text + END AS ov_type + +FROM tww_od.overflow ov + LEFT JOIN tww_od.pump pu ON ov.obj_id = pu.obj_id + LEFT JOIN tww_od.leapingweir lw ON ov.obj_id = lw.obj_id + LEFT JOIN tww_od.prank_weir pw ON ov.obj_id = pw.obj_id + LEFT JOIN tww_od.wastewater_networkelement ne ON ne.obj_id=ov.fk_wastewater_node +; + + +---------------------------- +-- Bautenausserhalbbaugebiet +---------------------------- +DROP VIEW IF EXISTS tww_app.vw_agxx_bautenausserhalbbaugebiet; +CREATE OR REPLACE VIEW tww_app.vw_agxx_bautenausserhalbbaugebiet +AS +SELECT + bg.obj_id + , bg.ag96_population AS anzstaendigeeinwohner + , COALESCE(bg_fct_rev.value_de, bg_fct.value_de) AS arealnutzung + , bg_dt_ww.value_de AS beseitigung_haeusliches_abwasser + , bg_dt_iw.value_de AS beseitigung_gewerbliches_abwasser + , bg_dt_sw.value_de AS beseitigung_platzentwaesserung + , bg_dt_rw.value_de AS beseitigung_dachentwaesserung + , bg.identifier AS bezeichnung + , bg.ag96_owner_address AS eigentuemeradresse + , bg.ag96_owner_name AS eigentuemername + , bg.population_equivalent AS einwohnergleichwert + , bg.situation_geometry AS lage + , bg.ag96_label_number AS nummer + , INITCAP(bg_rn.value_de) AS sanierungsbedarf + , bg.renovation_date AS sanierungsdatum + , bg.restructuring_concept AS sanierungskonzept + , concat_ws('','ch113jqg0000',right(COALESCE(bg.fk_provider,'00000107'),8)) AS datenbewirtschafter_gep + , bg.remark AS bemerkung_gep + , COALESCE(bg.last_modification,TO_TIMESTAMP('1800-01-01','YYYY-MM-DD')) AS letzte_aenderung_gep +FROM tww_od.building_group bg + LEFT JOIN tww_vl.building_group_function bg_fct ON bg_fct.code = bg.function + LEFT JOIN tww_vl.building_group_function_export_rel_agxx bg_fct_rev ON bg_fct_rev.code = bg.function + LEFT JOIN tww_vl.building_group_renovation_necessity bg_rn ON bg_rn.code = bg.renovation_necessity + LEFT JOIN tww_vl.building_group_ag96_disposal_type bg_dt_ww ON bg_dt_ww.code = bg.ag96_disposal_wastewater + LEFT JOIN tww_vl.building_group_ag96_disposal_type bg_dt_iw ON bg_dt_iw.code = bg.ag96_disposal_industrial_wastewater + LEFT JOIN tww_vl.building_group_ag96_disposal_type bg_dt_sw ON bg_dt_sw.code = bg.ag96_disposal_square_water + LEFT JOIN tww_vl.building_group_ag96_disposal_type bg_dt_rw ON bg_dt_rw.code = bg.ag96_disposal_roof_water +; + + +---------------------------- +-- SBW_Einzugsgebiet +---------------------------- +DROP VIEW IF EXISTS tww_app.vw_agxx_sbw_einzugsgebiet; +CREATE OR REPLACE VIEW tww_app.vw_agxx_sbw_einzugsgebiet + AS + SELECT cat.obj_id, + cat.identifier AS bezeichnung, + cat.population_dim AS einwohner_geplant, + cat.population AS einwohner_ist, + cat.surface_dim AS flaeche_geplant, + cat.surface_area AS flaeche_ist, + cat.surface_imp_dim AS flaeche_befestigt_geplant, + cat.surface_imp AS flaeche_befestigt_ist, + cat.surface_red_dim AS flaeche_reduziert_geplant, + cat.surface_red AS flaeche_reduziert_ist, + cat.ag96_sewer_infiltration_water_dim AS fremdwasseranfall_geplant, + cat.sewer_infiltration_water AS fremdwasseranfall_ist, + cat.ag96_perimeter_geometry AS perimeter_ist, + cat.ag96_waste_water_production_dim AS schmutzabwasseranfall_geplant, + cat.waste_water_production AS schmutzabwasseranfall_ist, + cat.fk_discharge_point AS einleitstelleref, + wn.obj_id AS sonderbauwerk_ref, + concat_ws('', 'ch113jqg0000', right(COALESCE(cat.fk_provider, '00000107'), 8)) AS datenbewirtschafter_gep, + hcd.remark AS bemerkung_gep, + COALESCE(cat.last_modification, to_timestamp('1800-01-01', 'YYYY-MM-DD')) AS letzte_aenderung_gep + FROM tww_od.catchment_area_totals cat + LEFT JOIN tww_od.hydraulic_char_data hcd ON hcd.obj_id = cat.fk_hydraulic_char_data + LEFT JOIN tww_od.wastewater_node wn ON hcd.fk_wastewater_node = wn.obj_id +; + + +---------------------------- +-- VersickerungsbereichAG +---------------------------- +DROP VIEW IF EXISTS tww_app.vw_agxx_versickerungsbereichag; +CREATE VIEW tww_app.vw_agxx_versickerungsbereichag +AS +SELECT + iz.obj_id + , zo.identifier AS bezeichnung + , iz.ag96_permeability AS durchlaessigkeit + , iz.ag96_limitation AS einschraenkung + , iz.ag96_thickness AS maechtigkeit + , iz.perimeter_geometry AS perimeter + , iz.ag96_q_check as q_check + , COALESCE (iz_ic_rev.value_de,iz_ic.value_de) AS versickerungsmoeglichkeitag + , concat_ws('','ch113jqg0000',right(COALESCE(zo.fk_provider,'00000107'),8)) AS datenbewirtschafter_gep + , zo.remark AS bemerkung_gep + , COALESCE(zo.last_modification,TO_TIMESTAMP('1800-01-01','YYYY-MM-DD')) AS letzte_aenderung_gep +FROM tww_od.infiltration_zone iz + LEFT JOIN tww_od.zone zo ON zo.obj_id = iz.obj_id + LEFT JOIN tww_vl.infiltration_zone_infiltration_capacity iz_ic ON iz_ic.code = iz.infiltration_capacity + LEFT JOIN tww_vl.infiltration_zone_infiltration_capacity_export_rel_agxx iz_ic_rev ON iz_ic_rev.code = iz.infiltration_capacity; diff --git a/datamodel/app/extensions/tww2ag6496/006_functions.sql b/datamodel/app/extensions/tww2ag6496/006_functions.sql new file mode 100644 index 000000000..ec45f3e1e --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/006_functions.sql @@ -0,0 +1,66 @@ +--------------------------------- +-------- Metainformation -------- +--------------------------------- +CREATE OR REPLACE FUNCTION tww_app.modification_last_modified_agxx() +RETURNS trigger AS +$BODY$ + DECLARE + update_type varchar(3); + BEGIN + BEGIN + SELECT + ag_update_type + INTO update_type + FROM tww_cfg.agxx_last_modification_updater + WHERE username=current_user; + CASE + WHEN update_type IN('wi','both') THEN NEW.ag64_last_modification=now(); + ELSE NULL; + END CASE; + CASE + WHEN update_type IN('gep','both') THEN NEW.ag96_last_modification=now(); + ELSE NULL; + END CASE; + END; + RETURN NEW; + END; +$BODY$ +LANGUAGE plpgsql; + + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_update_catchment_area_totals_geoms + (_obj_id varchar(16),_all boolean DEFAULT FALSE) + RETURNS VOID AS + $BODY$ + BEGIN + UPDATE tww_od.catchment_area_totals cat + SET ag96_perimeter_geometry =ca_agg.perimeter_geometry + FROM + ( WITH ca AS + ( + SELECT catchment_area.fk_special_building_ww_current AS fk_log_card, + catchment_area.perimeter_geometry AS geom + FROM tww_od.catchment_area + WHERE catchment_area.fk_special_building_ww_current IS NOT NULL + UNION + SELECT catchment_area.fk_special_building_rw_current AS fk_log_card, + catchment_area.perimeter_geometry AS geom + FROM tww_od.catchment_area + WHERE catchment_area.fk_special_building_rw_current IS NOT NULL + ) + SELECT ca_tot.obj_id, + ST_Multi(ST_ForceCurve(ST_UnaryUnion(st_Collect(ca.geom)))) AS perimeter_geometry + FROM ca + LEFT JOIN tww_od.log_card lc ON ca.fk_log_card = lc.obj_id + LEFT JOIN tww_od.log_card main_lc ON main_lc.obj_id = lc.fk_main_structure + LEFT JOIN tww_od.wastewater_node wn ON main_lc.fk_pwwf_wastewater_node::text = wn.obj_id::text + LEFT JOIN tww_od.hydraulic_char_data hcd ON hcd.fk_wastewater_node = wn.obj_id + LEFT JOIN tww_od.catchment_area_totals ca_tot ON hcd.obj_id = ca_tot.fk_hydraulic_char_data + WHERE _all OR _obj_id=ca_tot.obj_id + GROUP BY ca_tot.obj_id + ) ca_agg + WHERE ca_agg.obj_id::text = cat.obj_id::text; + END; + $BODY$ + LANGUAGE plpgsql + VOLATILE; diff --git a/datamodel/app/extensions/tww2ag6496/101_ag96_triggerfuncs_node.sql b/datamodel/app/extensions/tww2ag6496/101_ag96_triggerfuncs_node.sql new file mode 100644 index 000000000..591b17bea --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/101_ag96_triggerfuncs_node.sql @@ -0,0 +1,421 @@ +---------------- +-- Knoten +---------------- + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gepknoten_insert() +RETURNS trigger AS +$BODY$ +DECLARE + co_oid varchar(16); + ws_oid varchar(16); +BEGIN + + INSERT INTO tww_od.wastewater_networkelement( + obj_id + , identifier + , fk_provider + , ag64_last_modification + , ag64_remark + , ag64_fk_provider + , ag96_last_modification + , ag96_remark + , ag96_fk_provider + ) VALUES + ( + NEW.obj_id + , NEW.bezeichnung + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.letzte_aenderung_wi + , NEW.bemerkung_wi + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.letzte_aenderung_gep + , NEW.bemerkung_gep + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + ); + + INSERT INTO tww_od.wastewater_node( + obj_id + , backflow_level_current + , bottom_level + , situation3d_geometry + , wwtp_number + , ag96_is_gateway + , ag64_function + ) VALUES + ( + NEW.obj_id + , NEW.maxrueckstauhoehe + , NEW.sohlenkote + , ST_SetSRID(ST_MakePoint(ST_X(NEW.lage), ST_Y(NEW.lage), COALESCE(NEW.sohlenkote,'nan')), 2056 ) + , NEW.ara_nr + , (SELECT code FROM tww_vl.wastewater_node_ag96_is_gateway WHERE value_de=NEW.istschnittstelle) + , (SELECT code FROM tww_vl.wastewater_node_ag64_function WHERE value_de=NEW.funktionag) + ); + + CASE WHEN NEW.funktionag NOT IN ('Leitungsknoten','Anschluss') THEN + -- Deckel + INSERT INTO tww_od.structure_part( + fk_provider + , identifier + , last_modification + ) VALUES + ( + tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.bezeichnung + , NEW.letzte_aenderung_wi + ) + RETURNING obj_id into co_oid; + + INSERT INTO tww_od.cover( + obj_id + , level + , positional_accuracy + , situation3d_geometry + , ag64_fk_wastewater_node + ) VALUES + ( + co_oid + , NEW.deckelkote + , (SELECT code FROM tww_vl.cover_positional_accuracy WHERE value_de=NEW.lagegenauigkeit) + , ST_SetSRID(ST_MakePoint(ST_X(NEW.lage), ST_Y(NEW.lage), COALESCE(NEW.deckelkote,'nan')), 2056 ) + , NEW.obj_id + ); + ELSE NULL; + END CASE; + + CASE WHEN COALESCE(NEW.ignore_ws,FALSE) OR NEW.funktionag IN ('Leitungsknoten','Anschluss') + THEN NULL; + ELSE + INSERT INTO tww_od.wastewater_structure( + accessibility + , detail_geometry3d_geometry + , financing + , fk_main_cover + , fk_main_wastewater_node + , fk_operator + , fk_owner + , fk_provider + , identifier + , last_modification + , remark + , renovation_necessity + , status + , status_survey_year + , structure_condition + , year_of_construction + , ag96_fk_measure + ) VALUES + ( + (SELECT code FROM tww_vl.wastewater_structure_accessibility WHERE value_de=NEW.zugaenglichkeit) + , ST_Force3D(NEW.detailgeometrie) + , (SELECT code FROM tww_vl.wastewater_structure_financing WHERE value_de=NEW.finanzierung) + , co_oid + , NEW.obj_id + , tww_app.fct_agxx_organisationid_to_vsa(NEW.betreiber) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.eigentuemer) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.bezeichnung + , NEW.letzte_aenderung_wi + , NEW.bemerkung_wi + , (SELECT code FROM tww_vl.wastewater_structure_renovation_necessity WHERE value_de=NEW.sanierungsbedarf) + , (SELECT code FROM tww_vl.wastewater_structure_status WHERE value_de=replace(NEW.bauwerkstatus,'.in_Betrieb','')) + , NEW.jahr_zustandserhebung + , (SELECT code FROM tww_vl.wastewater_structure_structure_condition WHERE value_de=NEW.baulicherzustand) + , NEW.baujahr + , NEW.gepmassnahmeref + ) + RETURNING obj_id into ws_oid; + + UPDATE tww_od.wastewater_networkelement + SET fk_wastewater_structure = ws_oid + WHERE obj_id=NEW.obj_id; + + CASE WHEN NEW.funktionag ='Abwasserreinigungsanlage' THEN + ------------ Abwasserreinigungsanlage ------------ + INSERT INTO tww_od.wwtp_stucture( + obj_id + , kind + )VALUES + ( + ws_oid + , 3032 --unbekannt + ); + WHEN NEW.funktionag =ANY( + ARRAY[ + 'Bodenablauf' + , 'Dachwasserschacht' + , 'Einlaufschacht' + , 'Entwaesserungsrinne' + , 'Faulgrube' + , 'Geleiseschacht' + , 'Schlammfang' + , 'Schlammsammler' + ] + ) OR ( + NEW.funktionag = ANY(ARRAY['Absturzbauwerk', 'andere', 'Be_Entlueftung', 'Kontrollschacht', 'Oelabscheider', 'Pumpwerk' + , 'Regeneuberlauf', 'Schwimmstoffabscheider', 'Spuelschacht', 'Trennbauwerk', 'Vorbehandlung']) AND NEW.detailgeometrie IS NULL + ) THEN + INSERT INTO tww_od.manhole ( + obj_id + , function + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.manhole_function_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + WHEN NEW.funktionag LIKE 'Versickerungsanlage%' THEN + INSERT INTO tww_od.infiltration_installation ( + obj_id + , kind + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.infiltration_installation_kind_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + WHEN NEW.funktionag LIKE 'Einleitstelle%' THEN + INSERT INTO tww_od.discharge_point ( + obj_id + , relevance + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.discharge_point_relevance_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + WHEN NEW.funktionag = 'Messstelle' THEN + INSERT INTO tww_od.manhole ( + obj_id + , function + )VALUES + ( + ws_oid + , 5345 + ); + INSERT INTO tww_od.measuring_point ( + fk_wastewater_structure + )VALUES + ( + ws_oid + ); + ELSE + INSERT INTO tww_od.special_structure ( + obj_id + , function + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.special_structure_function_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + END CASE; + + END CASE; + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gepknoten_update() +RETURNS trigger AS +$BODY$ +DECLARE + co_oid varchar(16); + ws_oid varchar(16); + +BEGIN + + UPDATE tww_od.wastewater_networkelement SET + identifier = NEW.bezeichnung + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , ag64_last_modification = NEW.letzte_aenderung_wi + , ag64_remark = NEW.bemerkung_wi + , ag64_fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , ag96_last_modification = NEW.letzte_aenderung_gep + , ag96_remark = NEW.bemerkung_gep + , ag96_fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + WHERE obj_id = NEW.obj_id; + + UPDATE tww_od.wastewater_node SET + backflow_level_current = NEW.maxrueckstauhoehe + , bottom_level = NEW.sohlenkote + , situation3d_geometry = ST_SetSRID(ST_MakePoint(ST_X(NEW.lage), ST_Y(NEW.lage), COALESCE(NEW.sohlenkote,'nan')), 2056) + , wwtp_number = NEW.ara_nr + , ag96_is_gateway = (SELECT code FROM tww_vl.wastewater_node_ag96_is_gateway WHERE value_de=NEW.istschnittstelle) + , ag64_function = (SELECT code FROM tww_vl.wastewater_node_ag64_function WHERE value_de=NEW.funktionag) + WHERE obj_id = NEW.obj_id; + + CASE WHEN NEW.funktionag NOT IN ('Leitungsknoten','Anschluss') THEN + + SELECT ws.obj_id,ws.fk_main_cover INTO ws_oid, co_oid FROM tww_od.wastewater_node wn + LEFT JOIN tww_od.wastewater_networkelement ne ON ne.obj_id=wn.obj_id + LEFT JOIN tww_od.wastewater_structure ws ON ne.fk_wastewater_structure = ws.obj_id; + + -- Deckel + UPDATE tww_od.structure_part SET + fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , identifier = NEW.bezeichnung + , last_modification = NEW.letzte_aenderung_wi + WHERE obj_id = co_oid; + + UPDATE tww_od.cover SET + level = NEW.deckelkote + , positional_accuracy = (SELECT code FROM tww_vl.cover_positional_accuracy WHERE value_de=NEW.lagegenauigkeit) + , situation3d_geometry = ST_SetSRID(ST_MakePoint(ST_X(NEW.lage), ST_Y(NEW.lage), COALESCE(NEW.deckelkote,'nan')), 2056 ) + , ag64_fk_wastewater_node = NEW.obj_id + WHERE obj_id = co_oid; + + ELSE NULL; + END CASE; + + CASE WHEN COALESCE(NEW.ignore_ws,FALSE) OR NEW.funktionag IN ('Leitungsknoten','Anschluss') + THEN NULL; + ELSE + UPDATE tww_od.wastewater_structure SET + accessibility = (SELECT code FROM tww_vl.wastewater_structure_accessibility WHERE value_de=NEW.zugaenglichkeit) + , detail_geometry3d_geometry = ST_Force3D(NEW.detailgeometrie) + , financing = (SELECT code FROM tww_vl.wastewater_structure_financing WHERE value_de=NEW.finanzierung) + , fk_main_cover = co_oid + , fk_main_wastewater_node = NEW.obj_id + , fk_operator = tww_app.fct_agxx_organisationid_to_vsa(NEW.betreiber) + , fk_owner = tww_app.fct_agxx_organisationid_to_vsa(NEW.eigentuemer) + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , identifier = NEW.bezeichnung + , last_modification = NEW.letzte_aenderung_wi + , remark = NEW.bemerkung_wi + , renovation_necessity = (SELECT code FROM tww_vl.wastewater_structure_renovation_necessity WHERE value_de=NEW.sanierungsbedarf) + , status = (SELECT code FROM tww_vl.wastewater_structure_status WHERE value_de=replace(NEW.bauwerkstatus,'.in_Betrieb','')) + , status_survey_year = NEW.jahr_zustandserhebung + , structure_condition = (SELECT code FROM tww_vl.wastewater_structure_structure_condition WHERE value_de=NEW.baulicherzustand) + , year_of_construction = NEW.baujahr + , ag96_fk_measure = NEW.gepmassnahmeref + WHERE obj_id = ws_oid; + + + + CASE WHEN NEW.funktionag ='Abwasserreinigungsanlage' + THEN + CASE WHEN OLD.ws_type = 'wwtp_stucture' + THEN NULL; + ELSE + ------------ Abwasserreinigungsanlage ------------ + INSERT INTO tww_od.wwtp_stucture( + obj_id, kind + )VALUES + ( + ws_oid, 3032 --unbekannt + ); + DELETE FROM tww_od.manhole WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.special_structure WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.infiltration_installation WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.discharge_point WHERE obj_id = OLD.obj_id; + END CASE; + WHEN NEW.funktionag =ANY( + ARRAY[ + 'Bodenablauf' + , 'Dachwasserschacht' + , 'Einlaufschacht' + , 'Entwaesserungsrinne' + , 'Faulgrube' + , 'Geleiseschacht' + , 'Schlammfang' + , 'Schlammsammler' + ] + ) OR ( + NEW.funktionag = ANY(ARRAY['Absturzbauwerk', 'andere', 'Be_Entlueftung', 'Kontrollschacht', 'Oelabscheider', 'Pumpwerk' + , 'Regeneuberlauf', 'Schwimmstoffabscheider', 'Spuelschacht', 'Trennbauwerk', 'Vorbehandlung']) AND NEW.detailgeometrie IS NULL + ) THEN + CASE WHEN OLD.ws_type = 'manhole' THEN + UPDATE tww_od.manhole SET + function = (SELECT code FROM tww_vl.manhole_function_import_rel_agxx WHERE value_de=NEW.funktionag) + WHERE obj_id = ws_oid + ; + ELSE + ------------ Normschacht ------------ + INSERT INTO tww_od.manhole ( + obj_id + , function + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.manhole_function_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + DELETE FROM tww_od.wwtp_stucture WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.special_structure WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.infiltration_installation WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.discharge_point WHERE obj_id = OLD.obj_id; + END CASE; + WHEN NEW.funktionag LIKE 'Versickerungsanlage%' THEN + CASE WHEN OLD.ws_type = 'infiltration_installation' THEN + UPDATE tww_od.infiltration_installation SET + kind = (SELECT code FROM tww_vl.infiltration_installation_kind_import_rel_agxx WHERE value_de=NEW.funktionag) + WHERE obj_id = ws_oid + ; + ELSE + ------------ Versickerungsanlage ------------ + INSERT INTO tww_od.infiltration_installation ( + obj_id + , kind + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.infiltration_installation_kind_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + DELETE FROM tww_od.wwtp_stucture WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.special_structure WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.manhole WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.discharge_point WHERE obj_id = OLD.obj_id; + END CASE; + WHEN NEW.funktionag LIKE 'Einleitstelle%' THEN + CASE WHEN OLD.ws_type = 'discharge_point' THEN + UPDATE tww_od.discharge_point SET + relevance = (SELECT code FROM tww_vl.discharge_point_relevance_import_rel_agxx WHERE value_de=NEW.funktionag) + WHERE obj_id = ws_oid; + ELSE + ------------ Einleitstelle ------------ + INSERT INTO tww_od.discharge_point ( + obj_id + , kind + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.discharge_point_relevance_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + DELETE FROM tww_od.wwtp_stucture WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.special_structure WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.manhole WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.infiltration_installation WHERE obj_id = OLD.obj_id; + END CASE; + ELSE + CASE WHEN OLD.ws_type = 'special_structure' THEN + UPDATE tww_od.special_structure SET + function = (SELECT code FROM tww_vl.special_structure_function_import_rel_agxx WHERE value_de=NEW.funktionag) + WHERE obj_id = ws_oid; + ELSE + ------------ Spezialbauwerk ------------ + INSERT INTO tww_od.special_structure ( + obj_id + , kind + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.special_structure_function_import_rel_agxx WHERE value_de=NEW.funktionag) + ); + DELETE FROM tww_od.wwtp_stucture WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.discharge_point WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.manhole WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.infiltration_installation WHERE obj_id = OLD.obj_id; + END CASE; + END CASE; + END CASE; + RETURN NEW; + END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gepknoten_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_app.vw_tww_wastewater_structure where wn_obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; diff --git a/datamodel/app/extensions/tww2ag6496/102_ag96_triggerfuncs_other.sql b/datamodel/app/extensions/tww2ag6496/102_ag96_triggerfuncs_other.sql new file mode 100644 index 000000000..e9f8abae8 --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/102_ag96_triggerfuncs_other.sql @@ -0,0 +1,956 @@ +---------- GEPHaltung ---------- +-------------------------------- + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gephaltung_insert() +RETURNS trigger AS +$BODY$ +DECLARE + pp_oid varchar(16); + ws_oid varchar(16); + rp_from_oid varchar(16); + rp_to_oid varchar(16); +BEGIN + + WITH ppt AS ( + SELECT code, abbr_de from tww_vl.pipe_profile_profile_type ppt WHERE ppt.value_de = NEW.profiltyp + ) + INSERT INTO tww_od.pipe_profile + ( + profile_type + , identifier + , height_width_ratio + , fk_provider + ) VALUES + ( + (SELECT code FROM ppt) + , CASE WHEN NEW.lichte_breite_ist= 0 OR NEW.lichte_hoehe_ist=NEW.lichte_breite_ist + THEN NEW.profiltyp + ELSE + array_to_string( + array[(SELECT abbr_de FROM ppt),NEW.lichte_hoehe_ist::varchar,NEW.lichte_breite_ist::varchar] + ,'_' -- delimiter + ) + END + , (CASE WHEN NEW.lichte_breite_ist= 0 OR NEW.lichte_breite_ist IS NULL THEN 1 + ELSE NEW.lichte_hoehe_ist::numeric/NEW.lichte_breite_ist END)::numeric(5,2) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + ) + ON CONFLICT (identifier,fk_dataowner) DO UPDATE + SET fk_provider=EXCLUDED.fk_provider -- needed to return the obj_id + RETURNING obj_id INTO pp_oid; + + + INSERT INTO tww_od.wastewater_structure + ( + status + , fk_owner + , status_survey_year + , financing + , fk_operator + , identifier + , last_modification + , renovation_necessity + , replacement_value + , structure_condition + , year_of_construction + , ag96_fk_measure + )VALUES + ( + (SELECT code FROM tww_vl.wastewater_structure_status WHERE value_de=replace(NEW.bauwerkstatus,'.in_Betrieb','')) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.eigentuemer) + , NEW.jahr_zustandserhebung + , (SELECT code FROM tww_vl.wastewater_structure_financing WHERE value_de=NEW.finanzierung) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.betreiber) + , NEW.bezeichnung + , NEW.letzte_aenderung_wi + , (SELECT code FROM tww_vl.wastewater_structure_renovation_necessity WHERE value_de=NEW.sanierungsbedarf) + , NEW.wiederbeschaffungswert + , (SELECT code FROM tww_vl.wastewater_structure_structure_condition WHERE value_de=NEW.baulicherzustand) + , NEW.baujahr + , NEW.gepmassnahmeref + ) + RETURNING obj_id into ws_oid; + + INSERT INTO tww_od.channel + ( + obj_id + , usage_current + , function_hierarchic + , function_hydraulic + , usage_planned + )VALUES + ( + ws_oid + , (SELECT code FROM tww_vl.channel_usage_current_import_rel_agxx WHERE value_de=NEW.nutzungsartag_ist) + , (SELECT code FROM tww_vl.channel_function_hierarchic WHERE value_de=NEW.funktionhierarchisch) + , (SELECT code FROM tww_vl.channel_function_hydraulic WHERE value_de=NEW.funktionhydraulisch) + , (SELECT code FROM tww_vl.channel_usage_planned_import_rel_agxx WHERE value_de=NEW.nutzungsartag_geplant) + ); + + INSERT INTO tww_od.wastewater_networkelement( + obj_id + , identifier + , fk_provider + , ag64_last_modification + , ag64_remark + , ag64_fk_provider + , ag96_last_modification + , ag96_remark + , ag96_fk_provider + , fk_wastewater_structure + ) VALUES + ( + NEW.obj_id + , NEW.bezeichnung + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.letzte_aenderung_wi + , NEW.bemerkung_wi + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.letzte_aenderung_gep + , NEW.bemerkung_gep + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , ws_oid + ); + + INSERT INTO tww_od.reach_point + ( + elevation_accuracy + , situation3d_geometry + , fk_provider + , fk_wastewater_networkelement + , last_modification + , level + )VALUES + ( + (SELECT code FROM tww_vl.reach_point_elevation_accuracy WHERE value_de=NEW.hoehengenauigkeit_von) + , ST_SetSRID(ST_MakePoint(ST_X(ST_StartPoint(NEW.verlauf)), ST_X(ST_StartPoint(NEW.verlauf)), COALESCE(NEW.kote_beginn,'nan')), 2056 ) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.startknoten + , NEW.letzte_aenderung_wi + , NEW.kote_beginn + )RETURNING obj_id into rp_from_oid; + + INSERT INTO tww_od.reach_point + ( + elevation_accuracy + , situation3d_geometry + , fk_provider + , fk_wastewater_networkelement + , last_modification + , level + )VALUES + ( + (SELECT code FROM tww_vl.reach_point_elevation_accuracy WHERE value_de=NEW.hoehengenauigkeit_nach) + , ST_SetSRID(ST_MakePoint(ST_X(ST_EndPoint(NEW.verlauf)), ST_X(ST_EndPoint(NEW.verlauf)), COALESCE(NEW.kote_ende,'nan')), 2056 ) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.endknoten + , NEW.letzte_aenderung_wi + , NEW.kote_ende + )RETURNING obj_id into rp_to_oid; + + + INSERT INTO tww_od.reach + ( + obj_id + , clear_height + , ag96_clear_height_planned + , ag96_clear_width_planned + , material + , fk_pipe_profile + , hydraulic_load_current + , length_effective + , progression3d_geometry + , reliner_material + , reliner_nominal_size + , relining_construction + , relining_kind + , fk_reach_point_from + , fk_reach_point_to + )VALUES + ( + NEW.obj_id + , NEW.lichte_hoehe_ist + , NEW.lichte_hoehe_geplant + , NEW.lichte_breite_geplant + , (SELECT code FROM tww_vl.reach_material WHERE value_de=NEW.material) + , pp_oid + , NEW.hydraulischebelastung + , NEW.laengeeffektiv + , ST_Force3D(NEW.verlauf) + , (SELECT code FROM tww_vl.reach_reliner_material WHERE value_de=NEW.reliner_material) + , NEW.reliner_nennweite + , (SELECT code FROM tww_vl.reach_relining_construction WHERE value_de=NEW.reliner_bautechnik) + , (SELECT code FROM tww_vl.reach_relining_kind WHERE value_de=NEW.reliner_art) + , rp_from_oid + , rp_to_oid + ); + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gephaltung_update() +RETURNS trigger AS +$BODY$ +DECLARE + pp_oid varchar(16); + ws_oid varchar(16); + rp_from_oid varchar(16); + rp_to_oid varchar(16); +BEGIN + + + WITH ppt AS ( + SELECT code, abbr_de from tww_vl.pipe_profile_profile_type ppt WHERE ppt.value_de = NEW.profiltyp + ) + INSERT INTO tww_od.pipe_profile + ( + profile_type + , identifier + , height_width_ratio + , fk_provider + ) VALUES + ( + (SELECT code FROM ppt) + , CASE WHEN NEW.lichte_breite_ist= 0 OR NEW.lichte_hoehe_ist=NEW.lichte_breite_ist + THEN NEW.profiltyp + ELSE + array_to_string( + array[(SELECT abbr_de FROM ppt),NEW.lichte_hoehe_ist::varchar,NEW.lichte_breite_ist::varchar] + ,'_' -- delimiter + ) + END + , (CASE WHEN NEW.lichte_breite_ist= 0 OR NEW.lichte_breite_ist IS NULL THEN 1 + ELSE NEW.lichte_hoehe_ist::numeric/NEW.lichte_breite_ist END)::numeric(5,2) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + ) + ON CONFLICT (identifier,fk_dataowner) DO UPDATE + SET fk_provider=EXCLUDED.fk_provider -- needed to return the obj_id + RETURNING obj_id INTO pp_oid; + + UPDATE tww_od.wastewater_networkelement SET + identifier = NEW.bezeichnung + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , ag64_last_modification = NEW.letzte_aenderung_wi + , ag64_remark = NEW.bemerkung_wi + , ag64_fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , ag96_last_modification = NEW.letzte_aenderung_gep + , ag96_remark = NEW.bemerkung_gep + , ag96_fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + WHERE obj_id = NEW.obj_id; + + UPDATE tww_od.wastewater_structure SET + status = (SELECT code FROM tww_vl.wastewater_structure_status WHERE value_de=replace(NEW.bauwerkstatus,'.in_Betrieb','')) + , fk_owner = tww_app.fct_agxx_organisationid_to_vsa(NEW.eigentuemer) + , status_survey_year = NEW.jahr_zustandserhebung + , financing = (SELECT code FROM tww_vl.wastewater_structure_financing WHERE value_de=NEW.finanzierung) + , fk_operator = tww_app.fct_agxx_organisationid_to_vsa(NEW.betreiber) + , identifier = NEW.bezeichnung + , last_modification = NEW.letzte_aenderung_wi + , renovation_necessity = (SELECT code FROM tww_vl.wastewater_structure_renovation_necessity WHERE value_de=NEW.sanierungsbedarf) + , replacement_value = NEW.wiederbeschaffungswert + , structure_condition = (SELECT code FROM tww_vl.wastewater_structure_structure_condition WHERE value_de=NEW.baulicherzustand) + , year_of_construction = NEW.baujahr + , ag96_fk_measure = NEW.gepmassnahmeref + WHERE obj_id = (SELECT fk_wastewater_structure FROM tww_od.wastewater_networkelement WHERE obj_id = NEW.obj_id) + RETURNING obj_id into ws_oid; + + UPDATE tww_od.channel SET + usage_current = (SELECT code FROM tww_vl.channel_usage_current_import_rel_agxx WHERE value_de=NEW.nutzungsartag_ist) + , function_hierarchic = (SELECT code FROM tww_vl.channel_function_hierarchic WHERE value_de=NEW.funktionhierarchisch) + , function_hydraulic = (SELECT code FROM tww_vl.channel_function_hydraulic WHERE value_de=NEW.funktionhydraulisch) + , usage_planned = (SELECT code FROM tww_vl.channel_usage_planned_import_rel_agxx WHERE value_de=NEW.nutzungsartag_geplant) + WHERE obj_id = ws_oid; + + SELECT fk_reach_point_from,fk_reach_point_to INTO rp_from_oid,rp_to_oid + FROM tww_od.reach + WHERE obj_id = OLD.obj_id; + + + UPDATE tww_od.reach_point SET + elevation_accuracy = (SELECT code FROM tww_vl.reach_point_elevation_accuracy WHERE value_de=NEW.hoehengenauigkeit_von) + , situation3d_geometry = ST_SetSRID(ST_MakePoint(ST_X(ST_StartPoint(NEW.verlauf)), ST_X(ST_StartPoint(NEW.verlauf)), COALESCE(NEW.kote_beginn,'nan')), 2056 ) + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , fk_wastewater_networkelement = NEW.startknoten + , last_modification = NEW.letzte_aenderung_wi + , level = NEW.kote_beginn + WHERE obj_id = rp_from_oid; + + UPDATE tww_od.reach_point SET + elevation_accuracy = (SELECT code FROM tww_vl.reach_point_elevation_accuracy WHERE value_de=NEW.hoehengenauigkeit_von) + , situation3d_geometry = ST_SetSRID(ST_MakePoint(ST_X(ST_EndPoint(NEW.verlauf)), ST_X(ST_EndPoint(NEW.verlauf)), COALESCE(NEW.kote_ende,'nan')), 2056 ) + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , fk_wastewater_networkelement = NEW.endknoten + , last_modification = NEW.letzte_aenderung_wi + , level = NEW.kote_ende + WHERE obj_id = rp_to_oid; + + UPDATE tww_od.reach re SET + clear_height = NEW.lichte_hoehe_ist + , ag96_clear_height_planned = NEW.lichte_hoehe_geplant + , ag96_clear_width_planned = NEW.lichte_breite_geplant + , material = (SELECT code FROM tww_vl.reach_material WHERE value_de=NEW.material) + , fk_pipe_profile = pp_oid + , hydraulic_load_current = NEW.hydraulischebelastung + , length_effective = NEW.laengeeffektiv + , progression3d_geometry = ST_Force3D(NEW.verlauf) + , reliner_material = (SELECT code FROM tww_vl.reach_reliner_material WHERE value_de=NEW.reliner_material) + , reliner_nominal_size = NEW.reliner_nennweite + , relining_construction = (SELECT code FROM tww_vl.reach_relining_construction WHERE value_de=NEW.reliner_bautechnik) + , relining_kind = (SELECT code FROM tww_vl.reach_relining_kind WHERE value_de=NEW.reliner_art); + + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gephaltung_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_app.vw_tww_reach where obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; + + + + + +-------------------------------- +--------- GEPMassnahme --------- +-------------------------------- +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gepmassnahme_upsert() +RETURNS trigger AS +$BODY$ +BEGIN + UPDATE tww_od.measure msr + SET + category = (SELECT code FROM tww_vl.measure_category_import_rel_agxx WHERE value_de = NEW.kategorie) + , date_entry = NEW.datum_eingang + , description = NEW.beschreibung + , identifier = NEW.bezeichnung + , intervention_demand = NEW.handlungsbedarf + , line_geometry = NEW.ausdehnung + , link = NEW.verweis + , perimeter_geometry = NEW.perimeter + , priority = (SELECT code FROM tww_vl.measure_priority WHERE value_de = NEW.prioritaetag) + , remark = NEW.bemerkung_gep + , status = (SELECT code FROM tww_vl.measure_status WHERE value_de = NEW.status) + , symbolpos_geometry = NEW.symbolpos + , total_cost = NEW.gesamtkosten + , year_implementation_effective = NEW.jahr_umsetzung_effektiv + , year_implementation_planned = NEW.jahr_umsetzung_planned + , last_modification = NEW.letzte_aenderung_gep +-- , fk_dataowner = downr.value_obj_id + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , fk_responsible_entity = tww_app.fct_agxx_organisationid_to_vsa(NEW.traegerschaft) + , fk_responsible_start = tww_app.fct_agxx_organisationid_to_vsa(NEW.verantwortlich_ausloesung) + WHERE msr.obj_id=NEW.obj_id; + + IF NOT FOUND THEN + INSERT INTO tww_od.measure( + obj_id + , category + , date_entry + , description + , identifier + , intervention_demand + , line_geometry + , link + , perimeter_geometry + , priority + , remark + , status + , symbolpos_geometry + , total_cost + , year_implementation_effective + , year_implementation_planned + , last_modification + , fk_provider + , fk_responsible_entity + , fk_responsible_start + )VALUES + ( + NEW.obj_id + , (SELECT code FROM tww_vl.measure_category_import_rel_agxx WHERE value_de = NEW.kategorie) + , NEW.datum_eingang + , NEW.beschreibung + , NEW.bezeichnung + , NEW.handlungsbedarf + , NEW.ausdehnung + , NEW.verweis + , NEW.perimeter + , (SELECT code FROM tww_vl.measure_priority WHERE value_de = NEW.prioritaetag) + , NEW.bemerkung_gep + , (SELECT code FROM tww_vl.measure_status WHERE value_de = NEW.status) + , NEW.symbolpos + , NEW.gesamtkosten + , NEW.jahr_umsetzung_effektiv + , NEW.jahr_umsetzung_planned + , NEW.letzte_aenderung_gep + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.traegerschaft) + , tww_app.fct_agxx_organisationid_to_vsa(NEW.verantwortlich_ausloesung) + ); + END IF + ; +RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_gepmassnahme_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_od.measure where obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; + + + + + +-------------------------------- +-------- Einzugsgebiet --------- +-------------------------------- + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_einzugsgebiet_upsert() +RETURNS trigger AS +$BODY$ +BEGIN + UPDATE tww_od.catchment_area ca SET + direct_discharge_current = (SELECT code FROM tww_vl.catchment_area_direct_discharge_current WHERE value_de = NEW.direkteinleitung_in_gewaesser_ist) + , direct_discharge_planned = (SELECT code FROM tww_vl.catchment_area_direct_discharge_planned WHERE value_de = NEW.direkteinleitung_in_gewaesser_geplant) + , discharge_coefficient_rw_current = NEW.abflussbeiwert_rw_ist + , discharge_coefficient_rw_planned = NEW.abflussbeiwert_rw_geplant + , discharge_coefficient_ww_current = NEW.abflussbeiwert_sw_ist + , discharge_coefficient_ww_planned = NEW.abflussbeiwert_sw_geplant + , drainage_system_current = (SELECT code FROM tww_vl.catchment_area_drainage_system_current_import_rel_agxx WHERE value_de = NEW.entwaesserungssystemag_ist) + , drainage_system_planned = (SELECT code FROM tww_vl.catchment_area_drainage_system_planned_import_rel_agxx WHERE value_de = NEW.entwaesserungssystemag_geplant) + , identifier = NEW.bezeichnung + , infiltration_current = (SELECT code FROM tww_vl.catchment_area_infiltration_current WHERE value_de = NEW.versickerung_ist) + , infiltration_planned = (SELECT code FROM tww_vl.catchment_area_infiltration_planned WHERE value_de = NEW.versickerung_geplant) + , perimeter_geometry = NEW.perimeter + , population_density_current = NEW.einwohnerdichte_ist + , population_density_planned = NEW.einwohnerdichte_geplant + , remark = NEW.bemerkung_gep + , retention_current = (SELECT code FROM tww_vl.catchment_area_retention_current WHERE value_de = NEW.retention_ist) + , retention_planned = (SELECT code FROM tww_vl.catchment_area_retention_planned WHERE value_de = NEW.retention_geplant) + , runoff_limit_current = NEW.abflussbegrenzung_ist + , runoff_limit_planned = NEW.abflussbegrenzung_geplant + , seal_factor_rw_current = NEW.befestigungsgrad_rw_ist + , seal_factor_rw_planned = NEW.befestigungsgrad_rw_geplant + , seal_factor_ww_current = NEW.befestigungsgrad_sw_ist + , seal_factor_ww_planned = NEW.befestigungsgrad_sw_geplant + , sewer_infiltration_water_production_current = NEW.fremdwasseranfall_ist + , sewer_infiltration_water_production_planned = NEW.fremdwasseranfall_geplant + , surface_area = NEW.flaeche + , waste_water_production_current = NEW.schmutzabwasseranfall_ist + , waste_water_production_planned = NEW.schmutzabwasseranfall_geplant + , last_modification = NEW.letzte_aenderung_gep + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , fk_wastewater_networkelement_rw_current = NEW.gepknoten_rw_istref + , fk_wastewater_networkelement_rw_planned = NEW.gepknoten_rw_geplantref + , fk_wastewater_networkelement_ww_planned = NEW.gepknoten_sw_geplantref + , fk_wastewater_networkelement_ww_current = NEW.gepknoten_sw_istref + WHERE ca.obj_id = NEW.obj_id; + IF NOT FOUND THEN + INSERT INTO tww_od.catchment_area( + obj_id + , direct_discharge_current + , direct_discharge_planned + , discharge_coefficient_rw_current + , discharge_coefficient_rw_planned + , discharge_coefficient_ww_current + , discharge_coefficient_ww_planned + , drainage_system_current + , drainage_system_planned + , identifier + , infiltration_current + , infiltration_planned + , perimeter_geometry + , population_density_current + , population_density_planned + , remark + , retention_current + , retention_planned + , runoff_limit_current + , runoff_limit_planned + , seal_factor_rw_current + , seal_factor_rw_planned + , seal_factor_ww_current + , seal_factor_ww_planned + , sewer_infiltration_water_production_current + , sewer_infiltration_water_production_planned + , surface_area + , waste_water_production_current + , waste_water_production_planned + , last_modification + , fk_provider + , fk_wastewater_networkelement_rw_current + , fk_wastewater_networkelement_rw_planned + , fk_wastewater_networkelement_ww_planned + , fk_wastewater_networkelement_ww_current + )VALUES + ( + NEW.obj_id + , (SELECT code FROM tww_vl.catchment_area_direct_discharge_current WHERE value_de = NEW.direkteinleitung_in_gewaesser_ist) + , (SELECT code FROM tww_vl.catchment_area_direct_discharge_planned WHERE value_de = NEW.direkteinleitung_in_gewaesser_geplant) + , NEW.abflussbeiwert_rw_ist + , NEW.abflussbeiwert_rw_geplant + , NEW.abflussbeiwert_sw_ist + , NEW.abflussbeiwert_sw_geplant + , (SELECT code FROM tww_vl.catchment_area_drainage_system_current_import_rel_agxx WHERE value_de = NEW.entwaesserungssystemag_ist) + , (SELECT code FROM tww_vl.catchment_area_drainage_system_planned_import_rel_agxx WHERE value_de = NEW.entwaesserungssystemag_geplant) + , NEW.bezeichnung + , (SELECT code FROM tww_vl.catchment_area_infiltration_current WHERE value_de = NEW.versickerung_ist) + , (SELECT code FROM tww_vl.catchment_area_infiltration_planned WHERE value_de = NEW.versickerung_geplant) + , NEW.perimeter + , NEW.einwohnerdichte_ist + , NEW.einwohnerdichte_geplant + , NEW.bemerkung_gep + , (SELECT code FROM tww_vl.catchment_area_retention_current WHERE value_de = NEW.retention_ist) + , (SELECT code FROM tww_vl.catchment_area_retention_planned WHERE value_de = NEW.retention_geplant) + , NEW.abflussbegrenzung_ist + , NEW.abflussbegrenzung_geplant + , NEW.befestigungsgrad_rw_ist + , NEW.befestigungsgrad_rw_geplant + , NEW.befestigungsgrad_sw_ist + , NEW.befestigungsgrad_sw_geplant + , NEW.fremdwasseranfall_ist + , NEW.fremdwasseranfall_geplant + , NEW.flaeche + , NEW.schmutzabwasseranfall_ist + , NEW.schmutzabwasseranfall_geplant + , NEW.letzte_aenderung_gep + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , NEW.gepknoten_rw_istref + , NEW.gepknoten_rw_geplantref + , NEW.gepknoten_sw_geplantref + , NEW.gepknoten_sw_istref + ) + ; + END IF; + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_einzugsgebiet_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_od.catchment_area where obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; + + +--------------------------------- +--- Ueberlauf_Foerderaggregat --- +--------------------------------- + + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_ueberlauf_foerderaggregat_insert() +RETURNS trigger AS +$BODY$ +BEGIN + + INSERT INTO tww_od.overflow ( + obj_id + , fk_wastewater_node + , fk_overflow_to + , fk_provider + , remark + , identifier + , last_modification + , ag64_last_modification + , ag64_remark + , ag64_fk_provider + , ag96_last_modification + , ag96_remark + , ag96_fk_provider + ) + VALUES + ( + NEW.obj_id + , NEW.knotenref + , NEW.knoten_nachref + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.bemerkung_wi + , NEW.bezeichnung + , NEW.letzte_aenderung_wi + , NEW.letzte_aenderung_wi + , NEW.bemerkung_wi + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , NEW.letzte_aenderung_gep + , NEW.bemerkung_gep + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + ); + + CASE WHEN NEW.art = 'Foerderaggregat' THEN + INSERT INTO tww_od.pump (obj_id) VALUES (NEW.obj_id); + WHEN NEW.art = 'Leapingwehr' THEN + INSERT INTO tww_od.leapingweir (obj_id) VALUES (NEW.obj_id); + WHEN NEW.art = 'Streichwehr' THEN + INSERT INTO tww_od.prank_weir (obj_id) VALUES (NEW.obj_id); + ELSE NULL; + END CASE; + + RETURN NEW; + +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_ueberlauf_foerderaggregat_update() +RETURNS trigger AS +$BODY$ +BEGIN + UPDATE tww_od.overflow + SET + fk_wastewater_node = NEW.knotenref + , fk_overflow_to = NEW.knoten_nachref + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , remark = NEW.bemerkung_wi + , identifier = NEW.bezeichnung + , last_modification = NEW.letzte_aenderung_wi + , ag64_last_modification = NEW.letzte_aenderung_wi + , ag64_remark = NEW.bemerkung_wi + , ag64_fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_wi) + , ag96_last_modification = NEW.letzte_aenderung_gep + , ag96_remark = NEW.bemerkung_gep + , ag96_fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + WHERE obj_id=NEW.obj_id; + + CASE WHEN NEW.art = 'Foerderaggregat' AND OLD.ov_type != 'pump' THEN + INSERT INTO tww_od.pump (obj_id) VALUES (NEW.obj_id); + DELETE FROM tww_od.leapingweir WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.prank_weir WHERE obj_id = OLD.obj_id; + WHEN NEW.art = 'Leapingwehr' AND OLD.ov_type != 'leapingweir' THEN + INSERT INTO tww_od.leapingweir (obj_id) VALUES (NEW.obj_id); + DELETE FROM tww_od.pump WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.prank_weir WHERE obj_id = OLD.obj_id; + WHEN NEW.art = 'Streichwehr' AND OLD.ov_type != 'prank_weir' THEN + INSERT INTO tww_od.prank_weir (obj_id) VALUES (NEW.obj_id); + DELETE FROM tww_od.leapingweir WHERE obj_id = OLD.obj_id; + DELETE FROM tww_od.pump WHERE obj_id = OLD.obj_id; + ELSE NULL; + END CASE; + RETURN NEW; + +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_ueberlauf_foerderaggregat_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_app.vw_tww_overflow where obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; + + +--------------------------------- +--- Bautenausserhalbbaugebiet --- +--------------------------------- + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_bautenausserhalbbaugebiet_upsert() +RETURNS trigger AS +$BODY$ +BEGIN + UPDATE tww_od.building_group bg + SET + function = (SELECT code FROM tww_vl.building_group_function_import_rel_agxx WHERE value_de = NEW.arealnutzung) + , identifier = NEW.bezeichnung + , population_equivalent = NEW.einwohnergleichwert + , ag96_population = NEW.anzstaendigeeinwohner + , remark = NEW.bemerkung_gep + , renovation_date = NEW.sanierungsdatum + , renovation_necessity = (SELECT code FROM tww_vl.building_group_renovation_necessity WHERE lower(value_de) = lower(NEW.sanierungsbedarf)) + , restructuring_concept = NEW.sanierungskonzept + , situation_geometry = NEW.lage + , last_modification = NEW.letzte_aenderung_gep + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , ag96_owner_address = NEW.eigentuemeradresse + , ag96_owner_name = NEW.eigentuemername + , ag96_label_number = NEW.nummer + , ag96_disposal_wastewater = (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_haeusliches_abwasser) + , ag96_disposal_industrial_wastewater = (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_gewerbliches_abwasser) + , ag96_disposal_square_water = (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_platzentwaesserung) + , ag96_disposal_roof_water = (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_dachentwaesserung) + WHERE bg.obj_id=NEW.obj_id; + IF NOT FOUND THEN + INSERT INTO tww_od.building_group + ( + obj_id + , function + , identifier + , population_equivalent + , ag96_population + , remark + , renovation_date + , renovation_necessity + , restructuring_concept + , situation_geometry + , last_modification + , fk_provider + , ag96_owner_address + , ag96_owner_name + , ag96_label_number + , ag96_disposal_wastewater + , ag96_disposal_industrial_wastewater + , ag96_disposal_square_water + , ag96_disposal_roof_water + ) + ( + SELECT + NEW.obj_id + , (SELECT code FROM tww_vl.building_group_function_import_rel_agxx WHERE value_de = NEW.arealnutzung) + , NEW.bezeichnung + , NEW.einwohnergleichwert + , NEW.anzstaendigeeinwohner + , NEW.bemerkung_gep + , NEW.sanierungsdatum + , (SELECT code FROM tww_vl.building_group_renovation_necessity WHERE lower(value_de) = lower(NEW.sanierungsbedarf)) + , NEW.sanierungskonzept + , NEW.lage + , NEW.letzte_aenderung_gep + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , NEW.eigentuemeradresse + , NEW.eigentuemername + , NEW.nummer + , (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_haeusliches_abwasser) + , (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_gewerbliches_abwasser) + , (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_platzentwaesserung) + , (SELECT code FROM tww_vl.building_group_ag96_disposal_type WHERE value_de = NEW.beseitigung_dachentwaesserung) + ); + END IF; + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_bautenausserhalbbaugebiet_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_od.building_group where obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; + + + + +--------------------------------- +------- SBW_Einzugsgebiet ------- +--------------------------------- + + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_sbw_einzugsgebiet_upsert() +RETURNS trigger AS +$BODY$ +DECLARE + hcd_oid varchar(16); +BEGIN + UPDATE tww_od.hydraulic_char_data + SET remark=NEW.bemerkung_gep + WHERE fk_wastewater_node=NEW.sonderbauwerk_ref + AND status = 6372 --Ist + RETURNING obj_id into hcd_oid; + + IF NOT FOUND THEN + INSERT INTO tww_od.hydraulic_char_data + ( + remark + , fk_wastewater_node + , status + ) + VALUES + ( + NEW.bemerkung_gep + , NEW.sonderbauwerk_ref + , 6372 + ) + RETURNING obj_id into hcd_oid; + END IF; + UPDATE tww_od.catchment_area_totals cat + SET + identifier = NEW.bezeichnung + , population = NEW.einwohner_ist + , population_dim = NEW.einwohner_geplant + , sewer_infiltration_water = NEW.fremdwasseranfall_ist + , surface_area = NEW.flaeche_ist + , surface_dim = NEW.flaeche_geplant + , surface_imp = NEW.flaeche_befestigt_ist + , surface_imp_dim = NEW.flaeche_befestigt_geplant + , surface_red = NEW.flaeche_reduziert_ist + , surface_red_dim = NEW.flaeche_reduziert_geplant + , waste_water_production = NEW.schmutzabwasseranfall_ist + , last_modification = NEW.letzte_aenderung_gep + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , fk_discharge_point = NEW.einleitstelleref + , fk_hydraulic_char_data = hcd_oid + , ag96_sewer_infiltration_water_dim = NEW.fremdwasseranfall_geplant + , ag96_waste_water_production_dim = NEW.schmutzabwasseranfall_geplant + , ag96_perimeter_geometry = NEW.perimeter_ist + WHERE cat.obj_id = NEW.obj_id; + IF NOT FOUND THEN + INSERT INTO tww_od.catchment_area_totals + ( + obj_id + , identifier + , population + , population_dim + , sewer_infiltration_water + , surface_area + , surface_dim + , surface_imp + , surface_imp_dim + , surface_red + , surface_red_dim + , waste_water_production + , last_modification + , fk_provider + , fk_discharge_point + , fk_hydraulic_char_data + , ag96_sewer_infiltration_water_dim + , ag96_waste_water_production_dim + , ag96_perimeter_geometry + )VALUES + ( + NEW.obj_id + , NEW.bezeichnung + , NEW.einwohner_ist + , NEW.einwohner_geplant + , NEW.fremdwasseranfall_ist + , NEW.flaeche_ist + , NEW.flaeche_geplant + , NEW.flaeche_befestigt_ist + , NEW.flaeche_befestigt_geplant + , NEW.flaeche_reduziert_ist + , NEW.flaeche_reduziert_geplant + , NEW.schmutzabwasseranfall_ist + , NEW.letzte_aenderung_gep + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , NEW.einleitstelleref + , hcd_oid + , NEW.fremdwasseranfall_geplant + , NEW.schmutzabwasseranfall_geplant + , NEW.perimeter_ist + ); + END IF; + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_sbw_einzugsgebiet_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_od.catchment_area_totals where obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; + + + +--------------------------------- +---- Versickerungsbereichag ----- +--------------------------------- + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_versickerungsbereichag_insert() +RETURNS trigger AS +$BODY$ +BEGIN + INSERT INTO tww_od.zone + ( + obj_id + , identifier + , fk_provider + , remark + , last_modification + ) + ( + SELECT + NEW.obj_id + , NEW.bezeichnung + , tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , NEW.bemerkung_gep + , NEW.letzte_aenderung_gep + ); + INSERT INTO tww_od.infiltration_zone + ( + obj_id + , ag96_permeability + , ag96_limitation + , ag96_thickness + , perimeter_geometry + , ag96_q_check + , infiltration_capacity + ) + ( + SELECT + NEW.obj_id + , NEW.durchlaessigkeit + , NEW.einschraenkung + , NEW.maechtigkeit + , NEW.perimeter + , NEW.q_check + , (SELECT code FROM tww_vl.infiltration_zone_infiltration_capacity WHERE value_de = NEW.versickerungsmoeglichkeitag) + ); + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_versickerungsbereichag_update() +RETURNS trigger AS +$BODY$ +BEGIN + UPDATE tww_od.zone + SET + identifier = NEW.bezeichnung + , fk_provider = tww_app.fct_agxx_organisationid_to_vsa(NEW.datenbewirtschafter_gep) + , remark = NEW.bemerkung_gep + , last_modification = NEW.letzte_aenderung_gep + WHERE obj_id=NEW.obj_id; + + UPDATE tww_od.infiltration_zone + SET + ag96_permeability = NEW.bezeichnung + , ag96_limitation = NEW.einschraenkung + , ag96_thickness = NEW.maechtigkeit + , perimeter_geometry = NEW.perimeter + , ag96_q_check = NEW.q_check + , infiltration_capacity = (SELECT code FROM tww_vl.infiltration_zone_infiltration_capacity WHERE value_de = NEW.versickerungsmoeglichkeitag) + WHERE obj_id=NEW.obj_id; + RETURN NEW; +END; +$BODY$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION tww_app.ft_agxx_versickerungsbereichag_delete() +RETURNS trigger AS +$BODY$ +BEGIN + DELETE FROM tww_od.infiltration_zone where obj_id=old.obj_id; + DELETE FROM tww_od.zone where obj_id=old.obj_id; + RETURN NULL; +END; +$BODY$ +LANGUAGE plpgsql; diff --git a/datamodel/app/extensions/tww2ag6496/103_ag96_createtriggers.sql b/datamodel/app/extensions/tww2ag6496/103_ag96_createtriggers.sql new file mode 100644 index 000000000..a3a97d482 --- /dev/null +++ b/datamodel/app/extensions/tww2ag6496/103_ag96_createtriggers.sql @@ -0,0 +1,156 @@ + +DROP TRIGGER IF EXISTS on_gepknoten_insert ON tww_app.vw_agxx_gepknoten; +CREATE TRIGGER on_gepknoten_insert + INSTEAD OF INSERT + ON tww_app.vw_agxx_gepknoten + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gepknoten_insert(); + +DROP TRIGGER IF EXISTS on_gepknoten_update ON tww_app.vw_agxx_gepknoten; +CREATE TRIGGER on_gepknoten_update + INSTEAD OF UPDATE + ON tww_app.vw_agxx_gepknoten + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gepknoten_update(); + + +DROP TRIGGER IF EXISTS on_gepknoten_delete ON tww_app.vw_agxx_gepknoten; +CREATE TRIGGER on_gepknoten_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_gepknoten + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gepknoten_delete(); + + +DROP TRIGGER IF EXISTS on_gephaltung_insert ON tww_app.vw_agxx_gephaltung; +CREATE TRIGGER on_gephaltung_insert + INSTEAD OF INSERT + ON tww_app.vw_agxx_gephaltung + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gephaltung_insert(); + +DROP TRIGGER IF EXISTS on_gephaltung_update ON tww_app.vw_agxx_gephaltung; +CREATE TRIGGER on_gephaltung_update + INSTEAD OF UPDATE + ON tww_app.vw_agxx_gephaltung + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gephaltung_update(); + +DROP TRIGGER IF EXISTS on_gephaltung_delete ON tww_app.vw_agxx_gephaltung; +CREATE TRIGGER on_gephaltung_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_gephaltung + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gephaltung_delete(); + +DROP TRIGGER IF EXISTS on_gepmassnahme_upsert ON tww_app.vw_agxx_gepmassnahme; +CREATE TRIGGER on_gepmassnahme_upsert + INSTEAD OF INSERT OR UPDATE + ON tww_app.vw_agxx_gepmassnahme + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gepmassnahme_upsert(); + +DROP TRIGGER IF EXISTS on_gepmassnahme_delete ON tww_app.vw_agxx_gepmassnahme; +CREATE TRIGGER on_gepmassnahme_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_gepmassnahme + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_gepmassnahme_delete(); + +DROP TRIGGER IF EXISTS on_einzugsgebiet_upsert ON tww_app.vw_agxx_einzugsgebiet; +CREATE TRIGGER on_einzugsgebiet_upsert + INSTEAD OF INSERT OR UPDATE + ON tww_app.vw_agxx_einzugsgebiet + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_einzugsgebiet_upsert(); + +DROP TRIGGER IF EXISTS on_einzugsgebiet_delete ON tww_app.vw_agxx_einzugsgebiet; +CREATE TRIGGER on_einzugsgebiet_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_einzugsgebiet + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_einzugsgebiet_delete(); + +DROP TRIGGER IF EXISTS on_ueberlauf_foerderaggregat_insert ON tww_app.vw_agxx_ueberlauf_foerderaggregat; +CREATE TRIGGER on_ueberlauf_foerderaggregat_insert + INSTEAD OF INSERT + ON tww_app.vw_agxx_ueberlauf_foerderaggregat + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_ueberlauf_foerderaggregat_insert(); + +DROP TRIGGER IF EXISTS on_ueberlauf_foerderaggregat_update ON tww_app.vw_agxx_ueberlauf_foerderaggregat; +CREATE TRIGGER on_ueberlauf_foerderaggregat_update + INSTEAD OF UPDATE + ON tww_app.vw_agxx_ueberlauf_foerderaggregat + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_ueberlauf_foerderaggregat_update(); + +DROP TRIGGER IF EXISTS on_ueberlauf_foerderaggregat_delete ON tww_app.vw_agxx_ueberlauf_foerderaggregat; +CREATE TRIGGER on_ueberlauf_foerderaggregat_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_ueberlauf_foerderaggregat + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_ueberlauf_foerderaggregat_delete(); + +DROP TRIGGER IF EXISTS on_bautenausserhalbbaugebiet_upsert ON tww_app.vw_agxx_bautenausserhalbbaugebiet; +CREATE TRIGGER on_bautenausserhalbbaugebiet_upsert + INSTEAD OF INSERT OR UPDATE + ON tww_app.vw_agxx_bautenausserhalbbaugebiet + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_bautenausserhalbbaugebiet_upsert(); + +DROP TRIGGER IF EXISTS on_bautenausserhalbbaugebiet_delete ON tww_app.vw_agxx_bautenausserhalbbaugebiet; +CREATE TRIGGER on_bautenausserhalbbaugebiet_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_bautenausserhalbbaugebiet + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_bautenausserhalbbaugebiet_delete(); + +DROP TRIGGER IF EXISTS on_sbw_einzugsgebiet_upsert ON tww_app.vw_agxx_sbw_einzugsgebiet; +CREATE TRIGGER on_sbw_einzugsgebiet_upsert + INSTEAD OF INSERT OR UPDATE + ON tww_app.vw_agxx_sbw_einzugsgebiet + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_sbw_einzugsgebiet_upsert(); + +DROP TRIGGER IF EXISTS on_sbw_einzugsgebiet_delete ON tww_app.vw_agxx_sbw_einzugsgebiet; +CREATE TRIGGER on_sbw_einzugsgebiet_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_sbw_einzugsgebiet + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_sbw_einzugsgebiet_delete(); + +DROP TRIGGER IF EXISTS on_versickerungsbereichag_insert ON tww_app.vw_agxx_versickerungsbereichag; +CREATE TRIGGER on_versickerungsbereichag_insert + INSTEAD OF INSERT + ON tww_app.vw_agxx_versickerungsbereichag + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_versickerungsbereichag_insert(); + +DROP TRIGGER IF EXISTS on_versickerungsbereichag_update ON tww_app.vw_agxx_versickerungsbereichag; +CREATE TRIGGER on_versickerungsbereichag_update + INSTEAD OF UPDATE + ON tww_app.vw_agxx_versickerungsbereichag + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_versickerungsbereichag_update(); + +DROP TRIGGER IF EXISTS on_versickerungsbereichag_delete ON tww_app.vw_agxx_versickerungsbereichag; +CREATE TRIGGER on_versickerungsbereichag_delete + INSTEAD OF DELETE + ON tww_app.vw_agxx_versickerungsbereichag + FOR EACH ROW + EXECUTE FUNCTION tww_app.ft_agxx_versickerungsbereichag_delete(); + +DROP TRIGGER IF EXISTS update_last_modified_agxx_wastewater_networkelement ON tww_od.wastewater_networkelement; +CREATE TRIGGER update_last_modified_agxx_wastewater_networkelement + BEFORE INSERT OR UPDATE + ON tww_od.wastewater_networkelement + FOR EACH ROW + EXECUTE FUNCTION tww_app.modification_last_modified_agxx(); + +DROP TRIGGER IF EXISTS update_last_modified_agxx_overflow ON tww_od.overflow; +CREATE TRIGGER update_last_modified_agxx_overflow + BEFORE INSERT OR UPDATE + ON tww_od.overflow + FOR EACH ROW + EXECUTE FUNCTION tww_app.modification_last_modified_agxx(); diff --git a/datamodel/scripts/create-dumps.py b/datamodel/scripts/create-dumps.py index 54d09ffc5..b8af7cc3b 100755 --- a/datamodel/scripts/create-dumps.py +++ b/datamodel/scripts/create-dumps.py @@ -34,7 +34,7 @@ def _cmd(args): raise e -def files_description(version): +def files_description(version, extension_name): return f""" ## Descriptions of the files @@ -44,6 +44,7 @@ def files_description(version): tww_{version}_structure_with_value_lists.sql | Contains the structure of tables, system schema data and value lists data tww_{version}_demo_data.backup | Data-only backup of the `tww_od` schema (i.e. ordinary data) from demonstration set of data tww_{version}_structure_and_demo_data.backup | Complete backup with structure and data of the demonstration set of data +Additionally, there are extension files which have the corresponding extension name appended. The extensions can be configured in datamodel/extensions/config.yaml * If you plan to **use tww for production**, it is more likely you will be using the plain SQL `tww_{version}_structure_with_value_lists.sql`. * If you want to **give a try at tww**, you will likely restore the `tww_{version}_structure_and_demo_data.backup` backup file. @@ -55,13 +56,16 @@ def create_dumps(**args): Creates all dumps :return: the files names in a list """ - file_s = create_plain_structure_only(**args) - file_v = create_plain_value_list(structure_dump_file=file_s, **args) - file_b = create_backup_complete(**args) - return file_s, file_v, file_b + files = [] + files.extend(create_plain_structure_only(**args)) + files.append(create_plain_value_list(**args)) + files.append(create_backup_complete(**args)) -def create_plain_structure_only(database: str, version: str): + return files + + +def create_plain_structure_only(database: str, version: str, extension_suffix: str = None): """ Create a plain SQL dump of data structure of all schemas and the content of pum_sys.inf @@ -70,7 +74,7 @@ def create_plain_structure_only(database: str, version: str): print("::group::plain SQL structure only") # structure - dump_s = f"tww_{version}_structure.sql" + dump_s = f"tww_{version}_structure{extension_suffix}.sql" print(f"Creating dump {dump_s}") dump_file_s = f"datamodel/artifacts/{dump_s}" @@ -90,7 +94,7 @@ def create_plain_structure_only(database: str, version: str): ) # dump all from tww_sys except logged_actions - dump_i = f"tww_{version}_pum_info.sql" + dump_i = f"tww_{version}_pum_info{extension_suffix}.sql" print(f"Creating dump {dump_i}") dump_file_i = f"datamodel/artifacts/{dump_i}" _cmd( @@ -114,19 +118,18 @@ def create_plain_structure_only(database: str, version: str): print("::endgroup::") - return dump_file_s + return [dump_file_i, dump_file_s] -def create_plain_value_list(database: str, version: str, structure_dump_file: str): +def create_plain_value_list(database: str, version: str, extension_suffix: str = None): """ Create a plain SQL dump of data structure (result of create_structure_only) with value list content :return: the file name of the dump """ print("::group::value lists dump") - - dump = f"tww_{version}_structure_with_value_lists.sql" - + dump = f"tww_{version}_structure_with_value_lists{extension_suffix}.sql" + structure_dump_file = f"datamodel/artifacts/tww_{version}_structure{extension_suffix}.sql" print(f"Creating dump {dump}") dump_file = f"datamodel/artifacts/{dump}" @@ -162,13 +165,13 @@ def create_plain_value_list(database: str, version: str, structure_dump_file: st return dump_file -def create_backup_complete(database: str, version: str): +def create_backup_complete(database: str, version: str, extension_suffix: str = None): """ Create data + structure dump :return: the file name """ # Create data + structure dumps (with sample data) - dump = f"tww_{version}_structure_and_demo_data.backup" + dump = f"tww_{version}_structure_and_demo_data{extension_suffix}.backup" print(f"::group::{dump}") print(f"Creating dump {dump}") dump_file = f"datamodel/artifacts/{dump}" @@ -199,6 +202,9 @@ def get_parser(): _parser = argparse.ArgumentParser("create-dumps.py") _parser.add_argument("--version", "-v", help="Sets the version", default="dev") _parser.add_argument("--database", "-d", help="Sets the database name", default="tww") + _parser.add_argument( + "--extension_name", "-x", help="Name of the database extension (optional)" + ) return _parser @@ -206,6 +212,9 @@ def get_parser(): parser = get_parser() args = parser.parse_args() + extension_suffix = ("_" + args.extension_name) if args.extension_name else "" os.makedirs("datamodel/artifacts", exist_ok=True) - files = create_dumps(version=args.version, database=args.database) + files = create_dumps( + version=args.version, database=args.database, extension_suffix=extension_suffix + ) print("Dumps created: {}".format(", ".join(files))) diff --git a/datamodel/scripts/setup.sh b/datamodel/scripts/setup.sh index 5abd1ec02..446534997 100755 --- a/datamodel/scripts/setup.sh +++ b/datamodel/scripts/setup.sh @@ -12,6 +12,7 @@ set -e PGSERVICE=${PGSERVICE:-pg_tww} SRID=2056 +EXTENSION_NAMES=${EXTENSION_NAMES:-""} DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/.. @@ -41,4 +42,4 @@ psql "service=${PGSERVICE}" -v ON_ERROR_STOP=1 -f ${DIR}/changelogs/0001/52_dss1 psql "service=${PGSERVICE}" -v ON_ERROR_STOP=1 -f ${DIR}/12_0_roles.sql psql "service=${PGSERVICE}" -v ON_ERROR_STOP=1 -f ${DIR}/12_1_roles.sql -${DIR}/app/create_app.py --pg_service ${PGSERVICE} --srid ${SRID} +${DIR}/app/create_app.py --pg_service ${PGSERVICE} --srid ${SRID} --extension_names ${EXTENSION_NAMES} diff --git a/docker-compose.yml b/docker-compose.yml index 87e1a40f0..0d2196832 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,8 @@ services: POSTGIS_IMAGE: ${POSTGIS_IMAGE:-postgis/postgis:14-3.4} image: teksi/tww:${DOCKER_TAG:-unstable} working_dir: /src + environment: + - EXTENSION_NAMES volumes: - .:/src ports: diff --git a/docs/en/extensions-guide/initialize-extensions.rst b/docs/en/extensions-guide/initialize-extensions.rst index 1b758b736..86a8fed11 100644 --- a/docs/en/extensions-guide/initialize-extensions.rst +++ b/docs/en/extensions-guide/initialize-extensions.rst @@ -47,15 +47,12 @@ In the future, an adapted value list sql will be provided. For now, we will have set /p myservice="Please enter the service name? (e.g. tww_community) " - python %tww_dir%\extensions\extension_manager.py --pg_service %myservice% --extension_name "agxx" - python %tww_dir%\app\create_app.py --pg_service %myservice% --srid 2056 + python %tww_dir%\datamodel\app\create_app.py --pg_service %myservice% --srid 2056 --drop-schema --extension_names agxx foobar demo - PAUSE -Important notes: + PAUSE -* Do not use the --drop_schema flag on create_app.py, as all the extension views are to be stored in the app schema Generate the data model under Linux diff --git a/plugin/teksi_wastewater/gui/twwsettingsdialog.py b/plugin/teksi_wastewater/gui/twwsettingsdialog.py index 9b7ba3bb0..2983111cf 100644 --- a/plugin/teksi_wastewater/gui/twwsettingsdialog.py +++ b/plugin/teksi_wastewater/gui/twwsettingsdialog.py @@ -28,6 +28,8 @@ from qgis.PyQt.QtCore import QSettings, pyqtSlot from qgis.PyQt.QtGui import QColor from qgis.PyQt.QtWidgets import QDialog, QFileDialog +from teksi_wastewater.utils.database_utils import DatabaseUtils +from teksi_wastewater.utils.twwlayermanager import TwwLayerManager from ..utils import get_ui_class @@ -58,6 +60,11 @@ def __init__(self, parent=None): adminmode = self.settings.value("/TWW/AdminMode", False, type=bool) self.mCbAdminMode.setChecked(adminmode) + ag6496extension = self.settings.value("/TWW/AGxxExtensions", False, type=bool) + self.mCbAg6496Extension.setChecked(ag6496extension) + + self.initAG64LastModificationCombobox() + lyr_special_structures, _ = project.readEntry("TWW", "SpecialStructureLayer") lyr_graph_edges, _ = project.readEntry("TWW", "GraphEdgeLayer") lyr_graph_nodes, _ = project.readEntry("TWW", "GraphNodeLayer") @@ -101,6 +108,85 @@ def initLayerCombobox(self, combobox, default): if idx != -1: combobox.setCurrentIndex(idx) + def initAG64LastModificationCombobox(self): + default = "None" + idx = self.mCbAg6496LastModification.currentIndex() + if not idx or idx == -1: + self.mCbAg6496LastModification.setCurrentIndex( + self.mCbAg6496LastModification.findText(default) + ) + if ( + self.mCbAg6496Extension.isChecked() + ): # use if clause to not trigger any db calls on startup unless necessary + conn_exists = self._configure_database_connection_config_from_tww_layer() + if conn_exists: + pgconf = DatabaseUtils.get_pgconf() + table_exists = DatabaseUtils.fetchone( + """SELECT EXISTS( SELECT 1 FROM information_schema.tables + WHERE table_schema = 'tww_cfg' + AND table_name = 'agxx_last_modification_updater');""" + ) + if table_exists[0]: + agxx_last_mod_setting = DatabaseUtils.fetchone( + f""" + SELECT ag_update_type + FROM tww_cfg.agxx_last_modification_updater + WHERE username='{pgconf["user"]}'; + """ + ) + if agxx_last_mod_setting: + idx = self.mCbAg6496LastModification.findText(agxx_last_mod_setting[0]) + if idx != -1: + self.mCbAg6496LastModification.setCurrentIndex(idx) + + def _configure_database_connection_config_from_tww_layer(self): + """Configures tww2ili using the currently loaded TWW project layer""" + + pg_layer = TwwLayerManager.layer("vw_tww_wastewater_structure") + if pg_layer: + DatabaseUtils.databaseConfig.PGSERVICE = pg_layer.dataProvider().uri().service() + DatabaseUtils.databaseConfig.PGHOST = pg_layer.dataProvider().uri().host() + DatabaseUtils.databaseConfig.PGPORT = pg_layer.dataProvider().uri().port() + DatabaseUtils.databaseConfig.PGDATABASE = pg_layer.dataProvider().uri().database() + DatabaseUtils.databaseConfig.PGUSER = pg_layer.dataProvider().uri().username() + DatabaseUtils.databaseConfig.PGPASS = pg_layer.dataProvider().uri().password() + return True + else: + return False + + def execAG64LastModificationCombobox(self): + self.mCbAg6496LastModification.currentIndex() + conn_exists = self._configure_database_connection_config_from_tww_layer() + if conn_exists: + pgconf = DatabaseUtils.get_pgconf() + table_exists = DatabaseUtils.fetchone( + """SELECT EXISTS( SELECT 1 FROM information_schema.tables + WHERE table_schema = 'tww_cfg' + AND table_name = 'agxx_last_modification_updater');""" + ) + if table_exists[0]: + agxx_last_mod_setting = DatabaseUtils.fetchone( + f""" + SELECT ag_update_type + FROM tww_cfg.agxx_last_modification_updater + WHERE username='{pgconf["user"]}'; + """ + ) + if agxx_last_mod_setting: + DatabaseUtils.execute( + f""" + UPDATE tww_cfg.agxx_last_modification_updater + SET ag_update_type = '{self.mCbAg6496LastModification.currentText()}' + WHERE username ='{pgconf["user"]}';""" + ) + else: + DatabaseUtils.execute( + f""" + INSERT INTO tww_cfg.agxx_last_modification_updater (username, ag_update_type) + VALUES ('{pgconf["user"]}','{self.mCbAg6496LastModification.currentText()}') + ;""" + ) + @pyqtSlot() def onAccept(self): twwlogger = logging.getLogger("tww") @@ -113,6 +199,11 @@ def onAccept(self): self.settings.setValue("/TWW/DeveloperMode", self.mCbDevelMode.isChecked()) self.settings.setValue("/TWW/AdminMode", self.mCbAdminMode.isChecked()) + # AG-xx extensions + self.settings.setValue("/TWW/AGxxExtensions", self.mCbAg6496Extension.isChecked()) + if self.mCbAg6496Extension.isChecked(): + self.execAG64LastModificationCombobox() + # Logging if hasattr(twwlogger, "twwFileHandler"): twwlogger.removeHandler(twwlogger.twwFileHandler) diff --git a/plugin/teksi_wastewater/interlis/config.py b/plugin/teksi_wastewater/interlis/config.py index 1bfeeb518..f8a792f9a 100644 --- a/plugin/teksi_wastewater/interlis/config.py +++ b/plugin/teksi_wastewater/interlis/config.py @@ -9,7 +9,7 @@ TWW_VL_SCHEMA = "tww_vl" TWW_SYS_SCHEMA = "tww_sys" ABWASSER_SCHEMA = "pg2ili_abwasser" -TWW_AG_SCHEMA = "tww_ag6496" +TWW_APP_SCHEMA = "tww_app" MODEL_NAME_VSA_KEK = "VSA_KEK_2020_1_LV95" MODEL_NAME_SIA405_ABWASSER = "SIA405_ABWASSER_2020_1_LV95" MODEL_NAME_SIA405_BASE_ABWASSER = "SIA405_Base_Abwasser_1_LV95" diff --git a/plugin/teksi_wastewater/interlis/data/Organisationstabelle_AG64.xtf b/plugin/teksi_wastewater/interlis/data/Organisationstabelle_AG64.xtf new file mode 100644 index 000000000..e4c0adb79 --- /dev/null +++ b/plugin/teksi_wastewater/interlis/data/Organisationstabelle_AG64.xtf @@ -0,0 +1,1069 @@ + + + + + + + + + + dataset generated by AfU AG, last update 20230524 please send amendements and additions to andreas.gloor@ag.ch, data repository: https://www.ag.ch/umwelt + + + +ch113jqg000000000001CHE-100.127.635 Kanton Aargau, Dep. Bau, Verkehr & Umwelt (BVU), VerkehrsinfrastrukturAfU AargauKanton + 20110901 + +ch113jqg000000000002CHE-102.480.752 Acht Grad Ost AGAfU Aargauandere + 20160921Neue Bezeichnung + +ch113jqg000000000003CHE-102.441.189 Emch + Berger AG ZofingenAfU Aargauandere + 20110901 + +ch113jqg000000000004CHE-112.557.422 Gemeinde Hendschiken, AbwasserbeseitigungHendschiken AfU AargauGemeinde + 20110901 + +ch113jqg000000000005CHE-101.238.591 IBAarau AGAfU Aargauandere + 20110901 + +ch113jqg000000000006CHE-109.261.501 IBB Strom AGAfU Aargauandere + 20110901nicht IBB Energie AG + +ch113jqg000000000007CHE-109.388.952 IBW Technik AGAfU Aargauandere + 20110901 + +ch113jqg000000000008CHE-107.083.950 Berger Wenger Plattner AG AarauAfU Aargauandere + 20110901 + +ch113jqg000000000009CHE-115.635.395 Ingenieurbüro Senn AGAfU Aargauandere + 20110901 + +ch113jqg000000000010CHE-113.887.158 Steinmann Kreisgeometer BadenAfU Aargauandere + 20110901Buero Steinmann + +ch113jqg000000000011CHE-105.772.518 Ingenieurbüro K. Lienhard AG BuchsAfU Aargauandere + 20110901 + +ch113jqg000000000012CHE-105.781.670 KIP Knoblauch Ingenieur und PartnerAfU Aargauandere + 20110901 + +ch113jqg000000000013CHE-105.949.107 Koch + Partner, Ingenieure, Geometer, PlanerAfU Aargauandere + 20110901Laufenburg + +ch113jqg000000000014CHE-105.943.441 KSL Ingenieure AGAfU Aargauandere + 20210616Neue Bezeichnung + +ch113jqg000000000015CHE-107.974.079 Bodmer Bauingenieure AGAfU Aargauandere + 20110901 + +ch113jqg000000000016CHE-108.644.549 Porta AG Ingenieure Planer GeometerAfU Aargauandere + 20161129Neue Bezeichnung + +ch113jqg000000000017CHE-106.843.428 Regionalwerke AG BadenRWB AfU Aargauandere + 20110901 + +ch113jqg000000000018CHE-115.376.213 Rusterholz Partner AG, Ingenieure und PlanerAfU Aargauandere + 20130729Neue Bezeichnung + +ch113jqg000000000019CHE-105.942.915 Scheidegger & Partner, Ingenieure & PlanerAfU Aargauandere + 20110901 + +ch113jqg000000000020CHE-203.025.931 TBS Strom AGAfU Aargauandere + 20110901 + +ch113jqg000000000021CHE-226.148.390 suisseplan Ingenieure AG Aarau, Zweigniederlassung SchöftlandAfU Aargauandere + 20110901 + +ch113jqg000000000022CHE-308.298.885 suisseplan Ingenieure AG Aarau, Zweigniederlassung HägglingenAfU Aargauandere + 20110901 + +ch113jqg000000000023CHE-105.935.016 Ingenieurbüro Kost + Partner AGAfU Aargauandere + 20110901 + +ch113jqg000000000024CHE-114.279.702 Ballmer + Partner AGAfU Aargauandere + 20110901 + +ch113jqg000000000025CHE-100.060.646 Gemeinde Wohlen AG, AbwasserbeseitigungWohlen AfU AargauGemeinde + 20110901 + +ch113jqg000000000026CHE-114.871.556 Kantonales VermessungsamtAfU AargauKanton + 20110901 + +ch113jqg000000000027CHE-116.276.169 Kanton Aargau, Departement Finanzen & RessourcenAfU AargauKanton + 20110901 + +ch113jqg000000000028CHE-108.631.943 Balz & Partner AGAfU Aargauandere + 20110901 + +ch113jqg000000000029CHE-107.075.169 Ackermann + Wernli AGAfU Aargauandere + 20110901 + +ch113jqg000000000030CHE-108.669.360 Bélat + PartnerAfU Aargauandere + 20130404 + +ch113jqg000000000031CHE-397.421.795 CES Bauingenieur AGAfU Aargauandere + 20130404 + +ch113jqg000000000032CHE-100.647.099 Einwohnergemeinde Birr, AbwasserbeseitigungBirr AfU AargauGemeinde + 20130404 + +ch113jqg000000000033CHE-112.543.408 Einwohnergemeinde Tägerig, AbwasserbeseitigungTägerig AfU AargauGemeinde + 20130404 + +ch113jqg000000000034CHE-105.627.454 Einwohnergemeinde Zufikon, AbwasserbeseitigungZufikon AfU AargauGemeinde + 20130404 + +ch113jqg000000000035CHE-105.900.130 Fischer + Schild AG, Ingenieurbüro für Hoch- und TiefbauAfU Aargauandere + 20130404 + +ch113jqg000000000036CHE-446.755.393 Flury Planer + Ingenieure AGAfU Aargauandere + 20130404Lenzburg + +ch113jqg000000000037CHE-391.794.111 Flury Planer + Ingenieure AGAfU Aargauandere + 20130404Seon + +ch113jqg000000000038CHE-115.078.951 Gemeinde BruneggBrunegg AfU AargauGemeinde + 20130404 + +ch113jqg000000000039CHE-114.801.751 Gemeinde Frick, AbwasserbeseitigungFrick AfU AargauGemeinde + 20130404 + +ch113jqg000000000040CHE-112.609.935 Gemeinde Meisterschwanden, AbwasserbeseitigungMeisterschw. AfU AargauGemeinde + 20130404 + +ch113jqg000000000041CHE-112.571.244 Gemeinde Menziken, AbwasserentsorgungMenziken AfU AargauGemeinde + 20130404 + +ch113jqg000000000042CHE-105.616.315 Gemeinde Oftringen, AbwasserbeseitigungOftringen AfU AargauGemeinde + 20130404 + +ch113jqg000000000043CHE-105.603.301 Gemeinde Reinach, AbwasserbeseitigungReinach AfU AargauGemeinde + 20130404 + +ch113jqg000000000044CHE-112.602.287 Gemeinde Safenwil, AbwasserbeseitigungSafenwil AfU AargauGemeinde + 20130404 + +ch113jqg000000000045CHE-115.075.378 Gemeinde SpreitenbachSpreitenbach AfU AargauGemeinde + 20130404 + +ch113jqg000000000046CHE-112.607.244 Gemeinde Strengelbach, AbwasserentsorgungStrengelbach AfU AargauGemeinde + 20130404 + +ch113jqg000000000047CHE-112.614.238 Gemeinde Teufenthal, AbwasserbeseitigungTeufenthal AfU AargauGemeinde + 20130404 + +ch113jqg000000000048CHE-112.564.474 Gemeinde Villmergen, AbwasserbeseitigungVillmergen AfU AargauGemeinde + 20130404 + +ch113jqg000000000050CHE-112.793.690 Gemeinde Widen, AbwasserentsorgungWiden AfU AargauGemeinde + 20130404 + +ch113jqg000000000051CHE-335.814.571 Gruner Ingenieure AGAfU Aargauandere + 20130404 + +ch113jqg000000000052CHE-106.829.061 Gwerder + Partner AGAfU Aargauandere + 20130404 + +ch113jqg000000000053CHE-105.954.611 Hunziker Betatech AGAfU Aargauandere + 20130404Hauptsitz Winterthur + +ch113jqg000000000054CHE-102.265.515 Ingenieurbureau Schifferli AG, KlingnauAfU Aargauandere + 20130404 + +ch113jqg000000000055CHE-202.146.495 Ingenieurbüro Hans Eichenberger AGAfU Aargauandere + 20130404 + +ch113jqg000000000056CHE-107.437.930 Ingenieurbüro Kaufmann und Partner AGAfU Aargauandere + 20130404 + +ch113jqg000000000057CHE-102.146.394 Ingenieurbüro P. Zumbach SIA/USIC AGAfU Aargauandere + 20130404 + +ch113jqg000000000058CHE-108.026.877 Ingenieurbüro Stauffer AGAfU Aargauandere + 20130404 + +ch113jqg000000000059CHE-468.757.561 Koch + Partner, Ingenieure, Geometer, PlanerAfU Aargauandere + 20130405 + +ch113jqg000000000060CHE-110.584.690 Minikus Vogt & Partner AGAfU Aargauandere + 20130406 + +ch113jqg000000000061CHE-107.982.452 MSL Ingenieurbüro AGAfU Aargauandere + 20130407 + +ch113jqg000000000063CHE-107.712.792 Portmann und PartnerAfU Aargauandere + 20130409 + +ch113jqg000000000064CHE-108.529.256 Relis AGAfU Aargauandere + 20130410 + +ch113jqg000000000065CHE-112.540.491 Stadt Bremgarten, AbwasserbeseitigungBremgarten AfU AargauGemeinde + 20130411 + +ch113jqg000000000066CHE-113.521.220 Stadt Rheinfelden Finanzverwaltung AbwasserbeseitigungRheinfelden AfU AargauGemeinde + 20130412 + +ch113jqg000000000067CHE-420.861.823 suisseplan Ingenieure AG Aarau Zweigniederlassung Wohlensuisseplan AfU Aargauandere + 20130413 + +ch113jqg000000000068CHE-109.698.660 SWL Energie AGAfU Aargauandere + 20130414 + +ch113jqg000000000069CHE-110.541.686 Von Arx + Partner AGAfU Aargauandere + 20130415 + +ch113jqg000000000070CHE-405.950.690 Waldburger Ingenieure AGAfU Aargauandere + 20130416Hottwil + +ch113jqg000000000071CHE-105.945.635 Waldburger Ingenieure AGAfU Aargauandere + 20130417Aarau + +ch113jqg000000000072CHE-112.563.523 Einwohnergemeinde SchmiedruedSchmiedrued AfU AargauGemeinde + 20130516 + +ch113jqg000000000073CHE-112.609.303 Einwohnergemeinde Schlossrued, AbwasserbeseitigungSchlossrued AfU AargauGemeinde + 20130516 + +ch113jqg000000000074CHE-100.498.965 Gemeinde Schöftland, Abt. AbwasserbeseitigungSchöftland AfU AargauGemeinde + 20130516 + +ch113jqg000000000075CHE-112.797.771 Gemeinde Staffelbach, AbwasserStaffelbach AfU AargauGemeinde + 20130516 + +ch113jqg000000000076CHE-105.629.619 Stadt Zofingen, AbwasserbeseitigungZofingen AfU AargauGemeinde + 20130729 + +ch113jqg000000000077CHE-113.563.916 Einwohnergemeinde Rothrist, AbwasserbeseitigungRothrist AfU AargauGemeinde + 20130729 + +ch113jqg000000000078CHE-112.538.181 Einwohnergemeinde Buchs AG, AbwasserentsorgungBuchs AfU AargauGemeinde + 20130729 + +ch113jqg000000000079CHE-100.620.344 Gemeinde Suhr, AbwasserbeseitigungSuhr AfU AargauGemeinde + 20130729 + +ch113jqg000000000080CHE-472.773.215 Flury Planer + Ingenieure AGAfU Aargauandere + 20130729Reinach (AG) + +ch113jqg000000000081CHE-498.021.909 Steinmann Ingenieure und Planer AGAfU Aargauandere + 20130729Brugg + +ch113jqg000000000082CHE-115.076.515 Einwohnergemeinde VilligenVilligen AfU AargauGemeinde + 20130729 + +ch113jqg000000000084CHE-116.137.409 Reto Porta Nachführungsgeometer Kreis ZurzachAfU Aargauandere + 20130729 + +ch113jqg000000000085CHE-112.565.226 Einwohnergemeinde Gebenstorf, AbwasserbeseitigungGebensdorf AfU AargauGemeinde + 20170410 + +ch113jqg000000000086CHE-112.797.759 Einwohnergemeinde Seon, Technische Betriebe Seon, FernwärmeversorgungSeon AfU AargauGemeinde + 20130729 + +ch113jqg000000000087CHE-105.595.481 Einwohnergemeinde Gränichen, AbwasserbeseitigungAfU AargauGemeinde + 20170410 + +ch113jqg000000000088CHE-287.320.502 CSD Ingenieure AGCSD AfU Aargauandere + 21050130Filiale Aarau + +ch113jqg000000000089CHE-109.278.967 IBB Wasser AGIBB AfU Aargauandere + 20150213 + +ch113jqg000000000090CHE-113.544.540 Abwasserverband Sammelkanal BirrfeldSAKA_Bru-Bir AfU AargauAbwasserverband + 20150213 + +ch113jqg000000000091CHE-113.544.497 Abwasserverband Kläranlage Brugg-Birrfeld, Geschäftsstelle IBB Wasser AGARA Bru-Birr AfU AargauAbwasserverband + 20150213 + +ch113jqg000000000092CHE-112.538.028 Einwohnergemeinde Windisch, AbwasserbeseitigungWindisch AfU AargauGemeinde + 20150213 + +ch113jqg000000000093CHE-114.799.657 Einwohnergemeinde_Brugg,_AbwasserbeseitigungBrugg AfU AargauGemeinde + 20150213 + +ch113jqg000000000094CHE-000.000.000 PrivatAfU AargauPrivat + 20150213 + +ch113jqg000000000095CHE-112.544.402 Gemeinde Auenstein, AbwasserbeseitigungAuenstein AfU AargauGemeinde + 20150501 + +ch113jqg000000000096CHE-105.833.605 Dr. Heinrich Jäckli AGAfU Aargauandere + 20150821Zürich + +ch113jqg000000000097CHE-105.870.641 Trigonet AGAfU Aargauandere + 20150821Stans + +ch113jqg000000000098CHE-105.946.818 Wälli IngenieureAfU Aargauandere + 20150821Arbon + +ch113jqg000000000099CHE-238.251.882 IBB Energie AGAfU Aargauandere + 20150828ungleich IBB Strom AG + +ch113jqg000000000100CHE-114.063.378 NSNW AGAfU Aargauandere + 20150828Unterhalt_AutobahnAG + +ch113jqg000000000101CHE-102.909.703 Schweizerische BundesbahnenSBB AfU AargauBund + 20150828 + +ch113jqg000000000102CHE-112.568.489 Gemeinde Oberentfelden, AbwasserbeseitigungOberentfeld. AfU AargauGemeinde + 20150828 + +ch113jqg000000000103CHE-115.075.415 Gemeinde UntersiggenthalU.siggenthal AfU AargauGemeinde + 20150828 + +ch113jqg000000000104CHE-115.250.339 Gemeinde Aristau, AbwasserbeseitigungAristau AfU AargauGemeinde + 20150828 + +ch113jqg000000000105CHE-113.537.215 Einwohnergemeinde Böttstein, AbwasserbeseitigungBöttstein AfU AargauGemeinde + 20150828auch Ara + +ch113jqg000000000106CHE-424.195.422 armasuisseAfU AargauBund + 20150904Standort Bern + +ch113jqg000000000107CHE-000.000.000 unbekanntAfU Aargauandere + 20150904 + +ch113jqg000000000108CHE-304.459.014 Bundesamt für Strassen (Astra)Astra AfU AargauBund + 20151014 + +ch113jqg000000000109CHE-112.592.921 Einwohnergemeinde Unterentfelden, AbwasserbeseitigungU.entfelden AfU AargauGemeinde + 20151014 + +ch113jqg000000000110CHE-108.955.736 Abwasserverband Region Baden WettingenAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000111CHE-105.063.586 Stadt Baden, DS 711 AbwasserbeseitigungBaden AfU AargauGemeinde + 20160205 + +ch113jqg000000000112CHE-112.546.298 Gemeinde Bellikon, AbwasserbeseitigungBellikon AfU AargauGemeinde + 20160205 + +ch113jqg000000000113CHE-100.051.860 Einwohnergemeinde Birmenstorf AG, AbwasserentsorgungBirmenstorf AfU AargauGemeinde + 20160205 + +ch113jqg000000000114CHE-112.571.540 Kläranlage Birrhard, AbwasserreinigungsanlageBirrhard AfU AargauGemeinde + 20160205 + +ch113jqg000000000115CHE-115.257.896 Abwasser Oberbözberg, Gemeinde BözbergBözberg AfU AargauGemeinde + 20160205 + +ch113jqg000000000116CHE-112.956.331 Gemeinde Döttingen, AbwasserbeseitigungDöttingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000117BöztalAfU AargauGemeinde + 20220523Vormals Effingen, ab 1.1.22 Böztal + +ch113jqg000000000118CHE-114.801.449 Gemeinde Ehrendingen, AbwasserentsorgungEhrendingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000119CHE-114.950.925 Einwohnergemeinde Endingen, AbwasserEndingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000120CHE-112.535.136 Einwohnergemeinde Ennetbaden, Abwasserentsorgung/BauverwaltungEnnetbaden AfU AargauGemeinde + 20160205 + +ch113jqg000000000121CHE-109.369.334 Einwohnergemeinde Fislisbach, Abwasser / AnschlussgebührenFislisbach AfU AargauGemeinde + 20160205 + +ch113jqg000000000122CHE-105.622.681 Gemeinde Freienwil, AbwasserbeseitigungFreienwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000123CHE-479.570.920 Einwohnergemeinde Habsburg, AbwasserbeseitigungHabsburg AfU AargauGemeinde + 20160205 + +ch113jqg000000000124CHE-112.587.392 Gemeinde Hausen bei Brugg, AbwasserbeseitigungHausen AfU AargauGemeinde + 20160205 + +ch113jqg000000000125CHE-115.095.889 Gemeinde Holderbank, AbwasserHolderbank AfU AargauGemeinde + 20160205 + +ch113jqg000000000126CHE-115.253.846 Gemeinde Killwangen, AbwasserbeseitigungKillwangen AfU AargauGemeinde + 20160205 + +ch113jqg000000000127CHE-113.544.758 Finanzverw. der Gemeinde Künten, AbwasserbeseitigungKünten AfU AargauGemeinde + 20160205 + +ch113jqg000000000128CHE-112.799.445 Einwohnergemeinde Lengnau, AbwasserbeseitigungLengnau AfU AargauGemeinde + 20160205 + +ch113jqg000000000129CHE-112.795.370 Einwohnergemeinde Lupfig, AbwasserbeseitigungLupfig AfU AargauGemeinde + 20160205 + +ch113jqg000000000130CHE-112.410.233 Einwohnergemeinde Mägenwil, AbwasserbeseitigungMägenwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000131CHE-112.798.428 Gemeinde Mellingen, AbwasserbeseitigungMellingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000132CHE-482.154.628 Einwohnergemeinde Mönthal, AbwasserbeseitigungMönthal AfU AargauGemeinde + 20160205 + +ch113jqg000000000133CHE-112.609.881 Gemeinde Möriken-Wildegg, AbwasserentsorgungMöriken AfU AargauGemeinde + 20160205 + +ch113jqg000000000134CHE-112.570.747 Gemeinde Mülligen, Kläranlage/AbwasserbeseitigungMülligen AfU AargauGemeinde + 20160205 + +ch113jqg000000000135CHE-112.568.911 Gemeinde Neuenhof, AbwasserbeseitigungNeuenhof AfU AargauGemeinde + 20160205 + +ch113jqg000000000136CHE-112.609.415 Gemeinde Niederrohrdorf, AbwasserbeseitigungN.rohrdorf AfU AargauGemeinde + 20160205 + +ch113jqg000000000137CHE-112.793.046 Gemeinde Oberrohrdorf, AbwasserbeseitigungO.rohrdorf AfU AargauGemeinde + 20160205 + +ch113jqg000000000138CHE-114.791.880 Einwohnergemeinde Obersiggenthal, AbwasserbeseitigungO.siggenthal AfU AargauGemeinde + 20160205 + +ch113jqg000000000139CHE-112.543.199 Einwohnergemeinde Remetschwil, AbwasserbeseitigungRemetschwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000140CHE-105.620.179 Einwohnergemeinde Remigen, AbwasserentsorgungRemigen AfU AargauGemeinde + 20160205 + +ch113jqg000000000141CHE-115.257.726 Einwohnergemeinde Riniken, AbwasserbeseitigungRiniken AfU AargauGemeinde + 20160205 + +ch113jqg000000000142CHE-112.790.208 Gemeinde Rüfenach, Kläranlage/AbwasserbeseitigungRüfenach AfU AargauGemeinde + 20160205 + +ch113jqg000000000143LupfigAfU AargauGemeinde + 20220523Vormals Scherz, per 1.1.18 Lupfig + +ch113jqg000000000144CHE-100.057.064 Gemeinde Schinznach, AbwasserbeseitigungSchinznach AfU AargauGemeinde + 20160205 + +ch113jqg000000000145BruggAfU AargauGemeinde + 20160205Vormals Schinznach-Bad, per 1.1.20 Brugg + +ch113jqg000000000146CHE-108.957.942 Einwohnergemeinde Schneisingen, AbwasserbeseitigungSchneisingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000147CHE-112.793.402 Einwohnergemeinde Stetten AG, AbwasserbeseitigungStetten AfU AargauGemeinde + 20160205 + +ch113jqg000000000148CHE-108.960.660 Abwasserverband Stetten-Remetschwil-NiederwilAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000149CHE-112.579.056 Gemeinde Tegerfelden, Kläranlage/AbwasserbeseitigungTegerfelden AfU AargauGemeinde + 20160205 + +ch113jqg000000000150CHE-112.571.310 Gemeinde Thalheim, AbwasserbeseitigungThalheim AfU AargauGemeinde + 20160205 + +ch113jqg000000000151CHE-112.901.241 Gemeinde Turgi, AbwasserbeseitigungTurgi AfU AargauGemeinde + 20160205 + +ch113jqg000000000152CHE-112.539.111 Einwohnergemeinde Veltheim AG, AbwasserbeseitigungVeltheim AfU AargauGemeinde + 20160205 + +ch113jqg000000000153CHE-112.571.764 Gemeinde Villnachern, AbwasserbeseitigungVillnachern AfU AargauGemeinde + 20160205auch Ara + +ch113jqg000000000154CHE-115.075.438 Gemeinde WettingenWettingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000155CHE-112.546.625 Einwohnergemeinde Wohlenschwil, AbwasserbeseitigungWohlenschwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000156CHE-113.563.106 Einwohnergemeinde Würenlingen, AbwasserbeseitigungWürenlingen AfU AargauGemeinde + 20160205auch Ara + +ch113jqg000000000157CHE-112.587.653 Gemeinde Würenlos, AbwasserbeseitigungWürenlos AfU AargauGemeinde + 20160205 + +ch113jqg000000000158CHE-116.071.940 Abwasserverband OberwynentalAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000159CHE-114.838.228 Einwohnergemeinde Oeschgen, AbwasserentsorgungOeschgen AfU AargauGemeinde + 20160205 + +ch113jqg000000000160CHE-112.988.727 Gemeinde Oberlunkhofen, AbwasserO.lunkhofen AfU AargauGemeinde + 20160205 + +ch113jqg000000000161CHE-116.068.777 Abwasserverband Region MöhlinAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000162CHE-105.576.733 Abwasserverband Reuss-SchachenAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000163CHE-116.072.017 Abwasserverband Region MellingenAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000164CHE-451.264.758 Abwasserverband Gallenkirch-LinnAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000165CHE-114.344.127 Einwohnergemeinde Leuggern, AbwasserentsorgungLeuggern AfU AargauGemeinde + 20160205auch Ara + +ch113jqg000000000166CHE-112.809.374 Abwasserverband SurbtalAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000167CHE-109.474.669 Abwasserverband SchinbergAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000168CHE-116.016.941 Abwasserverband BeehzAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000169CHE-116.332.721 Abwasserverband "Rehmatte"AfU AargauAbwasserverband + 20160205 + +ch113jqg000000000170CHE-112.554.429 Gemeinde Fahrwangen, AbwasserentsorgungFahrwangen AfU AargauGemeinde + 20160205 + +ch113jqg000000000171CHE-112.535.047 Gemeinde Eggenwil, AbwasserentsorgungEggenwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000172CHE-105.599.421 Abwasserverband Falkenmatt/ SekretariatAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000173CHE-116.074.217 Abwasserverband ChlostermatteAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000174CHE-112.540.924 Gemeinde Wettingen, Abwasserbeseitigung, RathausWettingen AfU AargauGemeinde + 20160215 + +ch113jqg000000000175CHE-100.434.008 Einwohnergemeinde Seengen, AbwasserbeseitigungSeengen AfU AargauGemeinde + 20160229 + +ch113jqg000000000176CHE-100.492.804 Gemeinde Rupperswil, Abt. AbwasserverbandRupperswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000177BöztalAfU AargauGemeinde + 20220523Vormals Hornussen, ab 1.1.22 Böztal + +ch113jqg000000000178CHE-100.774.065 Gemeinde Ammerswil, KanalisationAmmerswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000179CHE-105.332.591 Einwohnergemeinde Unterlunkhofen, AbwasserbeseitigungU.lunkhofen AfU AargauGemeinde + 20160229 + +ch113jqg000000000180CHE-105.593.306 Einwohnergemeinde Bünzen, AbwasserbeseitigungBünzen AfU AargauGemeinde + 20160229 + +ch113jqg000000000181CHE-105.598.953 Gemeinde Aarburg, AbwasserbeseitigungAarburg AfU AargauGemeinde + 20160229 + +ch113jqg000000000182CHE-105.601.236 Gemeinde Murgenthal, AbwasserentsorgungMurgenthal AfU AargauGemeinde + 20160229 + +ch113jqg000000000183CHE-105.605.079 Einwohnergemeinde Oberkulm, AbwasserbeseitigungOberkulm AfU AargauGemeinde + 20160229 + +ch113jqg000000000184CHE-105.607.233 Einwohnergemeinde Muhen, AbwasserbeseitigungMuhen AfU AargauGemeinde + 20160229 + +ch113jqg000000000185CHE-105.614.440 Gemeinde Obermumpf, AbwasserbeseitigungObermumpf AfU AargauGemeinde + 20160229 + +ch113jqg000000000186CHE-105.616.249 Einwohnergemeinde Dürrenäsch, AbwasserentsorgungDürrenäsch AfU AargauGemeinde + 20160229 + +ch113jqg000000000187CHE-106.254.999 Einwohnergemeinde Zeihen, AbwasserbeseitigungZeihen AfU AargauGemeinde + 20160229 + +ch113jqg000000000188CHE-108.958.663 Gemeinde Islisberg, AbwasserbeseitigungIslisberg AfU AargauGemeinde + 20160229 + +ch113jqg000000000189CHE-108.959.898 Abwasserverband Sins-Auw-Mühlau-Abtwil, VerwaltungAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000190CHE-108.960.476 Gemeinde Oberrüti, AbwasserbeseitigungOberrüti AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000191CHE-108.965.108 Einwohnergemeinde Gansingen, AbwasserbeseitigungGansingen AfU AargauGemeinde + 20160229 + +ch113jqg000000000192CHE-108.965.315 Gemeinde Leibstadt, AbwasserbeseitigungLeibstadt AfU AargauGemeinde + 20160229 + +ch113jqg000000000193CHE-108.965.396 Einwohnergemeinde Siglistorf, AbwasserbeseitigungSiglistorf AfU AargauGemeinde + 20160229 + +ch113jqg000000000194CHE-112.410.121 Gemeinde Kirchleerau, AbwasserbeseitigungKirchleerau AfU AargauGemeinde + 20160229 + +ch113jqg000000000195CHE-112.410.144 Einwohnergemeinde Dietwil, AbwasserbeseitigungDietwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000196CHE-112.410.196 Gemeinde Othmarsingen, AbwasserreinigungOthmarsingen AfU AargauGemeinde + 20160229 + +ch113jqg000000000197CHE-112.410.291 Einwohnergemeinde Boniswil, AbwasserbeseitigungBoniswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000198CHE-112.410.598 Einwohnergemeinde Hallwil, AbwasserbeseitigungHallwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000199CHE-112.534.993 Gemeinde Bottenwil, AbwasserbeseitigungBottenwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000200CHE-112.537.170 Einwohnergemeinde Sisseln, AbwasserSisseln AfU AargauGemeinde + 20160229 + +ch113jqg000000000201CHE-112.537.307 Einwohnergemeinde Merenschwand, AbwasserseitigungMerenschwand AfU AargauGemeinde + 20160229 + +ch113jqg000000000202CHE-112.538.353 Einwohnergemeinde Brittnau, AbwasserbeseitigungBrittnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000203CHE-112.557.008 Einwohnergemeinde Niederlenz AbwasserentsorgungNiederlenz AfU AargauGemeinde + 20160229 + +ch113jqg000000000204CHE-112.558.002 Gemeinde Fischbach-Göslikon, AbwasserentsorgungFischbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000205CHE-112.558.344 Gemeinde Staufen, AbwasserbeseitigungStaufen AfU AargauGemeinde + 20160229 + +ch113jqg000000000206CHE-112.558.396 Einwohnergemeinde Buttwil, AbwasserbeseitigungButtwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000207CHE-112.558.456 Einwohnergemeinde Schafisheim, AbwasserbeseitigungSchafisheim AfU AargauGemeinde + 20160229 + +ch113jqg000000000208CHE-112.563.138 Einwohnergemeinde Eiken, ARA Eiken, Kläranlage / AbwasserEiken AfU AargauGemeinde + 20160229 + +ch113jqg000000000209CHE-112.564.221 Gemeinde Hirschthal, AbwasserbeseitigungHirschthal AfU AargauGemeinde + 20160229 + +ch113jqg000000000210CHE-112.564.273 Einwohnergemeinde Biberstein, AbwasserentsorgungBiberstein AfU AargauGemeinde + 20160229 + +ch113jqg000000000211CHE-112.565.025 Gemeinde Egliswil, AbwasserbeseitigungEgliswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000212CHE-112.568.905 Einwohnergemeinde Rottenschwil, AbwasserbeseitigungRottenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000213CHE-112.569.023 Einwohnergemeinde Sarmenstorf, AbwasserreinigungSarmenstorf AfU AargauGemeinde + 20160229 + +ch113jqg000000000214CHE-112.570.285 Gemeinde Oberwil-Lieli, AbwasserbeseitigungO.wil-Lieli AfU AargauGemeinde + 20160229 + +ch113jqg000000000215CHE-112.570.552 Einwohnergemeinde Waltenschwil, AbwasserbeseitigungWaltenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000216CHE-112.571.020 Einwohnergemeinde Kaiseraugst, AbwasserentsorgungKaiseraugst AfU AargauGemeinde + 20160229 + +ch113jqg000000000217CHE-112.571.480 Gemeinde Holziken, AbwasserbeseitigungHolziken AfU AargauGemeinde + 20160229 + +ch113jqg000000000218CHE-112.573.898 Gemeinde Zetzwil, AbwasserbeseitigungZetzwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000219CHE-112.573.912 Gemeinde Mühlau, Kläranlage/AbwasserbeseitigungMühlau AfU AargauGemeinde + 20160229 + +ch113jqg000000000220ZurzachAfU AargauGemeinde + 20220523vormals Rietheim, ab 1.1.22 Zurzach + +ch113jqg000000000221CHE-112.589.072 Einwohnergemeinde Leutwil, AbwasserbeseitigungLeutwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000222CHE-112.590.247 Gemeinde Fisibach, AbwasserbeseitigungFisibach AfU AargauGemeinde + 20160229 + +ch113jqg000000000223CHE-112.591.100 Gemeinde Kallern, AbwasserbeseitigungKallern AfU AargauGemeinde + 20160229 + +ch113jqg000000000224CHE-112.593.004 Einwohnergemeinde Uerkheim, AbwasserbeseitigungUerkheim AfU AargauGemeinde + 20160229 + +ch113jqg000000000225BöztalBözen AfU AargauGemeinde + 20220523Vormals Bözen, ab 1.1.22 Böztal + +ch113jqg000000000226CHE-112.609.958 Gemeinde Beinwil am See, AbwasserversorgungBeinwilaS AfU AargauGemeinde + 20160229 + +ch113jqg000000000227CHE-112.609.987 Gemeinde Gipf-Oberfrick, AbwasserbeseitigungGipf-O.frick AfU AargauGemeinde + 20160229 + +ch113jqg000000000228CHE-112.614.155 Einwohnergemeinde Küttigen, AbwasserbeseitigungKüttigen AfU AargauGemeinde + 20160229 + +ch113jqg000000000229CHE-112.614.273 Einwohnergemeinde Koblenz, Kläranlage / AbwasserreinigungKoblenz AfU AargauGemeinde + 20160229 + +ch113jqg000000000230ZurzachAfU AargauGemeinde + 20220523Vormals Rekingen, ab 1.1.22 Zurzach + +ch113jqg000000000231CHE-112.638.865 Gemeinde Moosleerau, AbwasserbeseitigungMoosleerau AfU AargauGemeinde + 20160229 + +ch113jqg000000000232CHE-112.793.595 Gemeinde Vordemwald, AbwasserbeseitigungVordemwald AfU AargauGemeinde + 20160229 + +ch113jqg000000000233CHE-112.793.661 Einwohnergemeinde Wallbach, AbwasserbeseitigungWallbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000234CHE-112.793.945 Gemeinde Unterkulm, AbwasserbeseitigungUnterkulm AfU AargauGemeinde + 20160229 + +ch113jqg000000000235CHE-112.795.200 Einwohnergemeinde Boswil, AbwasserbeseitigungBoswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000236CHE-112.795.217 Gemeinde Magden, AbwasserbeseitigungMagden AfU AargauGemeinde + 20160229 + +ch113jqg000000000237CHE-112.795.789 Einwohnergemeinde Hägglingen, AbwasserbeseitigungHägglingen AfU AargauGemeinde + 20160229 + +ch113jqg000000000238CHE-112.795.832 Einwohnergemeinde Zeiningen, AbwasserbeseitigungZeiningen AfU AargauGemeinde + 20160229 + +ch113jqg000000000239CHE-112.795.973 Gemeinde Oberhof, Dienststelle AbwasserOberhof AfU AargauGemeinde + 20160229 + +ch113jqg000000000240CHE-112.797.860 Einwohnergemeinde Muenchwilen, AbwasserbeseitigungMünchwilen AfU AargauGemeinde + 20160229 + +ch113jqg000000000241CHE-112.798.523 Einwohnergemeinde Laufenburg, AbwasserbeseitigungLaufenburg AfU AargauGemeinde + 20160229 + +ch113jqg000000000242CHE-112.798.670 Gemeinde Jonen, AbwasserentsorgungJonen AfU AargauGemeinde + 20160229 + +ch113jqg000000000243CHE-112.798.902 Stadt Klingnau, AbwasserbeseitigungKlingnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000244CHE-112.799.103 Gemeinde Koelliken, AbwasserbeseitigungKölliken AfU AargauGemeinde + 20160229 + +ch113jqg000000000245CHE-112.799.391 Gemeinde Möhlin, AbwasserbeseitigungMöhlin AfU AargauGemeinde + 20160229 + +ch113jqg000000000246CHE-112.916.633 Gemeinde Leimbach, AbwasserLeimbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000247CHE-112.966.252 Gemeinde Büttikon, AbwasserbeseitigungBüttikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000248CHE-113.393.382 Stadt Lenzburg, AbwasserbeseitigungLenzburg AfU AargauGemeinde + 20160229 + +ch113jqg000000000249CHE-113.505.221 Einwohnergemeinde Dintikon, AbwasserbeseitigungDintikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000250CHE-113.534.688 Einwohnergemeinde Gontenschwil, AbwasserbeseitigungGontenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000251CHE-113.547.165 Gemeinde Kaisten, AbwasserbeseitigungKaisten AfU AargauGemeinde + 20160229 + +ch113jqg000000000252CHE-113.563.158 Gemeinde Wölflinswil Bauamt Dienststelle AbwasserWölflinswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000253CHE-113.563.684 Gemeinde Olsberg, AbwasserOlsberg AfU AargauGemeinde + 20160229 + +ch113jqg000000000254CHE-113.729.714 Einwohnergemeinde Erlinsbach AG, AbwasserbeseitigungErlinsbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000255MenzikenAfU AargauGemeinde + 20230130Vormals Burg, ab 1.1.23 Menziken + +ch113jqg000000000256CHE-114.801.283 Gemeinde Birrwil, AbwasserentsorgungBirrwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000257CHE-114.802.213 Gemeinde Rudolfstetten- Friedlisberg, AbwasserentsorgungRudolfstett. AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000258CHE-114.916.868 Gemeinde Berikon, AbwasserentsorgungBerikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000259CHE-114.927.240 Einwohnergemeinde Wegenstetten, AbwasserbeseitigungWegenstetten AfU AargauGemeinde + 20160229 + +ch113jqg000000000260CHE-115.067.769 Stadt AarauAarau AfU AargauGemeinde + 20160229 + +ch113jqg000000000261CHE-115.075.757 Gemeinde Niederwil AGNiederwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000262Herznach-UekenAfU AargauGemeinde + 20160229vormals Herznach, ab 1.1.23 Herznach-Ueken + +ch113jqg000000000263CHE-115.079.577 Gemeinde BesenbürenBesenbüren AfU AargauGemeinde + 20160229 + +ch113jqg000000000264CHE-115.080.161 Gemeinde GeltwilGeltwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000265CHE-115.080.267 Einwohnergemeinde SinsSins AfU AargauGemeinde + 20160229 + +ch113jqg000000000266CHE-115.080.451 Einwohnergemeinde Stein AGStein AfU AargauGemeinde + 20160229 + +ch113jqg000000000267CHE-115.080.505 Gemeinde ZuzgenZuzgen AfU AargauGemeinde + 20160229 + +ch113jqg000000000268ZurzachAfU AargauGemeinde + 20220523Vormals Kaiserstuhl, ab 1.1.22 Zurzach + +ch113jqg000000000269ZurzachAfU AargauGemeinde + 20220523Vormals Böbikon, ab 1.1.22 Zurzach + +ch113jqg000000000270CHE-108.957.072 Abwasserverband Region ZurzachZurzach AfU AargauGemeinde + 20220523Vormals Bad Zurzach, ab 1.1.22 Zurzach + +ch113jqg000000000271ReitnauAfU AargauGemeinde + 20220523Vormals Attelwil, ab 1.1.19 Reitnah + +ch113jqg000000000272CHE-115.253.088 Gemeinde Dottikon, AbwasserbeseitigungDottikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000273CHE-115.257.979 Einwohnergemeinde Hunzenschwil, AbwasserbeseitigungHunzenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000274CHE-115.391.224 Einwohnergemeinde Mettauertal, AbwasserbeseitigungMettauertal AfU AargauGemeinde + 20160229 + +ch113jqg000000000275CHE-115.401.213 Gemeinde WilibergWiliberg AfU AargauGemeinde + 20160229 + +ch113jqg000000000276CHE-115.416.031 Einwohnergemeinde Hellikon, AbwasserbeseitigungHellikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000277CHE-112.564.505 Gemeinde Wittnau, KläranlageWittnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000278ZurzachAfU AargauGemeinde + 20220523Vormals Baldingen, ab 1.1.22 Zurzach + +ch113jqg000000000279CHE-115.727.229 Gemeinde MellikonMellikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000280ZurzachAfU AargauGemeinde + 20220523Vormals Wislikofen, ab 1.1.22 Zurzach + +ch113jqg000000000281CHE-115.888.714 Gemeinde Mumpf, AbwasserbeseitgungMumpf AfU AargauGemeinde + 20160229 + +ch113jqg000000000282CHE-115.982.224 Gemeinde Arni, AbwasserArni AfU AargauGemeinde + 20160229 + +ch113jqg000000000283CHE-116.014.474 Einwohnergemeinde Full-Reuenthal, AbwasserbeseitigungFull-Reuent. AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000284CHE-116.014.528 Gemeinde Schupfart, AbwasserbeseitigungSchupfart AfU AargauGemeinde + 20160229 + +ch113jqg000000000285CHE-116.017.231 Gemeinde Beinwil (Freiamt), AbwasserbeseitigungBeinwil_Fa AfU AargauGemeinde + 20160229 + +ch113jqg000000000286CHE-116.018.118 Gemeinde Reitnau, AbwasserbeseitigungReitnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000287CHE-116.134.316 Gemeinde Muri, AbwasserensorgungMuri AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000288CHE-116.259.550 Einwohnergemeinde Bettwil, AbwasserbeseitigungBettwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000289CHE-116.333.005 Einwohnergemeinde Auw, AbwasserbeseitigungAuw AfU AargauGemeinde + 20160229 + +ch113jqg000000000290CHE-116.337.546 Einwohnergemeinde Densbüren, AbwasserbeseitigungDensbüren AfU AargauGemeinde + 20160229 + +ch113jqg000000000291CHE-240.906.830 Gemeinde Uezwil, AbwasserentsorgungUezwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000292CHE-243.580.021 Gemeinde Mandach, AbwasserMandach AfU AargauGemeinde + 20160229 + +ch113jqg000000000293BöztalAfU AargauGemeinde + 20220523Vormals Elfingen, ab 1.1.22 Böztal + +ch113jqg000000000294CHE-370.036.097 Gemeinde Schwaderloch, AbwasserbeseitigungSchwaderloch AfU AargauGemeinde + 20160229 + +ch113jqg000000000295CHE-413.294.126 Gemeinde AbtwilAbtwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000296ZurzachAfU AargauGemeinde + 20220523Vormals Rümikon, ab 1.1.22 Zurzach + +ch113jqg000000000297CHE-107.914.887 Scheidegger AG, Bauingenieure & PlanerLangenthal AfU Aargauandere + 20160704Neue_Bezeichnung + +ch113jqg000000000298CHE-116.071.207 Abwasserverband Mittleres WynentalAfU AargauAbwasserverband + 20160818 + +ch113jqg000000000299CHE-112.540.249 Einwohnergemeinde Bergdietikon, AbwasserbeseitigungBergdietikon AfU AargauGemeinde + 20160921 + +ch113jqg000000000300CHE-108.956.233 ARA HallwilerseeAfU AargauAbwasserverband + 20161129 + +ch113jqg000000000301CHE-105.956.432 HOLINGER AGAfU Aargauandere + 20161129Sitz Liestal + +ch113jqg000000000302CHE-180.172.683 Hunziker Betatech AGAfU Aargauandere + 20161129Sitz Bern + +ch113jqg000000000303CHE-115.977.016 Abwasserverband Aarburg, AbwasserversorgungARA Aarburg AfU AargauAbwasserverband + 20170213 + +ch113jqg000000000304CHE-108.953.068 ERZO Entsorgung Region Zofingen KehrichtverbrennungARA erzo AfU AargauAbwasserverband + 20170213 + +ch113jqg000000000305CHE-274.715.392 HOLINGER AGAfU Aargauandere + 20170213Sitz Hünenberg + +ch113jqg000000000306CHE-116.070.018 Abwasserverband SchmittenbachAfU AargauAbwasserverband + 20170220 + +ch113jqg000000000307CHE-100.608.343 Regionaler Wasser- und Abwasserbetrieb Schenkenbergertal REWASREWAS AfU AargauAbwasserverband + 20170612 + +ch113jqg000000000308CHE-116.071.727 Abwasserverband Kelleramt, KläranlageAfU AargauAbwasserverband + 20170628 + +ch113jqg000000000309CHE-108.922.984 Abwasserverband Region LenzburgAfU AargauAbwasserverband + 20170628 + +ch113jqg000000000311CHE-101.720.451 ARA Kaisten AGAfU AargauAbwasserverband + 20170821 + +ch113jqg000000000312CHE-108.955.400 Abwasserverband Wohlen-Villmergen-WaltenschwilAfU AargauAbwasserverband + 20170824 + +ch113jqg000000000313CHE-109.361.060 EW Rothrist AGAfU Aargauandere + 20170928 + +ch113jqg000000000314CHE-115.854.715 Abwasserverband Region StettenAfU AargauAbwasserverband + 20170928 + +ch113jqg000000000315CHE-102.501.414 Avia Tanklager Beteiligungs AG, MellingenAfU AargauPrivat + 20170929 + +ch113jqg000000000316CHE-116.014.184 Abwasserverband SisslebachAfU AargauAbwasserverband + 20171005 + +ch113jqg000000000317CHE-112.537.750 Herznach-UekenAfU AargauGemeinde + 20230131vormals Ueken, ab 1.1.23 Herznach-Ueken + +ch113jqg000000000318CHE-108.962.021 Abwasserverband Stein-Münchwilen AGAfU AargauAbwasserverband + 20171011 + +ch113jqg000000000319CHE-108.955.469 Abwasserverband Aarau und UmgebungAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000320CHE-116.070.254 Abwasserverband Reitnau - Attelwil - MoosleerauAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000321CHE-100.499.781 Abwasserverband Bremgarten-Mutschellen Stadt BremgartenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000322CHE-102.267.951 DSM Nutritional Products AGAfU AargauAbwasserverband + 20171030Betreib. Ara Sisseln + +ch113jqg000000000323CHE-100.052.687 ARA Verband Gontenschwil-Zetzwil, Kläranlage Gontenschwil / ZetzwilAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000324CHE-108.923.009 Abwasserverband Killwangen-Spreitenbach-Würenlos AbwasserreinigungsanlageAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000325CHE-422.685.980 Gemeinde Leibstadt, Regionale KläranlageAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000326CHE-108.956.227 ARA Klingnau-Döttingen-TegerfeldenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000327CHE-116.070.521 ARA Region KöllikenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000328CHE-100.492.804 Gemeinde Rupperswil, Abt. AbwasserverbandAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000329CHE-116.072.069 Abwasserverband Oberes SurbtalAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000330CHE-108.957.072 Gemeindeverband Zurzach, AbwasserverbandAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000331CHE-113.521.243 Stadt Rheinfelden, Abwasserverband Rheinfelden-MagdenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000332CHE-116.300.827 Abwasserverband Region SchöftlandAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000333CHE-101.719.293 Kernkraftwerk Leibstadt AGAfU AargauPrivat + 20171030für_AraKKW_Leibstadt + +ch113jqg000000000334CHE-108.962.995 Abwasserverband Untersiggenthal-TurgiAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000335CHE-105.781.196 Axpo Power AGAfU AargauPrivat + 20171030u.a. für Ara Beznau + +ch113jqg000000000336CHE-424.096.352 eniwa AGAfU Aargauandere + 20171106Nachfolge IB Aarau + +ch113jqg000000000337CHE-115.076.478 Gemeinde BözbergAfU AargauGemeinde + 20180118 + +ch113jqg000000000338CHE-115.420.469 Einwohnergemeinde Zeihen, WasserversorgungAfU AargauGemeinde + 20180118 + +ch113jqg000000000339CHE-200.611.021 Verwaltung 3Plus, Einwohnergemeinden Bözen, Elfingen und HornussenAfU Aargauandere + 20180118 + +ch113jqg000000000340CHE-000.000.000 Drainagengenossenschaft MeisterschwandenAfU AargauGenossenschaft_Korporation + 20230428Nicht im UID Register + +ch113jqg000000000341CHE-475.408.686 Zbinden GEO AGAfU Aargauandere + 20180928Nachfolge Belat und Partner + +ch113jqg000000000342CHE-116.300.649 Abwasserverband Fischbach-Göslikon / NiederwilAfU AargauAbwasserverband + 20181128 + +ch113jqg000000000343CHE-108.221.858 Recyclingcenter Freiamt AGAfU AargauPrivat + 20181128 + +ch113jqg000000000344CHE-283.848.968 BG Ingenieure und Berater AGAfU Aargauandere + 20190307Zweigniederlassung Baar + +ch113jqg000000000345CHE-108.963.196 Abwasserverband Mettauertal, Abwasserentsorgung, RechnungAVM AfU AargauAbwasserverband + 20190520 + +ch113jqg000000000346CHE-105.951.162 Basler & Hofmann AG Ingenieure Planer und BeraterAfU Aargauandere + 20200120BaslerHofmann + +ch113jqg000000000347CHE-112.111.606 BSB + Partner Ingenieure und Planer AGAfU Aargauandere + 20200303 + +ch113jqg000000000348CHE-116.398.921 PDAG-Fonds-VereinAfU AargauPrivat + 20200702Areal Königsfelden + +ch113jqg000000001626CHE-359.632.210 geoPro Suisse AGAfU AargauPrivat + 20220314 + +ch113jqg000000001659CHE-000.000.000 Privates MiteigentumAfU AargauPrivat + 20220523Für mehrere angeschlossene Liegenschaften + +ch113jqg000000001660CHE-482.735.682 Einwohnergemeinde Böztal, AbwasserbeseitigungAfU AargauGemeinde + 20220523Aus Fusion entstanden + +ch113jqg000000001416CHE-105.986.870 Baerlocher Partner AGAfU AargauPrivat + 20220720von VSA übernommen + +ch113jqg000000001725CHE-000.000.000 Abwasserverband LottenAfU AargauAbwasserverband + 20221102von VSA übernommen + +ch113jqg000000001757CHE-000.000.000 Herznach-UekenAfU AargauGemeinde + 20230131von VSA übernommen + +ch113jqg000000001927CHE-000.000.000 Entwässerungs- und Unterhaltsgenossenschaft Aabachgebiet Hallwil - SeonAfU AargauGenossenschaft_Korporation + 20230524von VSA übernommen + + + + diff --git a/plugin/teksi_wastewater/interlis/data/Organisationstabelle_AG96.xtf b/plugin/teksi_wastewater/interlis/data/Organisationstabelle_AG96.xtf new file mode 100644 index 000000000..2e0d51c0a --- /dev/null +++ b/plugin/teksi_wastewater/interlis/data/Organisationstabelle_AG96.xtf @@ -0,0 +1,1069 @@ + + + + + + + + + + dataset generated by AfU AG, last update 20230524 please send amendements and additions to andreas.gloor@ag.ch, data repository: https://www.ag.ch/umwelt + + + +ch113jqg000000000001CHE-100.127.635 Kanton Aargau, Dep. Bau, Verkehr & Umwelt (BVU), VerkehrsinfrastrukturAfU AargauKanton + 20110901 + +ch113jqg000000000002CHE-102.480.752 Acht Grad Ost AGAfU Aargauandere + 20160921Neue Bezeichnung + +ch113jqg000000000003CHE-102.441.189 Emch + Berger AG ZofingenAfU Aargauandere + 20110901 + +ch113jqg000000000004CHE-112.557.422 Gemeinde Hendschiken, AbwasserbeseitigungHendschiken AfU AargauGemeinde + 20110901 + +ch113jqg000000000005CHE-101.238.591 IBAarau AGAfU Aargauandere + 20110901 + +ch113jqg000000000006CHE-109.261.501 IBB Strom AGAfU Aargauandere + 20110901nicht IBB Energie AG + +ch113jqg000000000007CHE-109.388.952 IBW Technik AGAfU Aargauandere + 20110901 + +ch113jqg000000000008CHE-107.083.950 Berger Wenger Plattner AG AarauAfU Aargauandere + 20110901 + +ch113jqg000000000009CHE-115.635.395 Ingenieurbüro Senn AGAfU Aargauandere + 20110901 + +ch113jqg000000000010CHE-113.887.158 Steinmann Kreisgeometer BadenAfU Aargauandere + 20110901Buero Steinmann + +ch113jqg000000000011CHE-105.772.518 Ingenieurbüro K. Lienhard AG BuchsAfU Aargauandere + 20110901 + +ch113jqg000000000012CHE-105.781.670 KIP Knoblauch Ingenieur und PartnerAfU Aargauandere + 20110901 + +ch113jqg000000000013CHE-105.949.107 Koch + Partner, Ingenieure, Geometer, PlanerAfU Aargauandere + 20110901Laufenburg + +ch113jqg000000000014CHE-105.943.441 KSL Ingenieure AGAfU Aargauandere + 20210616Neue Bezeichnung + +ch113jqg000000000015CHE-107.974.079 Bodmer Bauingenieure AGAfU Aargauandere + 20110901 + +ch113jqg000000000016CHE-108.644.549 Porta AG Ingenieure Planer GeometerAfU Aargauandere + 20161129Neue Bezeichnung + +ch113jqg000000000017CHE-106.843.428 Regionalwerke AG BadenRWB AfU Aargauandere + 20110901 + +ch113jqg000000000018CHE-115.376.213 Rusterholz Partner AG, Ingenieure und PlanerAfU Aargauandere + 20130729Neue Bezeichnung + +ch113jqg000000000019CHE-105.942.915 Scheidegger & Partner, Ingenieure & PlanerAfU Aargauandere + 20110901 + +ch113jqg000000000020CHE-203.025.931 TBS Strom AGAfU Aargauandere + 20110901 + +ch113jqg000000000021CHE-226.148.390 suisseplan Ingenieure AG Aarau, Zweigniederlassung SchöftlandAfU Aargauandere + 20110901 + +ch113jqg000000000022CHE-308.298.885 suisseplan Ingenieure AG Aarau, Zweigniederlassung HägglingenAfU Aargauandere + 20110901 + +ch113jqg000000000023CHE-105.935.016 Ingenieurbüro Kost + Partner AGAfU Aargauandere + 20110901 + +ch113jqg000000000024CHE-114.279.702 Ballmer + Partner AGAfU Aargauandere + 20110901 + +ch113jqg000000000025CHE-100.060.646 Gemeinde Wohlen AG, AbwasserbeseitigungWohlen AfU AargauGemeinde + 20110901 + +ch113jqg000000000026CHE-114.871.556 Kantonales VermessungsamtAfU AargauKanton + 20110901 + +ch113jqg000000000027CHE-116.276.169 Kanton Aargau, Departement Finanzen & RessourcenAfU AargauKanton + 20110901 + +ch113jqg000000000028CHE-108.631.943 Balz & Partner AGAfU Aargauandere + 20110901 + +ch113jqg000000000029CHE-107.075.169 Ackermann + Wernli AGAfU Aargauandere + 20110901 + +ch113jqg000000000030CHE-108.669.360 Bélat + PartnerAfU Aargauandere + 20130404 + +ch113jqg000000000031CHE-397.421.795 CES Bauingenieur AGAfU Aargauandere + 20130404 + +ch113jqg000000000032CHE-100.647.099 Einwohnergemeinde Birr, AbwasserbeseitigungBirr AfU AargauGemeinde + 20130404 + +ch113jqg000000000033CHE-112.543.408 Einwohnergemeinde Tägerig, AbwasserbeseitigungTägerig AfU AargauGemeinde + 20130404 + +ch113jqg000000000034CHE-105.627.454 Einwohnergemeinde Zufikon, AbwasserbeseitigungZufikon AfU AargauGemeinde + 20130404 + +ch113jqg000000000035CHE-105.900.130 Fischer + Schild AG, Ingenieurbüro für Hoch- und TiefbauAfU Aargauandere + 20130404 + +ch113jqg000000000036CHE-446.755.393 Flury Planer + Ingenieure AGAfU Aargauandere + 20130404Lenzburg + +ch113jqg000000000037CHE-391.794.111 Flury Planer + Ingenieure AGAfU Aargauandere + 20130404Seon + +ch113jqg000000000038CHE-115.078.951 Gemeinde BruneggBrunegg AfU AargauGemeinde + 20130404 + +ch113jqg000000000039CHE-114.801.751 Gemeinde Frick, AbwasserbeseitigungFrick AfU AargauGemeinde + 20130404 + +ch113jqg000000000040CHE-112.609.935 Gemeinde Meisterschwanden, AbwasserbeseitigungMeisterschw. AfU AargauGemeinde + 20130404 + +ch113jqg000000000041CHE-112.571.244 Gemeinde Menziken, AbwasserentsorgungMenziken AfU AargauGemeinde + 20130404 + +ch113jqg000000000042CHE-105.616.315 Gemeinde Oftringen, AbwasserbeseitigungOftringen AfU AargauGemeinde + 20130404 + +ch113jqg000000000043CHE-105.603.301 Gemeinde Reinach, AbwasserbeseitigungReinach AfU AargauGemeinde + 20130404 + +ch113jqg000000000044CHE-112.602.287 Gemeinde Safenwil, AbwasserbeseitigungSafenwil AfU AargauGemeinde + 20130404 + +ch113jqg000000000045CHE-115.075.378 Gemeinde SpreitenbachSpreitenbach AfU AargauGemeinde + 20130404 + +ch113jqg000000000046CHE-112.607.244 Gemeinde Strengelbach, AbwasserentsorgungStrengelbach AfU AargauGemeinde + 20130404 + +ch113jqg000000000047CHE-112.614.238 Gemeinde Teufenthal, AbwasserbeseitigungTeufenthal AfU AargauGemeinde + 20130404 + +ch113jqg000000000048CHE-112.564.474 Gemeinde Villmergen, AbwasserbeseitigungVillmergen AfU AargauGemeinde + 20130404 + +ch113jqg000000000050CHE-112.793.690 Gemeinde Widen, AbwasserentsorgungWiden AfU AargauGemeinde + 20130404 + +ch113jqg000000000051CHE-335.814.571 Gruner Ingenieure AGAfU Aargauandere + 20130404 + +ch113jqg000000000052CHE-106.829.061 Gwerder + Partner AGAfU Aargauandere + 20130404 + +ch113jqg000000000053CHE-105.954.611 Hunziker Betatech AGAfU Aargauandere + 20130404Hauptsitz Winterthur + +ch113jqg000000000054CHE-102.265.515 Ingenieurbureau Schifferli AG, KlingnauAfU Aargauandere + 20130404 + +ch113jqg000000000055CHE-202.146.495 Ingenieurbüro Hans Eichenberger AGAfU Aargauandere + 20130404 + +ch113jqg000000000056CHE-107.437.930 Ingenieurbüro Kaufmann und Partner AGAfU Aargauandere + 20130404 + +ch113jqg000000000057CHE-102.146.394 Ingenieurbüro P. Zumbach SIA/USIC AGAfU Aargauandere + 20130404 + +ch113jqg000000000058CHE-108.026.877 Ingenieurbüro Stauffer AGAfU Aargauandere + 20130404 + +ch113jqg000000000059CHE-468.757.561 Koch + Partner, Ingenieure, Geometer, PlanerAfU Aargauandere + 20130405 + +ch113jqg000000000060CHE-110.584.690 Minikus Vogt & Partner AGAfU Aargauandere + 20130406 + +ch113jqg000000000061CHE-107.982.452 MSL Ingenieurbüro AGAfU Aargauandere + 20130407 + +ch113jqg000000000063CHE-107.712.792 Portmann und PartnerAfU Aargauandere + 20130409 + +ch113jqg000000000064CHE-108.529.256 Relis AGAfU Aargauandere + 20130410 + +ch113jqg000000000065CHE-112.540.491 Stadt Bremgarten, AbwasserbeseitigungBremgarten AfU AargauGemeinde + 20130411 + +ch113jqg000000000066CHE-113.521.220 Stadt Rheinfelden Finanzverwaltung AbwasserbeseitigungRheinfelden AfU AargauGemeinde + 20130412 + +ch113jqg000000000067CHE-420.861.823 suisseplan Ingenieure AG Aarau Zweigniederlassung Wohlensuisseplan AfU Aargauandere + 20130413 + +ch113jqg000000000068CHE-109.698.660 SWL Energie AGAfU Aargauandere + 20130414 + +ch113jqg000000000069CHE-110.541.686 Von Arx + Partner AGAfU Aargauandere + 20130415 + +ch113jqg000000000070CHE-405.950.690 Waldburger Ingenieure AGAfU Aargauandere + 20130416Hottwil + +ch113jqg000000000071CHE-105.945.635 Waldburger Ingenieure AGAfU Aargauandere + 20130417Aarau + +ch113jqg000000000072CHE-112.563.523 Einwohnergemeinde SchmiedruedSchmiedrued AfU AargauGemeinde + 20130516 + +ch113jqg000000000073CHE-112.609.303 Einwohnergemeinde Schlossrued, AbwasserbeseitigungSchlossrued AfU AargauGemeinde + 20130516 + +ch113jqg000000000074CHE-100.498.965 Gemeinde Schöftland, Abt. AbwasserbeseitigungSchöftland AfU AargauGemeinde + 20130516 + +ch113jqg000000000075CHE-112.797.771 Gemeinde Staffelbach, AbwasserStaffelbach AfU AargauGemeinde + 20130516 + +ch113jqg000000000076CHE-105.629.619 Stadt Zofingen, AbwasserbeseitigungZofingen AfU AargauGemeinde + 20130729 + +ch113jqg000000000077CHE-113.563.916 Einwohnergemeinde Rothrist, AbwasserbeseitigungRothrist AfU AargauGemeinde + 20130729 + +ch113jqg000000000078CHE-112.538.181 Einwohnergemeinde Buchs AG, AbwasserentsorgungBuchs AfU AargauGemeinde + 20130729 + +ch113jqg000000000079CHE-100.620.344 Gemeinde Suhr, AbwasserbeseitigungSuhr AfU AargauGemeinde + 20130729 + +ch113jqg000000000080CHE-472.773.215 Flury Planer + Ingenieure AGAfU Aargauandere + 20130729Reinach (AG) + +ch113jqg000000000081CHE-498.021.909 Steinmann Ingenieure und Planer AGAfU Aargauandere + 20130729Brugg + +ch113jqg000000000082CHE-115.076.515 Einwohnergemeinde VilligenVilligen AfU AargauGemeinde + 20130729 + +ch113jqg000000000084CHE-116.137.409 Reto Porta Nachführungsgeometer Kreis ZurzachAfU Aargauandere + 20130729 + +ch113jqg000000000085CHE-112.565.226 Einwohnergemeinde Gebenstorf, AbwasserbeseitigungGebensdorf AfU AargauGemeinde + 20170410 + +ch113jqg000000000086CHE-112.797.759 Einwohnergemeinde Seon, Technische Betriebe Seon, FernwärmeversorgungSeon AfU AargauGemeinde + 20130729 + +ch113jqg000000000087CHE-105.595.481 Einwohnergemeinde Gränichen, AbwasserbeseitigungAfU AargauGemeinde + 20170410 + +ch113jqg000000000088CHE-287.320.502 CSD Ingenieure AGCSD AfU Aargauandere + 21050130Filiale Aarau + +ch113jqg000000000089CHE-109.278.967 IBB Wasser AGIBB AfU Aargauandere + 20150213 + +ch113jqg000000000090CHE-113.544.540 Abwasserverband Sammelkanal BirrfeldSAKA_Bru-Bir AfU AargauAbwasserverband + 20150213 + +ch113jqg000000000091CHE-113.544.497 Abwasserverband Kläranlage Brugg-Birrfeld, Geschäftsstelle IBB Wasser AGARA Bru-Birr AfU AargauAbwasserverband + 20150213 + +ch113jqg000000000092CHE-112.538.028 Einwohnergemeinde Windisch, AbwasserbeseitigungWindisch AfU AargauGemeinde + 20150213 + +ch113jqg000000000093CHE-114.799.657 Einwohnergemeinde_Brugg,_AbwasserbeseitigungBrugg AfU AargauGemeinde + 20150213 + +ch113jqg000000000094CHE-000.000.000 PrivatAfU AargauPrivat + 20150213 + +ch113jqg000000000095CHE-112.544.402 Gemeinde Auenstein, AbwasserbeseitigungAuenstein AfU AargauGemeinde + 20150501 + +ch113jqg000000000096CHE-105.833.605 Dr. Heinrich Jäckli AGAfU Aargauandere + 20150821Zürich + +ch113jqg000000000097CHE-105.870.641 Trigonet AGAfU Aargauandere + 20150821Stans + +ch113jqg000000000098CHE-105.946.818 Wälli IngenieureAfU Aargauandere + 20150821Arbon + +ch113jqg000000000099CHE-238.251.882 IBB Energie AGAfU Aargauandere + 20150828ungleich IBB Strom AG + +ch113jqg000000000100CHE-114.063.378 NSNW AGAfU Aargauandere + 20150828Unterhalt_AutobahnAG + +ch113jqg000000000101CHE-102.909.703 Schweizerische BundesbahnenSBB AfU AargauBund + 20150828 + +ch113jqg000000000102CHE-112.568.489 Gemeinde Oberentfelden, AbwasserbeseitigungOberentfeld. AfU AargauGemeinde + 20150828 + +ch113jqg000000000103CHE-115.075.415 Gemeinde UntersiggenthalU.siggenthal AfU AargauGemeinde + 20150828 + +ch113jqg000000000104CHE-115.250.339 Gemeinde Aristau, AbwasserbeseitigungAristau AfU AargauGemeinde + 20150828 + +ch113jqg000000000105CHE-113.537.215 Einwohnergemeinde Böttstein, AbwasserbeseitigungBöttstein AfU AargauGemeinde + 20150828auch Ara + +ch113jqg000000000106CHE-424.195.422 armasuisseAfU AargauBund + 20150904Standort Bern + +ch113jqg000000000107CHE-000.000.000 unbekanntAfU Aargauandere + 20150904 + +ch113jqg000000000108CHE-304.459.014 Bundesamt für Strassen (Astra)Astra AfU AargauBund + 20151014 + +ch113jqg000000000109CHE-112.592.921 Einwohnergemeinde Unterentfelden, AbwasserbeseitigungU.entfelden AfU AargauGemeinde + 20151014 + +ch113jqg000000000110CHE-108.955.736 Abwasserverband Region Baden WettingenAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000111CHE-105.063.586 Stadt Baden, DS 711 AbwasserbeseitigungBaden AfU AargauGemeinde + 20160205 + +ch113jqg000000000112CHE-112.546.298 Gemeinde Bellikon, AbwasserbeseitigungBellikon AfU AargauGemeinde + 20160205 + +ch113jqg000000000113CHE-100.051.860 Einwohnergemeinde Birmenstorf AG, AbwasserentsorgungBirmenstorf AfU AargauGemeinde + 20160205 + +ch113jqg000000000114CHE-112.571.540 Kläranlage Birrhard, AbwasserreinigungsanlageBirrhard AfU AargauGemeinde + 20160205 + +ch113jqg000000000115CHE-115.257.896 Abwasser Oberbözberg, Gemeinde BözbergBözberg AfU AargauGemeinde + 20160205 + +ch113jqg000000000116CHE-112.956.331 Gemeinde Döttingen, AbwasserbeseitigungDöttingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000117BöztalAfU AargauGemeinde + 20220523Vormals Effingen, ab 1.1.22 Böztal + +ch113jqg000000000118CHE-114.801.449 Gemeinde Ehrendingen, AbwasserentsorgungEhrendingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000119CHE-114.950.925 Einwohnergemeinde Endingen, AbwasserEndingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000120CHE-112.535.136 Einwohnergemeinde Ennetbaden, Abwasserentsorgung/BauverwaltungEnnetbaden AfU AargauGemeinde + 20160205 + +ch113jqg000000000121CHE-109.369.334 Einwohnergemeinde Fislisbach, Abwasser / AnschlussgebührenFislisbach AfU AargauGemeinde + 20160205 + +ch113jqg000000000122CHE-105.622.681 Gemeinde Freienwil, AbwasserbeseitigungFreienwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000123CHE-479.570.920 Einwohnergemeinde Habsburg, AbwasserbeseitigungHabsburg AfU AargauGemeinde + 20160205 + +ch113jqg000000000124CHE-112.587.392 Gemeinde Hausen bei Brugg, AbwasserbeseitigungHausen AfU AargauGemeinde + 20160205 + +ch113jqg000000000125CHE-115.095.889 Gemeinde Holderbank, AbwasserHolderbank AfU AargauGemeinde + 20160205 + +ch113jqg000000000126CHE-115.253.846 Gemeinde Killwangen, AbwasserbeseitigungKillwangen AfU AargauGemeinde + 20160205 + +ch113jqg000000000127CHE-113.544.758 Finanzverw. der Gemeinde Künten, AbwasserbeseitigungKünten AfU AargauGemeinde + 20160205 + +ch113jqg000000000128CHE-112.799.445 Einwohnergemeinde Lengnau, AbwasserbeseitigungLengnau AfU AargauGemeinde + 20160205 + +ch113jqg000000000129CHE-112.795.370 Einwohnergemeinde Lupfig, AbwasserbeseitigungLupfig AfU AargauGemeinde + 20160205 + +ch113jqg000000000130CHE-112.410.233 Einwohnergemeinde Mägenwil, AbwasserbeseitigungMägenwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000131CHE-112.798.428 Gemeinde Mellingen, AbwasserbeseitigungMellingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000132CHE-482.154.628 Einwohnergemeinde Mönthal, AbwasserbeseitigungMönthal AfU AargauGemeinde + 20160205 + +ch113jqg000000000133CHE-112.609.881 Gemeinde Möriken-Wildegg, AbwasserentsorgungMöriken AfU AargauGemeinde + 20160205 + +ch113jqg000000000134CHE-112.570.747 Gemeinde Mülligen, Kläranlage/AbwasserbeseitigungMülligen AfU AargauGemeinde + 20160205 + +ch113jqg000000000135CHE-112.568.911 Gemeinde Neuenhof, AbwasserbeseitigungNeuenhof AfU AargauGemeinde + 20160205 + +ch113jqg000000000136CHE-112.609.415 Gemeinde Niederrohrdorf, AbwasserbeseitigungN.rohrdorf AfU AargauGemeinde + 20160205 + +ch113jqg000000000137CHE-112.793.046 Gemeinde Oberrohrdorf, AbwasserbeseitigungO.rohrdorf AfU AargauGemeinde + 20160205 + +ch113jqg000000000138CHE-114.791.880 Einwohnergemeinde Obersiggenthal, AbwasserbeseitigungO.siggenthal AfU AargauGemeinde + 20160205 + +ch113jqg000000000139CHE-112.543.199 Einwohnergemeinde Remetschwil, AbwasserbeseitigungRemetschwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000140CHE-105.620.179 Einwohnergemeinde Remigen, AbwasserentsorgungRemigen AfU AargauGemeinde + 20160205 + +ch113jqg000000000141CHE-115.257.726 Einwohnergemeinde Riniken, AbwasserbeseitigungRiniken AfU AargauGemeinde + 20160205 + +ch113jqg000000000142CHE-112.790.208 Gemeinde Rüfenach, Kläranlage/AbwasserbeseitigungRüfenach AfU AargauGemeinde + 20160205 + +ch113jqg000000000143LupfigAfU AargauGemeinde + 20220523Vormals Scherz, per 1.1.18 Lupfig + +ch113jqg000000000144CHE-100.057.064 Gemeinde Schinznach, AbwasserbeseitigungSchinznach AfU AargauGemeinde + 20160205 + +ch113jqg000000000145BruggAfU AargauGemeinde + 20160205Vormals Schinznach-Bad, per 1.1.20 Brugg + +ch113jqg000000000146CHE-108.957.942 Einwohnergemeinde Schneisingen, AbwasserbeseitigungSchneisingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000147CHE-112.793.402 Einwohnergemeinde Stetten AG, AbwasserbeseitigungStetten AfU AargauGemeinde + 20160205 + +ch113jqg000000000148CHE-108.960.660 Abwasserverband Stetten-Remetschwil-NiederwilAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000149CHE-112.579.056 Gemeinde Tegerfelden, Kläranlage/AbwasserbeseitigungTegerfelden AfU AargauGemeinde + 20160205 + +ch113jqg000000000150CHE-112.571.310 Gemeinde Thalheim, AbwasserbeseitigungThalheim AfU AargauGemeinde + 20160205 + +ch113jqg000000000151CHE-112.901.241 Gemeinde Turgi, AbwasserbeseitigungTurgi AfU AargauGemeinde + 20160205 + +ch113jqg000000000152CHE-112.539.111 Einwohnergemeinde Veltheim AG, AbwasserbeseitigungVeltheim AfU AargauGemeinde + 20160205 + +ch113jqg000000000153CHE-112.571.764 Gemeinde Villnachern, AbwasserbeseitigungVillnachern AfU AargauGemeinde + 20160205auch Ara + +ch113jqg000000000154CHE-115.075.438 Gemeinde WettingenWettingen AfU AargauGemeinde + 20160205 + +ch113jqg000000000155CHE-112.546.625 Einwohnergemeinde Wohlenschwil, AbwasserbeseitigungWohlenschwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000156CHE-113.563.106 Einwohnergemeinde Würenlingen, AbwasserbeseitigungWürenlingen AfU AargauGemeinde + 20160205auch Ara + +ch113jqg000000000157CHE-112.587.653 Gemeinde Würenlos, AbwasserbeseitigungWürenlos AfU AargauGemeinde + 20160205 + +ch113jqg000000000158CHE-116.071.940 Abwasserverband OberwynentalAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000159CHE-114.838.228 Einwohnergemeinde Oeschgen, AbwasserentsorgungOeschgen AfU AargauGemeinde + 20160205 + +ch113jqg000000000160CHE-112.988.727 Gemeinde Oberlunkhofen, AbwasserO.lunkhofen AfU AargauGemeinde + 20160205 + +ch113jqg000000000161CHE-116.068.777 Abwasserverband Region MöhlinAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000162CHE-105.576.733 Abwasserverband Reuss-SchachenAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000163CHE-116.072.017 Abwasserverband Region MellingenAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000164CHE-451.264.758 Abwasserverband Gallenkirch-LinnAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000165CHE-114.344.127 Einwohnergemeinde Leuggern, AbwasserentsorgungLeuggern AfU AargauGemeinde + 20160205auch Ara + +ch113jqg000000000166CHE-112.809.374 Abwasserverband SurbtalAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000167CHE-109.474.669 Abwasserverband SchinbergAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000168CHE-116.016.941 Abwasserverband BeehzAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000169CHE-116.332.721 Abwasserverband "Rehmatte"AfU AargauAbwasserverband + 20160205 + +ch113jqg000000000170CHE-112.554.429 Gemeinde Fahrwangen, AbwasserentsorgungFahrwangen AfU AargauGemeinde + 20160205 + +ch113jqg000000000171CHE-112.535.047 Gemeinde Eggenwil, AbwasserentsorgungEggenwil AfU AargauGemeinde + 20160205 + +ch113jqg000000000172CHE-105.599.421 Abwasserverband Falkenmatt/ SekretariatAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000173CHE-116.074.217 Abwasserverband ChlostermatteAfU AargauAbwasserverband + 20160205 + +ch113jqg000000000174CHE-112.540.924 Gemeinde Wettingen, Abwasserbeseitigung, RathausWettingen AfU AargauGemeinde + 20160215 + +ch113jqg000000000175CHE-100.434.008 Einwohnergemeinde Seengen, AbwasserbeseitigungSeengen AfU AargauGemeinde + 20160229 + +ch113jqg000000000176CHE-100.492.804 Gemeinde Rupperswil, Abt. AbwasserverbandRupperswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000177BöztalAfU AargauGemeinde + 20220523Vormals Hornussen, ab 1.1.22 Böztal + +ch113jqg000000000178CHE-100.774.065 Gemeinde Ammerswil, KanalisationAmmerswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000179CHE-105.332.591 Einwohnergemeinde Unterlunkhofen, AbwasserbeseitigungU.lunkhofen AfU AargauGemeinde + 20160229 + +ch113jqg000000000180CHE-105.593.306 Einwohnergemeinde Bünzen, AbwasserbeseitigungBünzen AfU AargauGemeinde + 20160229 + +ch113jqg000000000181CHE-105.598.953 Gemeinde Aarburg, AbwasserbeseitigungAarburg AfU AargauGemeinde + 20160229 + +ch113jqg000000000182CHE-105.601.236 Gemeinde Murgenthal, AbwasserentsorgungMurgenthal AfU AargauGemeinde + 20160229 + +ch113jqg000000000183CHE-105.605.079 Einwohnergemeinde Oberkulm, AbwasserbeseitigungOberkulm AfU AargauGemeinde + 20160229 + +ch113jqg000000000184CHE-105.607.233 Einwohnergemeinde Muhen, AbwasserbeseitigungMuhen AfU AargauGemeinde + 20160229 + +ch113jqg000000000185CHE-105.614.440 Gemeinde Obermumpf, AbwasserbeseitigungObermumpf AfU AargauGemeinde + 20160229 + +ch113jqg000000000186CHE-105.616.249 Einwohnergemeinde Dürrenäsch, AbwasserentsorgungDürrenäsch AfU AargauGemeinde + 20160229 + +ch113jqg000000000187CHE-106.254.999 Einwohnergemeinde Zeihen, AbwasserbeseitigungZeihen AfU AargauGemeinde + 20160229 + +ch113jqg000000000188CHE-108.958.663 Gemeinde Islisberg, AbwasserbeseitigungIslisberg AfU AargauGemeinde + 20160229 + +ch113jqg000000000189CHE-108.959.898 Abwasserverband Sins-Auw-Mühlau-Abtwil, VerwaltungAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000190CHE-108.960.476 Gemeinde Oberrüti, AbwasserbeseitigungOberrüti AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000191CHE-108.965.108 Einwohnergemeinde Gansingen, AbwasserbeseitigungGansingen AfU AargauGemeinde + 20160229 + +ch113jqg000000000192CHE-108.965.315 Gemeinde Leibstadt, AbwasserbeseitigungLeibstadt AfU AargauGemeinde + 20160229 + +ch113jqg000000000193CHE-108.965.396 Einwohnergemeinde Siglistorf, AbwasserbeseitigungSiglistorf AfU AargauGemeinde + 20160229 + +ch113jqg000000000194CHE-112.410.121 Gemeinde Kirchleerau, AbwasserbeseitigungKirchleerau AfU AargauGemeinde + 20160229 + +ch113jqg000000000195CHE-112.410.144 Einwohnergemeinde Dietwil, AbwasserbeseitigungDietwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000196CHE-112.410.196 Gemeinde Othmarsingen, AbwasserreinigungOthmarsingen AfU AargauGemeinde + 20160229 + +ch113jqg000000000197CHE-112.410.291 Einwohnergemeinde Boniswil, AbwasserbeseitigungBoniswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000198CHE-112.410.598 Einwohnergemeinde Hallwil, AbwasserbeseitigungHallwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000199CHE-112.534.993 Gemeinde Bottenwil, AbwasserbeseitigungBottenwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000200CHE-112.537.170 Einwohnergemeinde Sisseln, AbwasserSisseln AfU AargauGemeinde + 20160229 + +ch113jqg000000000201CHE-112.537.307 Einwohnergemeinde Merenschwand, AbwasserseitigungMerenschwand AfU AargauGemeinde + 20160229 + +ch113jqg000000000202CHE-112.538.353 Einwohnergemeinde Brittnau, AbwasserbeseitigungBrittnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000203CHE-112.557.008 Einwohnergemeinde Niederlenz AbwasserentsorgungNiederlenz AfU AargauGemeinde + 20160229 + +ch113jqg000000000204CHE-112.558.002 Gemeinde Fischbach-Göslikon, AbwasserentsorgungFischbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000205CHE-112.558.344 Gemeinde Staufen, AbwasserbeseitigungStaufen AfU AargauGemeinde + 20160229 + +ch113jqg000000000206CHE-112.558.396 Einwohnergemeinde Buttwil, AbwasserbeseitigungButtwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000207CHE-112.558.456 Einwohnergemeinde Schafisheim, AbwasserbeseitigungSchafisheim AfU AargauGemeinde + 20160229 + +ch113jqg000000000208CHE-112.563.138 Einwohnergemeinde Eiken, ARA Eiken, Kläranlage / AbwasserEiken AfU AargauGemeinde + 20160229 + +ch113jqg000000000209CHE-112.564.221 Gemeinde Hirschthal, AbwasserbeseitigungHirschthal AfU AargauGemeinde + 20160229 + +ch113jqg000000000210CHE-112.564.273 Einwohnergemeinde Biberstein, AbwasserentsorgungBiberstein AfU AargauGemeinde + 20160229 + +ch113jqg000000000211CHE-112.565.025 Gemeinde Egliswil, AbwasserbeseitigungEgliswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000212CHE-112.568.905 Einwohnergemeinde Rottenschwil, AbwasserbeseitigungRottenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000213CHE-112.569.023 Einwohnergemeinde Sarmenstorf, AbwasserreinigungSarmenstorf AfU AargauGemeinde + 20160229 + +ch113jqg000000000214CHE-112.570.285 Gemeinde Oberwil-Lieli, AbwasserbeseitigungO.wil-Lieli AfU AargauGemeinde + 20160229 + +ch113jqg000000000215CHE-112.570.552 Einwohnergemeinde Waltenschwil, AbwasserbeseitigungWaltenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000216CHE-112.571.020 Einwohnergemeinde Kaiseraugst, AbwasserentsorgungKaiseraugst AfU AargauGemeinde + 20160229 + +ch113jqg000000000217CHE-112.571.480 Gemeinde Holziken, AbwasserbeseitigungHolziken AfU AargauGemeinde + 20160229 + +ch113jqg000000000218CHE-112.573.898 Gemeinde Zetzwil, AbwasserbeseitigungZetzwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000219CHE-112.573.912 Gemeinde Mühlau, Kläranlage/AbwasserbeseitigungMühlau AfU AargauGemeinde + 20160229 + +ch113jqg000000000220ZurzachAfU AargauGemeinde + 20220523vormals Rietheim, ab 1.1.22 Zurzach + +ch113jqg000000000221CHE-112.589.072 Einwohnergemeinde Leutwil, AbwasserbeseitigungLeutwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000222CHE-112.590.247 Gemeinde Fisibach, AbwasserbeseitigungFisibach AfU AargauGemeinde + 20160229 + +ch113jqg000000000223CHE-112.591.100 Gemeinde Kallern, AbwasserbeseitigungKallern AfU AargauGemeinde + 20160229 + +ch113jqg000000000224CHE-112.593.004 Einwohnergemeinde Uerkheim, AbwasserbeseitigungUerkheim AfU AargauGemeinde + 20160229 + +ch113jqg000000000225BöztalBözen AfU AargauGemeinde + 20220523Vormals Bözen, ab 1.1.22 Böztal + +ch113jqg000000000226CHE-112.609.958 Gemeinde Beinwil am See, AbwasserversorgungBeinwilaS AfU AargauGemeinde + 20160229 + +ch113jqg000000000227CHE-112.609.987 Gemeinde Gipf-Oberfrick, AbwasserbeseitigungGipf-O.frick AfU AargauGemeinde + 20160229 + +ch113jqg000000000228CHE-112.614.155 Einwohnergemeinde Küttigen, AbwasserbeseitigungKüttigen AfU AargauGemeinde + 20160229 + +ch113jqg000000000229CHE-112.614.273 Einwohnergemeinde Koblenz, Kläranlage / AbwasserreinigungKoblenz AfU AargauGemeinde + 20160229 + +ch113jqg000000000230ZurzachAfU AargauGemeinde + 20220523Vormals Rekingen, ab 1.1.22 Zurzach + +ch113jqg000000000231CHE-112.638.865 Gemeinde Moosleerau, AbwasserbeseitigungMoosleerau AfU AargauGemeinde + 20160229 + +ch113jqg000000000232CHE-112.793.595 Gemeinde Vordemwald, AbwasserbeseitigungVordemwald AfU AargauGemeinde + 20160229 + +ch113jqg000000000233CHE-112.793.661 Einwohnergemeinde Wallbach, AbwasserbeseitigungWallbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000234CHE-112.793.945 Gemeinde Unterkulm, AbwasserbeseitigungUnterkulm AfU AargauGemeinde + 20160229 + +ch113jqg000000000235CHE-112.795.200 Einwohnergemeinde Boswil, AbwasserbeseitigungBoswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000236CHE-112.795.217 Gemeinde Magden, AbwasserbeseitigungMagden AfU AargauGemeinde + 20160229 + +ch113jqg000000000237CHE-112.795.789 Einwohnergemeinde Hägglingen, AbwasserbeseitigungHägglingen AfU AargauGemeinde + 20160229 + +ch113jqg000000000238CHE-112.795.832 Einwohnergemeinde Zeiningen, AbwasserbeseitigungZeiningen AfU AargauGemeinde + 20160229 + +ch113jqg000000000239CHE-112.795.973 Gemeinde Oberhof, Dienststelle AbwasserOberhof AfU AargauGemeinde + 20160229 + +ch113jqg000000000240CHE-112.797.860 Einwohnergemeinde Muenchwilen, AbwasserbeseitigungMünchwilen AfU AargauGemeinde + 20160229 + +ch113jqg000000000241CHE-112.798.523 Einwohnergemeinde Laufenburg, AbwasserbeseitigungLaufenburg AfU AargauGemeinde + 20160229 + +ch113jqg000000000242CHE-112.798.670 Gemeinde Jonen, AbwasserentsorgungJonen AfU AargauGemeinde + 20160229 + +ch113jqg000000000243CHE-112.798.902 Stadt Klingnau, AbwasserbeseitigungKlingnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000244CHE-112.799.103 Gemeinde Koelliken, AbwasserbeseitigungKölliken AfU AargauGemeinde + 20160229 + +ch113jqg000000000245CHE-112.799.391 Gemeinde Möhlin, AbwasserbeseitigungMöhlin AfU AargauGemeinde + 20160229 + +ch113jqg000000000246CHE-112.916.633 Gemeinde Leimbach, AbwasserLeimbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000247CHE-112.966.252 Gemeinde Büttikon, AbwasserbeseitigungBüttikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000248CHE-113.393.382 Stadt Lenzburg, AbwasserbeseitigungLenzburg AfU AargauGemeinde + 20160229 + +ch113jqg000000000249CHE-113.505.221 Einwohnergemeinde Dintikon, AbwasserbeseitigungDintikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000250CHE-113.534.688 Einwohnergemeinde Gontenschwil, AbwasserbeseitigungGontenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000251CHE-113.547.165 Gemeinde Kaisten, AbwasserbeseitigungKaisten AfU AargauGemeinde + 20160229 + +ch113jqg000000000252CHE-113.563.158 Gemeinde Wölflinswil Bauamt Dienststelle AbwasserWölflinswil AfU AargauGemeinde + 20160229 + +ch113jqg000000000253CHE-113.563.684 Gemeinde Olsberg, AbwasserOlsberg AfU AargauGemeinde + 20160229 + +ch113jqg000000000254CHE-113.729.714 Einwohnergemeinde Erlinsbach AG, AbwasserbeseitigungErlinsbach AfU AargauGemeinde + 20160229 + +ch113jqg000000000255MenzikenAfU AargauGemeinde + 20230130Vormals Burg, ab 1.1.23 Menziken + +ch113jqg000000000256CHE-114.801.283 Gemeinde Birrwil, AbwasserentsorgungBirrwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000257CHE-114.802.213 Gemeinde Rudolfstetten- Friedlisberg, AbwasserentsorgungRudolfstett. AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000258CHE-114.916.868 Gemeinde Berikon, AbwasserentsorgungBerikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000259CHE-114.927.240 Einwohnergemeinde Wegenstetten, AbwasserbeseitigungWegenstetten AfU AargauGemeinde + 20160229 + +ch113jqg000000000260CHE-115.067.769 Stadt AarauAarau AfU AargauGemeinde + 20160229 + +ch113jqg000000000261CHE-115.075.757 Gemeinde Niederwil AGNiederwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000262Herznach-UekenAfU AargauGemeinde + 20160229vormals Herznach, ab 1.1.23 Herznach-Ueken + +ch113jqg000000000263CHE-115.079.577 Gemeinde BesenbürenBesenbüren AfU AargauGemeinde + 20160229 + +ch113jqg000000000264CHE-115.080.161 Gemeinde GeltwilGeltwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000265CHE-115.080.267 Einwohnergemeinde SinsSins AfU AargauGemeinde + 20160229 + +ch113jqg000000000266CHE-115.080.451 Einwohnergemeinde Stein AGStein AfU AargauGemeinde + 20160229 + +ch113jqg000000000267CHE-115.080.505 Gemeinde ZuzgenZuzgen AfU AargauGemeinde + 20160229 + +ch113jqg000000000268ZurzachAfU AargauGemeinde + 20220523Vormals Kaiserstuhl, ab 1.1.22 Zurzach + +ch113jqg000000000269ZurzachAfU AargauGemeinde + 20220523Vormals Böbikon, ab 1.1.22 Zurzach + +ch113jqg000000000270CHE-108.957.072 Abwasserverband Region ZurzachZurzach AfU AargauGemeinde + 20220523Vormals Bad Zurzach, ab 1.1.22 Zurzach + +ch113jqg000000000271ReitnauAfU AargauGemeinde + 20220523Vormals Attelwil, ab 1.1.19 Reitnah + +ch113jqg000000000272CHE-115.253.088 Gemeinde Dottikon, AbwasserbeseitigungDottikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000273CHE-115.257.979 Einwohnergemeinde Hunzenschwil, AbwasserbeseitigungHunzenschwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000274CHE-115.391.224 Einwohnergemeinde Mettauertal, AbwasserbeseitigungMettauertal AfU AargauGemeinde + 20160229 + +ch113jqg000000000275CHE-115.401.213 Gemeinde WilibergWiliberg AfU AargauGemeinde + 20160229 + +ch113jqg000000000276CHE-115.416.031 Einwohnergemeinde Hellikon, AbwasserbeseitigungHellikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000277CHE-112.564.505 Gemeinde Wittnau, KläranlageWittnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000278ZurzachAfU AargauGemeinde + 20220523Vormals Baldingen, ab 1.1.22 Zurzach + +ch113jqg000000000279CHE-115.727.229 Gemeinde MellikonMellikon AfU AargauGemeinde + 20160229 + +ch113jqg000000000280ZurzachAfU AargauGemeinde + 20220523Vormals Wislikofen, ab 1.1.22 Zurzach + +ch113jqg000000000281CHE-115.888.714 Gemeinde Mumpf, AbwasserbeseitgungMumpf AfU AargauGemeinde + 20160229 + +ch113jqg000000000282CHE-115.982.224 Gemeinde Arni, AbwasserArni AfU AargauGemeinde + 20160229 + +ch113jqg000000000283CHE-116.014.474 Einwohnergemeinde Full-Reuenthal, AbwasserbeseitigungFull-Reuent. AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000284CHE-116.014.528 Gemeinde Schupfart, AbwasserbeseitigungSchupfart AfU AargauGemeinde + 20160229 + +ch113jqg000000000285CHE-116.017.231 Gemeinde Beinwil (Freiamt), AbwasserbeseitigungBeinwil_Fa AfU AargauGemeinde + 20160229 + +ch113jqg000000000286CHE-116.018.118 Gemeinde Reitnau, AbwasserbeseitigungReitnau AfU AargauGemeinde + 20160229 + +ch113jqg000000000287CHE-116.134.316 Gemeinde Muri, AbwasserensorgungMuri AfU AargauGemeinde + 20160229auch Ara + +ch113jqg000000000288CHE-116.259.550 Einwohnergemeinde Bettwil, AbwasserbeseitigungBettwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000289CHE-116.333.005 Einwohnergemeinde Auw, AbwasserbeseitigungAuw AfU AargauGemeinde + 20160229 + +ch113jqg000000000290CHE-116.337.546 Einwohnergemeinde Densbüren, AbwasserbeseitigungDensbüren AfU AargauGemeinde + 20160229 + +ch113jqg000000000291CHE-240.906.830 Gemeinde Uezwil, AbwasserentsorgungUezwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000292CHE-243.580.021 Gemeinde Mandach, AbwasserMandach AfU AargauGemeinde + 20160229 + +ch113jqg000000000293BöztalAfU AargauGemeinde + 20220523Vormals Elfingen, ab 1.1.22 Böztal + +ch113jqg000000000294CHE-370.036.097 Gemeinde Schwaderloch, AbwasserbeseitigungSchwaderloch AfU AargauGemeinde + 20160229 + +ch113jqg000000000295CHE-413.294.126 Gemeinde AbtwilAbtwil AfU AargauGemeinde + 20160229 + +ch113jqg000000000296ZurzachAfU AargauGemeinde + 20220523Vormals Rümikon, ab 1.1.22 Zurzach + +ch113jqg000000000297CHE-107.914.887 Scheidegger AG, Bauingenieure & PlanerLangenthal AfU Aargauandere + 20160704Neue_Bezeichnung + +ch113jqg000000000298CHE-116.071.207 Abwasserverband Mittleres WynentalAfU AargauAbwasserverband + 20160818 + +ch113jqg000000000299CHE-112.540.249 Einwohnergemeinde Bergdietikon, AbwasserbeseitigungBergdietikon AfU AargauGemeinde + 20160921 + +ch113jqg000000000300CHE-108.956.233 ARA HallwilerseeAfU AargauAbwasserverband + 20161129 + +ch113jqg000000000301CHE-105.956.432 HOLINGER AGAfU Aargauandere + 20161129Sitz Liestal + +ch113jqg000000000302CHE-180.172.683 Hunziker Betatech AGAfU Aargauandere + 20161129Sitz Bern + +ch113jqg000000000303CHE-115.977.016 Abwasserverband Aarburg, AbwasserversorgungARA Aarburg AfU AargauAbwasserverband + 20170213 + +ch113jqg000000000304CHE-108.953.068 ERZO Entsorgung Region Zofingen KehrichtverbrennungARA erzo AfU AargauAbwasserverband + 20170213 + +ch113jqg000000000305CHE-274.715.392 HOLINGER AGAfU Aargauandere + 20170213Sitz Hünenberg + +ch113jqg000000000306CHE-116.070.018 Abwasserverband SchmittenbachAfU AargauAbwasserverband + 20170220 + +ch113jqg000000000307CHE-100.608.343 Regionaler Wasser- und Abwasserbetrieb Schenkenbergertal REWASREWAS AfU AargauAbwasserverband + 20170612 + +ch113jqg000000000308CHE-116.071.727 Abwasserverband Kelleramt, KläranlageAfU AargauAbwasserverband + 20170628 + +ch113jqg000000000309CHE-108.922.984 Abwasserverband Region LenzburgAfU AargauAbwasserverband + 20170628 + +ch113jqg000000000311CHE-101.720.451 ARA Kaisten AGAfU AargauAbwasserverband + 20170821 + +ch113jqg000000000312CHE-108.955.400 Abwasserverband Wohlen-Villmergen-WaltenschwilAfU AargauAbwasserverband + 20170824 + +ch113jqg000000000313CHE-109.361.060 EW Rothrist AGAfU Aargauandere + 20170928 + +ch113jqg000000000314CHE-115.854.715 Abwasserverband Region StettenAfU AargauAbwasserverband + 20170928 + +ch113jqg000000000315CHE-102.501.414 Avia Tanklager Beteiligungs AG, MellingenAfU AargauPrivat + 20170929 + +ch113jqg000000000316CHE-116.014.184 Abwasserverband SisslebachAfU AargauAbwasserverband + 20171005 + +ch113jqg000000000317CHE-112.537.750 Herznach-UekenAfU AargauGemeinde + 20230131vormals Ueken, ab 1.1.23 Herznach-Ueken + +ch113jqg000000000318CHE-108.962.021 Abwasserverband Stein-Münchwilen AGAfU AargauAbwasserverband + 20171011 + +ch113jqg000000000319CHE-108.955.469 Abwasserverband Aarau und UmgebungAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000320CHE-116.070.254 Abwasserverband Reitnau - Attelwil - MoosleerauAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000321CHE-100.499.781 Abwasserverband Bremgarten-Mutschellen Stadt BremgartenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000322CHE-102.267.951 DSM Nutritional Products AGAfU AargauAbwasserverband + 20171030Betreib. Ara Sisseln + +ch113jqg000000000323CHE-100.052.687 ARA Verband Gontenschwil-Zetzwil, Kläranlage Gontenschwil / ZetzwilAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000324CHE-108.923.009 Abwasserverband Killwangen-Spreitenbach-Würenlos AbwasserreinigungsanlageAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000325CHE-422.685.980 Gemeinde Leibstadt, Regionale KläranlageAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000326CHE-108.956.227 ARA Klingnau-Döttingen-TegerfeldenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000327CHE-116.070.521 ARA Region KöllikenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000328CHE-100.492.804 Gemeinde Rupperswil, Abt. AbwasserverbandAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000329CHE-116.072.069 Abwasserverband Oberes SurbtalAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000330CHE-108.957.072 Gemeindeverband Zurzach, AbwasserverbandAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000331CHE-113.521.243 Stadt Rheinfelden, Abwasserverband Rheinfelden-MagdenAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000332CHE-116.300.827 Abwasserverband Region SchöftlandAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000333CHE-101.719.293 Kernkraftwerk Leibstadt AGAfU AargauPrivat + 20171030für_AraKKW_Leibstadt + +ch113jqg000000000334CHE-108.962.995 Abwasserverband Untersiggenthal-TurgiAfU AargauAbwasserverband + 20171030 + +ch113jqg000000000335CHE-105.781.196 Axpo Power AGAfU AargauPrivat + 20171030u.a. für Ara Beznau + +ch113jqg000000000336CHE-424.096.352 eniwa AGAfU Aargauandere + 20171106Nachfolge IB Aarau + +ch113jqg000000000337CHE-115.076.478 Gemeinde BözbergAfU AargauGemeinde + 20180118 + +ch113jqg000000000338CHE-115.420.469 Einwohnergemeinde Zeihen, WasserversorgungAfU AargauGemeinde + 20180118 + +ch113jqg000000000339CHE-200.611.021 Verwaltung 3Plus, Einwohnergemeinden Bözen, Elfingen und HornussenAfU Aargauandere + 20180118 + +ch113jqg000000000340CHE-000.000.000 Drainagengenossenschaft MeisterschwandenAfU AargauGenossenschaft_Korporation + 20230428Nicht im UID Register + +ch113jqg000000000341CHE-475.408.686 Zbinden GEO AGAfU Aargauandere + 20180928Nachfolge Belat und Partner + +ch113jqg000000000342CHE-116.300.649 Abwasserverband Fischbach-Göslikon / NiederwilAfU AargauAbwasserverband + 20181128 + +ch113jqg000000000343CHE-108.221.858 Recyclingcenter Freiamt AGAfU AargauPrivat + 20181128 + +ch113jqg000000000344CHE-283.848.968 BG Ingenieure und Berater AGAfU Aargauandere + 20190307Zweigniederlassung Baar + +ch113jqg000000000345CHE-108.963.196 Abwasserverband Mettauertal, Abwasserentsorgung, RechnungAVM AfU AargauAbwasserverband + 20190520 + +ch113jqg000000000346CHE-105.951.162 Basler & Hofmann AG Ingenieure Planer und BeraterAfU Aargauandere + 20200120BaslerHofmann + +ch113jqg000000000347CHE-112.111.606 BSB + Partner Ingenieure und Planer AGAfU Aargauandere + 20200303 + +ch113jqg000000000348CHE-116.398.921 PDAG-Fonds-VereinAfU AargauPrivat + 20200702Areal Königsfelden + +ch113jqg000000001626CHE-359.632.210 geoPro Suisse AGAfU AargauPrivat + 20220314 + +ch113jqg000000001659CHE-000.000.000 Privates MiteigentumAfU AargauPrivat + 20220523Für mehrere angeschlossene Liegenschaften + +ch113jqg000000001660CHE-482.735.682 Einwohnergemeinde Böztal, AbwasserbeseitigungAfU AargauGemeinde + 20220523Aus Fusion entstanden + +ch113jqg000000001416CHE-105.986.870 Baerlocher Partner AGAfU AargauPrivat + 20220720von VSA übernommen + +ch113jqg000000001725CHE-000.000.000 Abwasserverband LottenAfU AargauAbwasserverband + 20221102von VSA übernommen + +ch113jqg000000001757CHE-000.000.000 Herznach-UekenAfU AargauGemeinde + 20230131von VSA übernommen + +ch113jqg000000001927CHE-000.000.000 Entwässerungs- und Unterhaltsgenossenschaft Aabachgebiet Hallwil - SeonAfU AargauGenossenschaft_Korporation + 20230524von VSA übernommen + + + + diff --git a/plugin/teksi_wastewater/interlis/gui/interlis_export_settings_dialog.py b/plugin/teksi_wastewater/interlis/gui/interlis_export_settings_dialog.py index b61aba0e2..3ec7d1cba 100644 --- a/plugin/teksi_wastewater/interlis/gui/interlis_export_settings_dialog.py +++ b/plugin/teksi_wastewater/interlis/gui/interlis_export_settings_dialog.py @@ -2,6 +2,7 @@ from collections import OrderedDict from qgis.core import Qgis, QgsSettings +from qgis.PyQt.QtCore import QSettings from qgis.PyQt.QtWidgets import QCheckBox, QDialog from qgis.PyQt.uic import loadUi @@ -29,6 +30,16 @@ def __init__(self, parent): [config.MODEL_NAME_VSA_KEK, config.MODEL_NAME_SIA405_ABWASSER], ) + ag6496extension = QSettings().value("/TWW/AGxxExtensions", False) + # QGIS loads value as string on application restart + if ag6496extension and ag6496extension != "false": + self.export_model_selection_comboBox.addItem( + config.MODEL_NAME_AG96, [config.MODEL_NAME_AG96] + ) + self.export_model_selection_comboBox.addItem( + config.MODEL_NAME_AG64, [config.MODEL_NAME_AG64] + ) + # Fill orientation selection combobox self.export_orientation_selection_comboBox.clear() self.export_orientation_selection_comboBox.addItem("90°", 90.0) diff --git a/plugin/teksi_wastewater/interlis/gui/interlis_import_selection_dialog.py b/plugin/teksi_wastewater/interlis/gui/interlis_import_selection_dialog.py index a42686ab4..ac5c77fa6 100644 --- a/plugin/teksi_wastewater/interlis/gui/interlis_import_selection_dialog.py +++ b/plugin/teksi_wastewater/interlis/gui/interlis_import_selection_dialog.py @@ -298,7 +298,7 @@ def rollback_session(self): self.session.close() if iface: - iface.messageBar().pushMessage("Error", "Import was canceled", level=Qgis.Warning) + iface.messageBar().pushMessage("Error", "Import was cancelled", level=Qgis.Warning) def get_obj_from_listitem(self, listitem): for obj, editor in self.editors.items(): diff --git a/plugin/teksi_wastewater/interlis/interlis_importer_exporter.py b/plugin/teksi_wastewater/interlis/interlis_importer_exporter.py index ec25a57c8..c323d525f 100644 --- a/plugin/teksi_wastewater/interlis/interlis_importer_exporter.py +++ b/plugin/teksi_wastewater/interlis/interlis_importer_exporter.py @@ -1,6 +1,7 @@ import logging import os import tempfile +from pathlib import Path from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication @@ -15,12 +16,15 @@ from .interlis_model_mapping.interlis_importer_to_intermediate_schema import ( InterlisImporterToIntermediateSchema, ) +from .interlis_model_mapping.model_interlis_ag64 import ModelInterlisAG64 +from .interlis_model_mapping.model_interlis_ag96 import ModelInterlisAG96 from .interlis_model_mapping.model_interlis_dss import ModelInterlisDss from .interlis_model_mapping.model_interlis_sia405_abwasser import ( ModelInterlisSia405Abwasser, ) from .interlis_model_mapping.model_interlis_vsa_kek import ModelInterlisVsaKek from .interlis_model_mapping.model_tww import ModelTwwSys, ModelTwwVl +from .interlis_model_mapping.model_tww_ag6496 import ModelTwwAG6496 from .interlis_model_mapping.model_tww_od import ModelTwwOd from .utils.ili2db import InterlisTools from .utils.various import CmdException, LoggingHandlerContext, logger, make_log_path @@ -47,6 +51,7 @@ def __init__(self, progress_done_callback=None): self.model_classes_tww_od = None self.model_classes_tww_vl = None self.model_classes_tww_sys = None + self.model_classes_tww_app = None self.current_progress = 0 @@ -74,6 +79,10 @@ def interlis_import(self, xtf_file_input, show_selection_dialog=False, logs_next import_model = config.MODEL_NAME_DSS elif config.MODEL_NAME_SIA405_BASE_ABWASSER in import_models: import_model = config.MODEL_NAME_SIA405_ABWASSER + elif config.MODEL_NAME_AG96 in import_models: + import_model = config.MODEL_NAME_AG96 + elif config.MODEL_NAME_AG64 in import_models: + import_model = config.MODEL_NAME_AG64 else: error_text = f"No supported model was found among '{import_models}'." if len(import_models) == 1: @@ -191,8 +200,21 @@ def interlis_export( limit_to_selection=limit_to_selection, selected_labels_scales_indices=selected_labels_scales_indices, labels_file_path=labels_file_path, + export_model=export_models[0], + export_orientation=export_orientation, ) + if export_models[0] == config.MODEL_NAME_AG96: + file_path = "data/Organisationstabelle_AG96.xtf" + abs_file_path = Path(__file__).parent.resolve() / file_path + logger.info("Importing AG-96 organisation to intermediate schema") + self._import_xtf_file(self, abs_file_path) + elif export_models[0] == config.MODEL_NAME_AG64: + file_path = "data/Organisationstabelle_AG64.xtf" + abs_file_path = Path(__file__).parent.resolve() / file_path + logger.info("Importing AG-64 organisation to intermediate schema") + self._import_xtf_file(self, abs_file_path) + # Export to the temporary ili2pg model self._progress_done(35, "Converting from TEKSI Wastewater...") self._export_to_intermediate_schema( @@ -242,7 +264,9 @@ def _import_xtf_file(self, xtf_file_input): def _import_from_intermediate_schema(self, import_model): log_handler = logging.FileHandler( - make_log_path(self.base_log_path, "tww2ili-import"), mode="w", encoding="utf-8" + make_log_path(self.base_log_path, "tww2ili-import"), + mode="w", + encoding="utf-8", ) log_handler.setLevel(logging.INFO) log_handler.setFormatter(logging.Formatter("%(levelname)-8s %(message)s")) @@ -255,6 +279,7 @@ def _import_from_intermediate_schema(self, import_model): model_classes_tww_od=self.model_classes_tww_od, model_classes_tww_vl=self.model_classes_tww_vl, callback_progress_done=self._progress_done_intermediate_schema, + model_classes_tww_app=self.model_classes_tww_app, ) with LoggingHandlerContext(log_handler): @@ -267,6 +292,7 @@ def _import_manage_organisations(self): DatabaseUtils.execute("SELECT tww_app.set_organisations_active();") def _import_update_main_cover_and_refresh_mat_views(self): + with DatabaseUtils.PsycopgConnection() as connection: cursor = connection.cursor() @@ -295,9 +321,9 @@ def _export_labels_file( limit_to_selection, selected_labels_scales_indices, labels_file_path, + export_model, + export_orientation=90.0, ): - self._progress_done(self.current_progress, "Extracting labels...") - try: # We only import now to avoid useless exception if dependencies aren't met from qgis import processing @@ -320,16 +346,68 @@ def _export_labels_file( ) self._progress_done(self.current_progress + 5) - processing.run( - "tww:extractlabels_interlis", - { - "OUTPUT": labels_file_path, - "RESTRICT_TO_SELECTION": limit_to_selection, - "STRUCTURE_VIEW_LAYER": structures_lyr, - "REACH_VIEW_LAYER": reaches_lyr, - "SCALES": selected_labels_scales_indices, - }, - ) + + if export_model == config.MODEL_NAME_AG96: + catch_lyr = TwwLayerManager.layer("catchment_area") + meas_pt_lyr = TwwLayerManager.layer("measure_point") + meas_lin_lyr = TwwLayerManager.layer("measure_line") + meas_ply_lyr = TwwLayerManager.layer("measure_polygon") + building_group_lyr = TwwLayerManager.layer("building_group") + + processing.run( + "tww:extractlabels_interlis", + { + "OUTPUT": labels_file_path, + "RESTRICT_TO_SELECTION": limit_to_selection, + "STRUCTURE_VIEW_LAYER": structures_lyr, + "REACH_VIEW_LAYER": reaches_lyr, + "CATCHMENT_LAYER": catch_lyr, + "MEASURE_POINT_LAYER": meas_pt_lyr, + "MEASURE_LINE_LAYER": meas_lin_lyr, + "MEASURE_POLYGON_LAYER": meas_ply_lyr, + "BUILDING_GROUP_LAYER": building_group_lyr, + "SCALES": selected_labels_scales_indices, + "REPLACE_WS_WITH_WN": True, + }, + ) + elif export_model == config.MODEL_NAME_DSS: + catch_lyr = TwwLayerManager.layer("catchment_area") + + processing.run( + "tww:extractlabels_interlis", + { + "OUTPUT": labels_file_path, + "RESTRICT_TO_SELECTION": limit_to_selection, + "STRUCTURE_VIEW_LAYER": structures_lyr, + "REACH_VIEW_LAYER": reaches_lyr, + "CATCHMENT_LAYER": catch_lyr, + "SCALES": selected_labels_scales_indices, + }, + ) + elif export_model == config.MODEL_NAME_AG64: + processing.run( + "tww:extractlabels_interlis", + { + "OUTPUT": labels_file_path, + "RESTRICT_TO_SELECTION": limit_to_selection, + "STRUCTURE_VIEW_LAYER": structures_lyr, + "REACH_VIEW_LAYER": reaches_lyr, + "SCALES": selected_labels_scales_indices, + "REPLACE_WS_WITH_WN": True, + }, + ) + else: + processing.run( + "tww:extractlabels_interlis", + { + "OUTPUT": labels_file_path, + "RESTRICT_TO_SELECTION": limit_to_selection, + "EXPORT_ORIENTATION": export_orientation, + "STRUCTURE_VIEW_LAYER": structures_lyr, + "REACH_VIEW_LAYER": reaches_lyr, + "SCALES": selected_labels_scales_indices, + }, + ) def _export_to_intermediate_schema( self, @@ -355,6 +433,7 @@ def _export_to_intermediate_schema( model_classes_tww_vl=self.model_classes_tww_vl, model_classes_tww_sys=self.model_classes_tww_sys, labels_orientation_offset=export_orientation, + model_classes_tww_app=self.model_classes_tww_app, selection=selected_ids, labels_file=labels_file_path, basket_enabled=basket_enabled, @@ -433,7 +512,6 @@ def _clear_ili_schema(self, recreate_schema=False): with DatabaseUtils.PsycopgConnection() as connection: cursor = connection.cursor() - if not recreate_schema: # If the schema already exists, we just truncate all tables cursor.execute( @@ -589,11 +667,18 @@ def _check_subclass_count(self, schema_name, parent_name, child_list, limit_to_s ) def _init_model_classes(self, model): - ModelInterlis = ModelInterlisSia405Abwasser - if model == config.MODEL_NAME_DSS: - ModelInterlis = ModelInterlisDss - elif model == config.MODEL_NAME_VSA_KEK: - ModelInterlis = ModelInterlisVsaKek + ModelInterlis = None + if model == config.MODEL_NAME_AG96: + ModelInterlis = ModelInterlisAG96 + elif model == config.MODEL_NAME_AG64: + ModelInterlis = ModelInterlisAG64 + else: + ModelInterlis = ModelInterlisSia405Abwasser + if model == config.MODEL_NAME_DSS: + ModelInterlis = ModelInterlisDss + elif model == config.MODEL_NAME_VSA_KEK: + ModelInterlis = ModelInterlisVsaKek + self.model_classes_interlis = ModelInterlis().classes() self._progress_done(self.current_progress + 1) @@ -609,6 +694,12 @@ def _init_model_classes(self, model): self.model_classes_tww_sys = ModelTwwSys().classes() self._progress_done(self.current_progress + 1) + if ( + model == config.MODEL_NAME_AG96 or model == config.MODEL_NAME_AG64 + ) and self.model_classes_tww_app is None: + self.model_classes_tww_app = ModelTwwAG6496().classes() + self._progress_done(self.current_progress + 1) + def _progress_done_intermediate_schema(self): self._progress_done(self.current_progress + 0.5) diff --git a/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_exporter_to_intermediate_schema.py b/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_exporter_to_intermediate_schema.py index 28c9ae1cd..8a506b09c 100644 --- a/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_exporter_to_intermediate_schema.py +++ b/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_exporter_to_intermediate_schema.py @@ -1,7 +1,7 @@ import json from geoalchemy2.functions import ST_Force2D, ST_GeomFromGeoJSON -from sqlalchemy import or_ +from sqlalchemy import nullslast, or_ from sqlalchemy.orm import Session from sqlalchemy.sql import text @@ -22,6 +22,7 @@ def __init__( model_classes_tww_vl, model_classes_tww_sys, labels_orientation_offset=90, + model_classes_tww_app=None, selection=None, labels_file=None, basket_enabled=False, @@ -35,6 +36,7 @@ def __init__( selection: if provided, limits the export to networkelements that are provided in the selection """ self.model = model + self.is_ag_xx_model = model in [config.MODEL_NAME_AG64, config.MODEL_NAME_AG96] self.callback_progress_done = callback_progress_done # Filtering @@ -55,6 +57,7 @@ def __init__( self.model_classes_tww_vl = model_classes_tww_vl self.model_classes_tww_sys = model_classes_tww_sys self.labels_orientation_offset = labels_orientation_offset + self.model_classes_tww_app = model_classes_tww_app self.tww_session = None self.abwasser_session = None @@ -65,6 +68,8 @@ def __init__( self.basket_topic_sia405_abwasser = None self.basket_topic_dss = None self.basket_topic_kek = None + self.basket_topic_ag64 = None + self.basket_topic_ag96 = None def tww_export(self): # Logging disabled (very slow) @@ -93,17 +98,33 @@ def _export(self): if self.basket_enabled: self._create_basket() + if self.is_ag_xx_model: + self.abwasser_session.execute( + "REFRESH MATERIALIZED VIEW tww_app.vw_agxx_knoten_bauwerksattribute WITH DATA" + ) + if self.model == config.MODEL_NAME_AG64: + self.abwasser_session.execute( + text("REFRESH MATERIALIZED VIEW tww_ag6496.knoten_bauwerksattribute WITH DATA;") + ) + self.current_basket = self.basket_topic_ag64 + self._export_ag64() + elif self.model == config.MODEL_NAME_AG96: + self.abwasser_session.execute( + text("REFRESH MATERIALIZED VIEW tww_ag6496.knoten_bauwerksattribute WITH DATA;") + ) + self.current_basket = self.basket_topic_ag96 + self._export_ag96() + else: self.current_basket = self.basket_topic_sia405_administration + self._export_sia405_abwasser() - self._export_sia405_abwasser() - - if self.model == config.MODEL_NAME_DSS: - self.current_basket = self.basket_topic_dss - self._export_dss() + if self.model == config.MODEL_NAME_DSS: + self.current_basket = self.basket_topic_dss + self._export_dss() - if self.model == config.MODEL_NAME_VSA_KEK: - self.current_basket = self.basket_topic_kek - self._export_vsa_kek() + if self.model == config.MODEL_NAME_VSA_KEK: + self.current_basket = self.basket_topic_kek + self._export_vsa_kek() # Labels # Note: these are extracted from the optional labels file (not exported from the TWW database) @@ -157,6 +178,26 @@ def _create_basket(self): domains="", ) self.abwasser_session.add(self.basket_topic_kek) + + self.basket_topic_ag64 = self.model_classes_interlis.t_ili2db_basket( + t_id=6, + dataset=dataset.t_id, + topic=config.TOPIC_NAME_AG64, + t_ili_tid=None, + attachmentkey=dataset.datasetname, + domains="", + ) + self.abwasser_session.add(self.basket_topic_ag64) + + self.basket_topic_ag96 = self.model_classes_interlis.t_ili2db_basket( + t_id=7, + dataset=dataset.t_id, + topic=config.TOPIC_NAME_AG96, + t_ili_tid=None, + attachmentkey=dataset.datasetname, + domains="", + ) + self.abwasser_session.add(self.basket_topic_ag96) self.abwasser_session.flush() def _export_sia405_abwasser(self): @@ -470,6 +511,60 @@ def _export_vsa_kek(self): self._export_file() self._check_for_stop() + def _export_ag64(self): + + logger.info("Exporting TWW.gepknoten -> ABWASSER.infrastrukturknoten") + self._export_infrastrukturknoten() + self._check_for_stop() + + logger.info("Exporting TWW.gephaltung -> ABWASSER.infrastrukturhaltung") + self._export_infrastrukturhaltung() + self._check_for_stop() + + logger.info( + "Exporting TWW.ueberlauf_foerderaggregat -> ABWASSER.ueberlauf_foerderaggregat" + ) + self._export_ueberlauf_foerderaggregat_ag64() + self._check_for_stop() + + def _export_ag96(self): + + logger.info("Exporting TWW.gepmassnahme -> ABWASSER.gepmassnahme") + self._export_gepmassnahme() + self._check_for_stop() + + logger.info("Exporting TWW.gepknoten -> ABWASSER.gepknoten") + self._export_gepknoten() + self._check_for_stop() + + logger.info("Exporting TWW.gephaltung -> ABWASSER.gephaltung") + self._export_gephaltung() + self._check_for_stop() + + logger.info("Exporting TWW.einzugsgebiet -> ABWASSER.einzugsgebiet") + self._export_einzugsgebiet() + self._check_for_stop() + + logger.info( + "Exporting TWW.bautenausserhalbbaugebiet -> ABWASSER.bautenausserhalbbaugebiet" + ) + self._export_bautenausserhalbbaugebiet() + self._check_for_stop() + + logger.info( + "Exporting TWW.ueberlauf_foerderaggregat -> ABWASSER.ueberlauf_foerderaggregat" + ) + self._export_ueberlauf_foerderaggregat_ag96() + self._check_for_stop() + + logger.info("Exporting TWW.sbw_einzugsgebiet -> ABWASSER.sbw_einzugsgebiet") + self._export_sbw_einzugsgebiet() + self._check_for_stop() + + logger.info("Exporting TWW.versickerungsbereichag -> ABWASSER.versickerungsbereichag") + self._export_versickerungsbereichag() + self._check_for_stop() + def _export_organisation(self): query = self.tww_session.query(self.model_classes_tww_od.organisation) for row in query: @@ -517,6 +612,291 @@ def _export_channel(self): logger.info("done") self.abwasser_session.flush() + def _export_gepmassnahme(self): + query = self.tww_session.query(self.model_classes_tww_app.gepmassnahme) + for row in query: + gepmassnahme = self.model_classes_interlis.gepmassnahme( + **self.gep_metainformation_common_ag_xx(row, "gepmassnahme"), + ausdehnung=row.ausdehnung, + beschreibung=self.truncate(self.emptystr_to_null(row.beschreibung), 100), + bezeichnung=self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + datum_eingang=row.datum_eingang, + gesamtkosten=row.gesamtkosten, + handlungsbedarf=row.handlungsbedarf, + jahr_umsetzung_effektiv=row.jahr_umsetzung_effektiv, + jahr_umsetzung_geplant=row.jahr_umsetzung_geplant, + kategorie=row.kategorie, + perimeter=row.perimeter, + prioritaetag=row.prioritaetag, + astatus=row.status, + symbolpos=row.symbolpos, + verweis=row.verweis, + traegerschaft=self.get_tid_by_obj_id(row.traegerschaft), + verantwortlich_ausloesung=self.get_tid_by_obj_id(row.verantwortlich_ausloesung), + ) + self.map_tid_ag_xx(row.obj_id, gepmassnahme.t_id) + self.abwasser_session.add(gepmassnahme) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_gepknoten(self): + query = self.knoten_query_ag_xx() + for row in query: + gepknoten = self.model_classes_interlis.abwasserbauwerk( # abwasserbauwerk wegen Kompatibiltät bei Label-Export + **self.gep_metainformation_common_ag_xx(row, "gepknoten"), + **self.knoten_common_ag_xx(row), + istschnittstelle=row.istschnittstelle, + maxrueckstauhoehe=row.maxrueckstauhoehe, + gepmassnahmeref=self.get_tid_by_obj_id(row.gepmassnahmeref), + ) + self.map_tid_ag_xx(row.obj_id, gepknoten.t_id) + self.abwasser_session.add(gepknoten) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_infrastrukturknoten(self): + query = self.knoten_query_ag_xx() + for row in query: + gepknoten = self.model_classes_interlis.abwasserbauwerk( # abwasserbauwerk wegen Kompatibiltät bei Label-Export + **self.knoten_common_ag_xx(row), + obj_id=row.obj_id, + t_ili_tid=row.obj_id, + t_id=self.get_tid(row), + ) + self.map_tid_ag_xx(row.obj_id, gepknoten.t_id) + self.abwasser_session.add(gepknoten) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_gephaltung(self): + query = self.haltung_query_ag_xx() + for row in query: + gephaltung = self.model_classes_interlis.haltung( + **self.gep_metainformation_common_ag_xx(row, "gephaltung"), + **self.haltung_common_ag_xx(row), + gepmassnahmeref=self.get_tid_by_obj_id(row.gepmassnahmeref), + hydraulischebelastung=row.hydraulischebelastung, + lichte_breite_ist=row.lichte_breite_ist, + lichte_breite_geplant=row.lichte_breite_geplant, + lichte_hoehe_geplant=row.lichte_hoehe_geplant, + nutzungsartag_geplant=row.nutzungsartag_geplant, + ) + self.abwasser_session.add(gephaltung) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_infrastrukturhaltung(self): + query = self.haltung_query_ag_xx() + for row in query: + gephaltung = self.model_classes_interlis.haltung( + **self.haltung_common_ag_xx(row), + obj_id=row.obj_id, + t_ili_tid=row.obj_id, + t_id=self.get_tid(row), + lichte_breite=row.lichte_breite_ist, + ) + self.abwasser_session.add(gephaltung) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_einzugsgebiet(self): + query = self.tww_session.query(self.model_classes_tww_app.einzugsgebiet) + if self.filtered: + query = query.join( + self.model_classes_tww_app.gepknoten, + or_( + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.einzugsgebiet.gepknoten_rw_geplantref, + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.einzugsgebiet.gepknoten_rw_istref, + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.einzugsgebiet.gepknoten_sw_geplantref, + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.einzugsgebiet.gepknoten_sw_istref, + ), + ).filter(self.model_classes_tww_app.gepknoten.obj_id.in_(self.subset_ids)) + + for row in query: + einzugsgebiet = self.model_classes_interlis.einzugsgebiet( + **self.gep_metainformation_common_ag_xx(row, "einzugsgebiet"), + abflussbegrenzung_geplant=row.abflussbegrenzung_geplant, + abflussbegrenzung_ist=row.abflussbegrenzung_ist, + abflussbeiwert_rw_geplant=row.abflussbeiwert_rw_geplant, + abflussbeiwert_rw_ist=row.abflussbeiwert_rw_ist, + abflussbeiwert_sw_geplant=row.abflussbeiwert_sw_geplant, + abflussbeiwert_sw_ist=row.abflussbeiwert_sw_ist, + befestigungsgrad_rw_geplant=row.befestigungsgrad_rw_geplant, + befestigungsgrad_rw_ist=row.befestigungsgrad_rw_ist, + befestigungsgrad_sw_geplant=row.befestigungsgrad_sw_geplant, + befestigungsgrad_sw_ist=row.befestigungsgrad_sw_ist, + bezeichnung=self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + direkteinleitung_in_gewaesser_geplant=row.direkteinleitung_in_gewaesser_geplant, + direkteinleitung_in_gewaesser_ist=row.direkteinleitung_in_gewaesser_ist, + einwohnerdichte_geplant=row.einwohnerdichte_geplant, + einwohnerdichte_ist=row.einwohnerdichte_ist, + entwaesserungssystemag_geplant=row.entwaesserungssystemag_geplant, + entwaesserungssystemag_ist=row.entwaesserungssystemag_ist, + flaeche=row.flaeche, + fremdwasseranfall_geplant=row.fremdwasseranfall_geplant, + fremdwasseranfall_ist=row.fremdwasseranfall_ist, + perimeter=row.perimeter, + perimetertyp=row.perimetertyp, + retention_geplant=row.retention_geplant, + retention_ist=row.retention_ist, + schmutzabwasseranfall_geplant=row.schmutzabwasseranfall_geplant, + schmutzabwasseranfall_ist=row.schmutzabwasseranfall_ist, + versickerung_geplant=row.versickerung_geplant, + versickerung_ist=row.versickerung_ist, + gepknoten_rw_geplantref=self.get_tid_by_obj_id(row.gepknoten_rw_geplantref), + gepknoten_rw_istref=self.get_tid_by_obj_id(row.gepknoten_rw_istref), + gepknoten_sw_geplantref=self.get_tid_by_obj_id(row.gepknoten_sw_geplantref), + gepknoten_sw_istref=self.get_tid_by_obj_id(row.gepknoten_sw_istref), + ) + self.abwasser_session.add(einzugsgebiet) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_bautenausserhalbbaugebiet(self): + query = self.tww_session.query(self.model_classes_tww_app.bautenausserhalbbaugebiet) + for row in query: + bautenausserhalbbaugebiet = self.model_classes_interlis.bautenausserhalbbaugebiet( + **self.gep_metainformation_common_ag_xx(row, "bautenausserhalbbaugebiet"), + anzstaendigeeinwohner=row.anzstaendigeeinwohner, + arealnutzung=row.arealnutzung, + beseitigung_haeusliches_abwasser=row.beseitigung_haeusliches_abwasser, + beseitigung_gewerbliches_abwasser=row.beseitigung_gewerbliches_abwasser, + beseitigung_platzentwaesserung=row.beseitigung_platzentwaesserung, + beseitigung_dachentwaesserung=row.beseitigung_dachentwaesserung, + bezeichnung=self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + eigentuemeradresse=row.eigentuemeradresse, + eigentuemername=row.eigentuemername, + einwohnergleichwert=row.einwohnergleichwert, + lage=row.lage, + nummer=row.nummer, + sanierungsbedarf=row.sanierungsbedarf, + sanierungsdatum=row.sanierungsdatum, + sanierungskonzept=row.sanierungskonzept, + ) + self.abwasser_session.add(bautenausserhalbbaugebiet) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_ueberlauf_foerderaggregat_ag96(self): + query = self.ueberlauf_foerderaggregat_query_ag_xx() + for row in query: + ueberlauf_foerderaggregat = self.model_classes_interlis.ueberlauf_foerderaggregat( + **self.gep_metainformation_common_ag_xx(row, "ueberlauf_foerderaggregat"), + **self.ueberlauf_foerderaggregat_common_ag_xx(row), + ) + self.abwasser_session.add(ueberlauf_foerderaggregat) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_ueberlauf_foerderaggregat_ag64(self): + query = self.ueberlauf_foerderaggregat_query_ag_xx() + for row in query: + ueberlauf_foerderaggregat = self.model_classes_interlis.ueberlauf_foerderaggregat( + **self.ueberlauf_foerderaggregat_common_ag_xx(row), + obj_id=row.obj_id, + t_ili_tid=row.obj_id, + t_id=self.get_tid(row), + letzte_aenderung_wi=row.letzte_aenderung_wi, + bemerkung_wi=self.truncate(self.emptystr_to_null(row.bemerkung_wi), 80), + ) + self.abwasser_session.add(ueberlauf_foerderaggregat) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_sbw_einzugsgebiet(self): + query = self.tww_session.query(self.model_classes_tww_app.sbw_einzugsgebiet) + if self.filtered: + query = query.join( + self.model_classes_tww_app.gepknoten, + or_( + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.sbw_einzugsgebiet.einleitstelleref, + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.sbw_einzugsgebiet.sonderbauwerk_ref, + ), + ).filter(self.model_classes_tww_app.gepknoten.obj_id.in_(self.subset_ids)) + + perimeter_query = text( + """ + WITH geoms AS ( + SELECT *, ST_ForceCurve((ST_Dump(perimeter_ist)).geom) AS geom + FROM tww_ag6496.sbw_einzugsgebiet + WHERE ST_NumGeometries(perimeter_ist)>1 + UNION + SELECT *, ST_ForceCurve(ST_GeometryN(perimeter_ist,1)) AS geom + FROM tww_ag6496.sbw_einzugsgebiet + WHERE ST_NumGeometries(perimeter_ist)=1 + ) + SELECT DISTINCT ON (obj_id) obj_id, ST_Area(geom) AS area, geom, ST_GeometryType(geom) as type + FROM geoms + ORDER BY obj_id, area DESC; + """ + ) + perimeters = self.tww_session.execute(perimeter_query).fetchall() + + for row in query: + largest_perimeter = None + for perimeter in perimeters: + if perimeter[0] == row.obj_id: + largest_perimeter = perimeter[2] + break + + sbw_einzugsgebiet = self.model_classes_interlis.sbw_einzugsgebiet( + **self.gep_metainformation_common_ag_xx(row, "sbw_einzugsgebiet"), + bezeichnung=self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + einwohner_geplant=row.einwohner_geplant, + einwohner_ist=row.einwohner_ist, + flaeche_geplant=row.flaeche_geplant, + flaeche_ist=row.flaeche_ist, + flaeche_befestigt_geplant=row.flaeche_befestigt_geplant, + flaeche_befestigt_ist=row.flaeche_befestigt_ist, + flaeche_reduziert_geplant=row.flaeche_reduziert_geplant, + flaeche_reduziert_ist=row.flaeche_reduziert_ist, + fremdwasseranfall_geplant=row.fremdwasseranfall_geplant, + fremdwasseranfall_ist=row.fremdwasseranfall_ist, + perimeter_ist=largest_perimeter, + schmutzabwasseranfall_geplant=row.schmutzabwasseranfall_geplant, + schmutzabwasseranfall_ist=row.schmutzabwasseranfall_ist, + einleitstelleref=self.get_tid_by_obj_id(row.einleitstelleref), + sonderbauwerk_ref=self.get_tid_by_obj_id(row.sonderbauwerk_ref), + ) + self.abwasser_session.add(sbw_einzugsgebiet) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + + def _export_versickerungsbereichag(self): + query = self.tww_session.query(self.model_classes_tww_app.versickerungsbereichag) + for row in query: + versickerungsbereichag = self.model_classes_interlis.versickerungsbereichag( + # --- abwasserbauwerk --- + **self.gep_metainformation_common_ag_xx(row, "versickerungsbereichag"), + bezeichnung=self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + durchlaessigkeit=row.durchlaessigkeit, + einschraenkung=row.einschraenkung, + maechtigkeit=row.maechtigkeit, + perimeter=row.perimeter, + q_check=row.q_check, + versickerungsmoeglichkeitag=row.versickerungsmoeglichkeitag, + ) + self.abwasser_session.add(versickerungsbereichag) + print(".", end="") + logger.info("done") + self.abwasser_session.flush() + def _export_manhole(self): query = self.tww_session.query(self.model_classes_tww_od.manhole) if self.filtered: @@ -1373,7 +1753,14 @@ def _export_fountain(self): ).filter( self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + else: + # add sql statement to logger + statement = query.statement + logger.debug(f" query = {statement}") + for row in query: brunnen = self.model_classes_interlis.brunnen( **self.connection_object_common(row, "brunnen"), @@ -1583,7 +1970,10 @@ def _export_disposal(self): self.model_classes_tww_od.wastewater_structure, self.model_classes_tww_od.wastewater_networkelement, ).filter(self.model_classes_tww_od.disposal.obj_id.in_(self.subset_ids)) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + for row in query: entsorgung = self.model_classes_interlis.entsorgung( **self.vsa_base_common(row, "entsorgung"), @@ -1661,7 +2051,10 @@ def _export_pump(self): ).filter( self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + for row in query: foerderaggregat = self.model_classes_interlis.foerderaggregat( **self.overflow_common(row, "foerderaggregat"), @@ -1683,12 +2076,20 @@ def _export_pump(self): def _export_building(self): query = self.tww_session.query(self.model_classes_tww_od.building) if self.filtered: + query = query.join( self.model_classes_tww_od.wastewater_networkelement, ).filter( self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + else: + # add sql statement to logger + statement = query.statement + logger.debug(f" query = {statement}") + for row in query: gebaeude = self.model_classes_interlis.gebaeude( **self.connection_object_common(row, "gebaeude"), @@ -1769,9 +2170,7 @@ def _export_building_group_baugwr(self): self.model_classes_tww_od.disposal, self.model_classes_tww_od.wastewater_structure, self.model_classes_tww_od.wastewater_networkelement, - ).filter( - self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) - ) + ).filter() logger.info(f"Selection query: {query.statement}") for row in query: gebaeudegruppe_baugwr = self.model_classes_interlis.gebaeudegruppe_baugwr( @@ -1826,7 +2225,10 @@ def _export_hq_relation(self): query = query.join( self.model_classes_tww_od.overflow_char, ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + for row in query: hq_relation = self.model_classes_interlis.hq_relation( **self.vsa_base_common(row, "hq_relation"), @@ -1972,7 +2374,10 @@ def _export_farm(self): ).filter( self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + for row in query: landwirtschaftsbetrieb = self.model_classes_interlis.landwirtschaftsbetrieb( **self.vsa_base_common(row, "landwirtschaftsbetrieb"), @@ -2017,7 +2422,10 @@ def _export_leapingweir(self): ).filter( self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + for row in query: leapingwehr = self.model_classes_interlis.leapingwehr( **self.overflow_common(row, "leapingwehr"), @@ -2036,6 +2444,7 @@ def _export_measure(self): # always export all measure, therefore no if self.filtered. Adding filter here needs further investigation # if self.filtered: # query = query.filter(self.model_classes_tww_od.measure.obj_id.in_(self.subset_ids)) + for row in query: massnahme = self.model_classes_interlis.massnahme( **self.vsa_base_common(row, "massnahme"), @@ -2066,6 +2475,7 @@ def _export_measure(self): def _export_mechanical_pretreatment(self): query = self.tww_session.query(self.model_classes_tww_od.mechanical_pretreatment) if self.filtered: + query = query.join( self.model_classes_tww_od.wastewater_structure, self.model_classes_tww_od.wastewater_networkelement, @@ -2377,7 +2787,10 @@ def _export_prank_weir(self): ).filter( self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + for row in query: streichwehr = self.model_classes_interlis.streichwehr( **self.overflow_common(row, "streichwehr"), @@ -2422,7 +2835,10 @@ def _export_maintenance(self): self.model_classes_tww_od.wastewater_networkelement.obj_id.in_(self.subset_ids) ) ) - logger.info(f"Selection query: {query.statement}") + # add sql statement to logger + statement = query.statement + logger.info(f" selection query = {statement}") + for row in query: unterhalt = self.model_classes_interlis.unterhalt( **self.maintenance_event_common(row, "unterhalt"), @@ -2808,7 +3224,7 @@ def truncate(self, val, max_length): if val is None: return None if len(val) > max_length: - logger.warning(f"Value '{val}' exceeds expected length ({max_length})", stacklevel=2) + logger.warning(f"Value '{val}' exceeds expected length ({max_length})") return val[0:max_length] def _modulo_angle(self, val): @@ -3130,6 +3546,7 @@ def _export_label_positions(self): "vw_tww_wastewater_structure": {}, "catchment_area": {}, } + for row in self.abwasser_session.query(self.model_classes_interlis.haltung): tid_for_obj_id["vw_tww_reach"][row.t_ili_tid] = row.t_id for row in self.abwasser_session.query(self.model_classes_interlis.abwasserbauwerk): @@ -3139,6 +3556,24 @@ def _export_label_positions(self): for row in self.abwasser_session.query(self.model_classes_interlis.einzugsgebiet): tid_for_obj_id["catchment_area"][row.t_ili_tid] = row.t_id + if self.is_ag_xx_model: + tid_for_obj_id.update( + { + "building_group": {}, + "measure_line": {}, + "measure_point": {}, + "measure_polygon": {}, + } + ) + for row in self.abwasser_session.query( + self.model_classes_interlis.bautenausserhalbbaugebiet + ): + tid_for_obj_id["building_group"][row.t_ili_tid] = row.t_id + for row in self.abwasser_session.query(self.model_classes_interlis.gepmassnahme): + tid_for_obj_id["measure_line"][row.t_ili_tid] = row.t_id + tid_for_obj_id["measure_point"][row.t_ili_tid] = row.t_id + tid_for_obj_id["measure_polygon"][row.t_ili_tid] = row.t_id + with open(self.labels_file) as labels_file_handle: labels = json.load(labels_file_handle) @@ -3152,7 +3587,7 @@ def _export_label_positions(self): if self.subset_ids and obj_id not in self.subset_ids: logger.warning( - f"Label for {layer_name} `{obj_id}` exists, but that object is not part of the export" + f"Label for {layer_name} `{obj_id}` exists, but that object is not part of the subset export" ) continue @@ -3169,35 +3604,132 @@ def _export_label_positions(self): ) continue - if layer_name == "vw_tww_reach": - ili_label = self.model_classes_interlis.haltung_text( - **self._textpos_common( - label, "haltung_text", geojson_crs_def, "RX", self.oid_prefix - ), - haltungref=t_id, - ) - - elif layer_name == "vw_tww_wastewater_structure": - ili_label = self.model_classes_interlis.abwasserbauwerk_text( - **self._textpos_common( - label, "abwasserbauwerk_text", geojson_crs_def, "WX", self.oid_prefix - ), - abwasserbauwerkref=t_id, - ) + if not self.is_ag_xx_model: + if layer_name == "vw_tww_reach": + ili_label = self.model_classes_interlis.haltung_text( + **self._textpos_common( + label, "haltung_text", geojson_crs_def, "RX", self.oid_prefix + ), + haltungref=t_id, + ) - elif layer_name == "catchment_area": - ili_label = self.model_classes_interlis.einzugsgebiet_text( - **self._textpos_common( - label, "einzugsgebiet_text", geojson_crs_def, "CX", self.oid_prefix - ), - einzugsgebietref=t_id, - ) + elif layer_name == "vw_tww_wastewater_structure": + ili_label = self.model_classes_interlis.abwasserbauwerk_text( + **self._textpos_common( + label, "abwasserbauwerk_text", geojson_crs_def, "WX", self.oid_prefix + ), + abwasserbauwerkref=t_id, + ) + elif layer_name == "catchment_area": + ili_label = self.model_classes_interlis.einzugsgebiet_text( + **self._textpos_common( + label, "einzugsgebiet_text", geojson_crs_def, "CX", self.oid_prefix + ), + einzugsgebietref=t_id, + ) + else: + logger.warning( + f"Unknown layer `{layer_name}` for label with id '{obj_id}'. Label will be ignored", + ) + continue else: - logger.warning( - f"Unknown layer `{layer_name}` for label with id '{obj_id}'. Label will be ignored", - ) - continue + if self.model == config.MODEL_NAME_AG64: + if layer_name == "vw_tww_reach": + ili_label = self.model_classes_interlis.haltung_text( + **self._textpos_common( + label, + "infrastrukturhaltung_text", + geojson_crs_def, + "RX", + self.oid_prefix, + ), + infrastrukturhaltung=t_id, + ) + + elif layer_name == "vw_tww_wastewater_structure": + ili_label = self.model_classes_interlis.abwasserbauwerk_text( + **self._textpos_common( + label, + "infrastrukturknoten_text", + geojson_crs_def, + "WX", + self.oid_prefix, + ), + infrastrukturknotenref=t_id, + ) + + else: + logger.warning( + f"Unknown layer `{layer_name}` for label with id '{obj_id}'. Label will be ignored", + ) + continue + else: # AG-96 + if layer_name == "vw_tww_reach": + ili_label = self.model_classes_interlis.haltung_text( + **self._textpos_common( + label, "gephaltung_text", geojson_crs_def, "RX", self.oid_prefix + ), + gephaltungref=t_id, + ) + + elif layer_name == "vw_tww_wastewater_structure": + ili_label = self.model_classes_interlis.abwasserbauwerk_text( + **self._textpos_common( + label, "gepknoten_text", geojson_crs_def, "WX", self.oid_prefix + ), + gepknotenref=t_id, + ) + + elif layer_name == "catchment_area": + ili_label = self.model_classes_interlis.einzugsgebiet_text( + **self._textpos_common( + label, "einzugsgebiet_text", geojson_crs_def, "CX", self.oid_prefix + ), + einzugsgebietref=t_id, + ) + + elif layer_name == "building_group": + ili_label = self.model_classes_interlis.bautenausserhalbbaugebiet_text( + **self._textpos_common( + label, + "bautenausserhalbbaugebiet_text", + geojson_crs_def, + "BX", + self.oid_prefix, + ), + bautenausserhalbbaugebietref=t_id, + ) + + elif layer_name == "measure_line": + ili_label = self.model_classes_interlis.gepmassnahme_text( + **self._textpos_common( + label, "gepmassnahme_text", geojson_crs_def, "MX", self.oid_prefix + ), + gepmassnahmeref=t_id, + ) + + elif layer_name == "measure_point": + ili_label = self.model_classes_interlis.gepmassnahme_text( + **self._textpos_common( + label, "gepmassnahme_text", geojson_crs_def, "MX", self.oid_prefix + ), + gepmassnahmeref=t_id, + ) + + elif layer_name == "measure_polygon": + ili_label = self.model_classes_interlis.gepmassnahme_text( + **self._textpos_common( + label, "gepmassnahme_text", geojson_crs_def, "MX", self.oid_prefix + ), + gepmassnahmeref=t_id, + ) + + else: + logger.warning( + f"Unknown layer {layer_name} for label with id '{obj_id}'. Label will be ignored", + ) + continue self.abwasser_session.add(ili_label) print(".", end="") @@ -3211,3 +3743,169 @@ def close_sessions(self): def _check_for_stop(self): if self.callback_progress_done: self.callback_progress_done() + + def map_tid_ag_xx(self, obj_id, t_id): + """ + Creates a t_id for a given obj_id + """ + if hasattr(self, "obj2tId") is False: + self.obj2tId = {} + + if obj_id not in self.obj2tId.keys(): + self.obj2tId[obj_id] = t_id + + def get_tid_by_obj_id(self, obj_id): + """ + Returns a t_id for a given obj_id + """ + if obj_id in self.obj2tId.keys(): + return self.obj2tId[obj_id] + else: + return None + + def gep_metainformation_common_ag_xx(self, row, type_name): + return { + **self.base_common(row, type_name), + "bemerkung_gep": row.bemerkung_gep, + "datenbewirtschafter_gep": self.get_tid_by_obj_id(row.datenbewirtschafter_gep), + "letzte_aenderung_gep": row.letzte_aenderung_gep, + } + + def knoten_query_ag_xx(self): + """ + Returns a query for knoten + """ + query = self.tww_session.query(self.model_classes_tww_app.gepknoten) + if self.filtered: + query = query.join( + self.model_classes_tww_app.gephaltung, + or_( + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.gephaltung.startknoten, + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.gephaltung.endknoten, + ), + ).filter( + or_( + self.model_classes_tww_app.gephaltung.obj_id.in_(self.subset_ids), + self.model_classes_tww_app.gepknoten.obj_id.in_(self.subset_ids), + ) + ) + + """ + GEPKnoten werden nach Fläche sortiert hinzugefügt, damit bei der Triggerlogik + hinter {ext_schema}.gepknoten die Verknüpfung zu anderen Abwasserbauwerken + basierend auf einem Spatial Join implementiert werden kann. + Dies ist relevant, da Zweitknoten der FunktionAG "andere", die innerhalb der Detailgeometrie + eines anderen Abwasserbauwerks liegen, als Deckel importiert werden. + """ + query.order_by( + nullslast(self.model_classes_tww_app.gepknoten.detailgeometrie.ST_Area().asc()) + ) + return query + + def knoten_common_ag_xx(self, row): + """ + Returns common attributes for wastewater_structure + """ + return { + "ara_nr": row.ara_nr, + "baujahr": row.baujahr, + "baulicherzustand": row.baulicherzustand, + "bauwerkstatus": row.bauwerkstatus, + "bemerkung_wi": self.truncate(self.emptystr_to_null(row.bemerkung_wi), 80), + "bezeichnung": self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + "deckelkote": row.deckelkote, + "detailgeometrie": row.detailgeometrie, + "finanzierung": row.finanzierung, + "funktionag": row.funktionag, + "funktionhierarchisch": row.funktionhierarchisch, + "jahr_zustandserhebung": row.jahr_zustandserhebung, + "lage": row.lage, + "lagegenauigkeit": row.lagegenauigkeit, + "letzte_aenderung_wi": row.letzte_aenderung_wi, + "sanierungsbedarf": row.sanierungsbedarf, + "sohlenkote": row.sohlenkote, + "zugaenglichkeit": row.zugaenglichkeit, + "betreiber": self.get_tid_by_obj_id(row.betreiber), + "datenbewirtschafter_wi": self.get_tid_by_obj_id(row.datenbewirtschafter_wi), + "eigentuemer": self.get_tid_by_obj_id(row.eigentuemer), + } + + def haltung_query_ag_xx(self): + """ + Returns a query for ueberlauf_foerderaggregat + """ + query = self.tww_session.query(self.model_classes_tww_app.gephaltung) + if self.filtered: + query = query.filter(self.model_classes_tww_app.gephaltung.obj_id.in_(self.subset_ids)) + + return query + + def haltung_common_ag_xx(self, row): + """ + Returns common attributes for wastewater_structure + """ + return { + "baujahr": row.baujahr, + "baulicherzustand": row.baulicherzustand, + "bauwerkstatus": row.bauwerkstatus, + "bemerkung_wi": self.truncate(self.emptystr_to_null(row.bemerkung_wi), 80), + "betreiber": self.get_tid_by_obj_id(row.betreiber), + "bezeichnung": self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + "datenbewirtschafter_wi": self.get_tid_by_obj_id(row.datenbewirtschafter_wi), + "eigentuemer": self.get_tid_by_obj_id(row.eigentuemer), + "endknoten": self.get_tid_by_obj_id(row.endknoten), + "finanzierung": row.finanzierung, + "funktionhierarchisch": row.funktionhierarchisch, + "funktionhydraulisch": row.funktionhydraulisch, + "hoehengenauigkeit_nach": row.hoehengenauigkeit_nach, + "hoehengenauigkeit_von": row.hoehengenauigkeit_von, + "jahr_zustandserhebung": row.jahr_zustandserhebung, + "kote_beginn": row.kote_beginn, + "kote_ende": row.kote_ende, + "laengeeffektiv": row.laengeeffektiv, + "letzte_aenderung_wi": row.letzte_aenderung_wi, + "lichte_hoehe_ist": row.lichte_hoehe_ist, + "material": row.material, + "nutzungsartag_ist": row.nutzungsartag_ist, + "profiltyp": row.profiltyp, + "reliner_art": row.reliner_art, + "reliner_bautechnik": row.reliner_bautechnik, + "reliner_material": row.reliner_material, + "reliner_nennweite": row.reliner_nennweite, + "sanierungsbedarf": row.sanierungsbedarf, + "startknoten": self.get_tid_by_obj_id(row.startknoten), + "verlauf": row.verlauf, + "wbw_basisjahr": row.wbw_basisjahr, + "wiederbeschaffungswert": row.wiederbeschaffungswert, + } + + def ueberlauf_foerderaggregat_query_ag_xx(self): + """ + Returns a query for ueberlauf_foerderaggregat + """ + query = self.tww_session.query(self.model_classes_tww_app.ueberlauf_foerderaggregat) + if self.filtered: + query = query.join( + self.model_classes_tww_app.gepknoten, + or_( + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.ueberlauf_foerderaggregat.knotenref, + self.model_classes_tww_app.gepknoten.obj_id + == self.model_classes_tww_app.ueberlauf_foerderaggregat.knoten_nachref, + ), + ).filter(self.model_classes_tww_app.gepknoten.obj_id.in_(self.subset_ids)) + + return query + + def ueberlauf_foerderaggregat_common_ag_xx(self, row): + """ + Returns common attributes for ueberlauf_foerderaggregat + """ + return { + "art": row.art, + "bezeichnung": self.truncate(self.emptystr_to_null(row.bezeichnung), 20), + "knotenref": self.get_tid_by_obj_id(row.knotenref), + "knoten_nachref": self.get_tid_by_obj_id(row.knoten_nachref), + } diff --git a/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_importer_to_intermediate_schema.py b/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_importer_to_intermediate_schema.py index 6be50c49f..7d621426b 100644 --- a/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_importer_to_intermediate_schema.py +++ b/plugin/teksi_wastewater/interlis/interlis_model_mapping/interlis_importer_to_intermediate_schema.py @@ -1,6 +1,6 @@ from datetime import date, datetime -from geoalchemy2.functions import ST_Force3D +from geoalchemy2.functions import ST_Force3D, ST_Multi from sqlalchemy.orm import Session from sqlalchemy.orm.attributes import flag_dirty from sqlalchemy.sql import text @@ -17,6 +17,7 @@ def __init__( model_classes_tww_od, model_classes_tww_vl, callback_progress_done=None, + model_classes_tww_app=None, ): self.model = model self.callback_progress_done = callback_progress_done @@ -24,6 +25,7 @@ def __init__( self.model_classes_interlis = model_classes_interlis self.model_classes_tww_od = model_classes_tww_od self.model_classes_tww_vl = model_classes_tww_vl + self.model_classes_tww_app = model_classes_tww_app self.session_interlis = None self.session_tww = None @@ -63,7 +65,8 @@ def _tww_import(self, skip_closing_tww_session): # Allow to insert rows with cyclic dependencies at once self.session_tww.execute(text("SET CONSTRAINTS ALL DEFERRED;")) - self._import_sia405_abwasser() + if self.model not in [config.MODEL_NAME_AG64, config.MODEL_NAME_AG96]: + self._import_sia405_abwasser() if self.model == config.MODEL_NAME_DSS: self._import_dss() @@ -71,6 +74,12 @@ def _tww_import(self, skip_closing_tww_session): if self.model == config.MODEL_NAME_VSA_KEK: self._import_vsa_kek() + if self.model == config.MODEL_NAME_AG96: + self._import_ag96() + + if self.model == config.MODEL_NAME_AG64: + self._import_ag64() + self.close_sessions(skip_closing_tww_session=skip_closing_tww_session) def _import_sia405_abwasser(self): @@ -384,6 +393,58 @@ def _import_vsa_kek(self): self._import_datei() self._check_for_stop() + def _import_ag64(self): + logger.info("Importing ABWASSER.infrastrukturknoten -> TWW.gepknoten") + self._import_infrastrukturknoten() + self._check_for_stop() + + logger.info("Importing ABWASSER.infrastrukturhaltung -> TWW.gephaltung") + self._import_infrastrukturhaltung() + self._check_for_stop() + + logger.info( + "Importing ABWASSER.ueberlauf_foerderaggregat -> TWW.ueberlauf_foerderaggregat" + ) + self._import_ueberlauf_foerderaggregat_ag64() + self._check_for_stop() + + def _import_ag96(self): + logger.info("Importing ABWASSER.gepmassnahme -> TWW.gepmassnahme") + self._import_gepmassnahme() + self._check_for_stop() + + logger.info("Importing ABWASSER.gepknoten -> TWW.gepknoten") + self._import_gepknoten() + self._check_for_stop() + + logger.info("Importing ABWASSER.gephaltung -> TWW.gephaltung") + self._import_gephaltung() + self._check_for_stop() + + logger.info("Importing ABWASSER.einzugsgebiet -> TWW.einzugsgebiet") + self._import_einzugsgebiet_ag96() + self._check_for_stop() + + logger.info( + "Importing ABWASSER.bautenausserhalbbaugebiet -> TWW.bautenausserhalbbaugebiet" + ) + self._import_bautenausserhalbbaugebiet() + self._check_for_stop() + + logger.info( + "Importing ABWASSER.ueberlauf_foerderaggregat -> TWW.ueberlauf_foerderaggregat" + ) + self._import_ueberlauf_foerderaggregat_ag96() + self._check_for_stop() + + logger.info("Importing ABWASSER.sbw_einzugsgebiet -> TWW.sbw_einzugsgebiet") + self._import_sbw_einzugsgebiet() + self._check_for_stop() + + logger.info("Importing ABWASSER.versickerungsbereichag -> TWW.versickerungsbereichag") + self._import_versickerungsbereichag() + self._check_for_stop() + def close_sessions(self, skip_closing_tww_session=False): # Calling the precommit callback if provided, allowing to filter before final import if not skip_closing_tww_session: @@ -420,7 +481,9 @@ def get_pk(self, relation): """ if relation is None: return None - return relation.t_ili_tid + return ( + relation.t_ili_tid if relation.t_ili_tid else relation.obj_id + ) # if else needed for AG-64/AG-96 def create_or_update(self, cls, **kwargs): """ @@ -2368,6 +2431,333 @@ def _import_gebaeudegruppe_entsorgungassoc(self): self.session_tww.add(re_building_group_disposal) print(".", end="") + ################### + # AG-64/AG-96 # + ################### + def check_ignore_ws(self, row): + if row.funktionag != "andere": + return False + else: + abwasserbw = ( + self.model_classes_interlis.abwasserbauwerk.t_ili_tid + if self.model_classes_interlis.abwasserbauwerk.t_ili_tid + else self.model_classes_interlis.abwasserbauwerk.obj_id + ) + detailgeoms = ( + self.session_interlis.query(self.model_classes_interlis.abwasserbauwerk) + .filter( + self.model_classes_interlis.abwasserbauwerk.detailgeometrie.ST_Buffer( + 0.001 + ).ST_Covers(row.lage), + abwasserbw != row.t_ili_tid, + ) + .first() + ) + if detailgeoms: + return True + else: + return False + + def base_common_ag_xx(self, row): + return { + "obj_id": ( + row.t_ili_tid if row.t_ili_tid else row.obj_id + ), # AG-64 loads no t_ili_tid, AG-96 loads no obj_id + "bezeichnung": row.bezeichnung, + } + + def base_common_ag64(self, row): + """ + Returns common attributes for base + """ + return { + "letzte_aenderung_wi": row.letzte_aenderung_wi, + "datenbewirtschafter_wi": self.get_pk(row.datenbewirtschafter_wi__REL), + "bemerkung_wi": row.bemerkung_wi, + } + + def gep_metainformation_common_ag_xx(self, row): + """ + Returns common attributes for base + """ + return { + "letzte_aenderung_gep": row.letzte_aenderung_gep, + "datenbewirtschafter_gep": self.get_pk(row.datenbewirtschafter_gep__REL), + "bemerkung_gep": row.bemerkung_gep, + } + + def knoten_common_ag_xx(self, row): + """ + Returns common attributes for wastewater_structure + """ + return { + **self.base_common_ag_xx(row), + **self.base_common_ag64(row), + "ara_nr": row.ara_nr, + "baujahr": row.baujahr, + "baulicherzustand": row.baulicherzustand, + "bauwerkstatus": row.bauwerkstatus, + "deckelkote": row.deckelkote, + "detailgeometrie": row.detailgeometrie, + "finanzierung": row.finanzierung, + "funktionag": row.funktionag, + "funktionhierarchisch": row.funktionhierarchisch, + "jahr_zustandserhebung": row.jahr_zustandserhebung, + "lage": row.lage, + "lagegenauigkeit": row.lagegenauigkeit, + "sanierungsbedarf": row.sanierungsbedarf, + "sohlenkote": row.sohlenkote, + "zugaenglichkeit": row.zugaenglichkeit, + "betreiber": self.get_pk(row.betreiber__REL), + "eigentuemer": self.get_pk(row.eigentuemer__REL), + "ignore_ws": self.check_ignore_ws(row), + } + + def haltung_common_ag_xx(self, row): + """ + Returns common attributes for wastewater_structure + """ + return { + **self.base_common_ag_xx(row), + **self.base_common_ag64(row), + "baujahr": row.baujahr, + "baulicherzustand": row.baulicherzustand, + "bauwerkstatus": row.bauwerkstatus, + "finanzierung": row.finanzierung, + "funktionhierarchisch": row.funktionhierarchisch, + "funktionhydraulisch": row.funktionhydraulisch, + "hoehengenauigkeit_von": row.hoehengenauigkeit_von, + "hoehengenauigkeit_nach": row.hoehengenauigkeit_nach, + "jahr_zustandserhebung": row.jahr_zustandserhebung, + "lichte_hoehe_ist": row.lichte_hoehe_ist, + "kote_beginn": row.kote_beginn, + "kote_ende": row.kote_ende, + "laengeeffektiv": row.laengeeffektiv, + "material": row.material, + "nutzungsartag_ist": row.nutzungsartag_ist, + "profiltyp": row.profiltyp, + "reliner_art": row.reliner_art, + "reliner_bautechnik": row.reliner_bautechnik, + "sanierungsbedarf": row.sanierungsbedarf, + "verlauf": row.verlauf, + "wbw_basisjahr": row.wbw_basisjahr, + "wiederbeschaffungswert": row.wiederbeschaffungswert, + "betreiber": self.get_pk(row.betreiber__REL), + "eigentuemer": self.get_pk(row.eigentuemer__REL), + "startknoten": self.get_pk(row.startknoten__REL), + "endknoten": self.get_pk(row.endknoten__REL), + } + + def ueberlauf_foerderaggregat_common_ag_xx(self, row): + """ + Returns common attributes for ueberlauf_foerderaggregat + """ + return { + **self.base_common_ag_xx(row), + "art": row.art, + "knotenref": self.get_pk(row.knotenref__REL), + "knoten_nachref": self.get_pk(row.knoten_nachref__REL), + } + + def _import_gepmassnahme(self): + for row in self.session_interlis.query(self.model_classes_interlis.gepmassnahme): + gepmassnahme = self.model_classes_tww_app.gepmassnahme( + **self.base_common_ag_xx(row), + **self.gep_metainformation_common_ag_xx(row), + ausdehnung=row.ausdehnung, + beschreibung=row.beschreibung, + datum_eingang=row.datum_eingang, + gesamtkosten=row.gesamtkosten, + handlungsbedarf=row.handlungsbedarf, + jahr_umsetzung_effektiv=row.jahr_umsetzung_effektiv, + jahr_umsetzung_geplant=row.jahr_umsetzung_geplant, + kategorie=row.kategorie, + perimeter=row.perimeter, + prioritaetag=row.prioritaetag, + astatus=row.status, + symbolpos=row.symbolpos, + verweis=row.verweis, + traegerschaft=self.get_pk(row.traegerschaft__REL), + verantwortlich_ausloesung=self.get_pk(row.verantwortlich_ausloesung__REL), + ) + self.session_tww.add(gepmassnahme) + print(".", end="") + + def _import_gepknoten(self): + for row in self.session_interlis.query( + self.model_classes_interlis.abwasserbauwerk + ): # abwasserbauwerk wegen Kompatibiltät bei Label-Export + gepknoten = self.model_classes_tww_app.gepknoten( + **self.gep_metainformation_common_ag_xx(row), + **self.knoten_common_ag_xx(row), + istschnittstelle=row.istschnittstelle, + maxrueckstauhoehe=row.maxrueckstauhoehe, + gepmassnahmeref=self.get_pk(row.gepmassnahmeref__REL), + ) + self.session_tww.add(gepknoten) + print(".", end="") + + def _import_infrastrukturknoten(self): + # abwasserbauwerk wegen Kompatibiltät bei Label-Export + for row in self.session_interlis.query(self.model_classes_interlis.abwasserbauwerk): + gepknoten = self.model_classes_tww_app.gepknoten( + **self.knoten_common_ag_xx(row), + ) + self.session_tww.add(gepknoten) + print(".", end="") + + def _import_gephaltung(self): + for row in self.session_interlis.query(self.model_classes_interlis.haltung): + gephaltung = self.model_classes_tww_app.gephaltung( + **self.gep_metainformation_common_ag_xx(row), + **self.haltung_common_ag_xx(row), + gepmassnahmeref=self.get_pk(row.gepmassnahmeref__REL), + hydraulischebelastung=row.hydraulischebelastung, + lichte_breite_ist=row.lichte_breite_ist, + lichte_breite_geplant=row.lichte_breite_geplant, + lichte_hoehe_geplant=row.lichte_hoehe_geplant, + nutzungsartag_geplant=row.nutzungsartag_geplant, + ) + self.session_tww.add(gephaltung) + print(".", end="") + + def _import_infrastrukturhaltung(self): + for row in self.session_interlis.query(self.model_classes_interlis.haltung): + gephaltung = self.model_classes_tww_app.gephaltung( + **self.haltung_common_ag_xx(row), + lichte_breite_ist=row.lichte_breite, + ) + self.session_tww.add(gephaltung) + print(".", end="") + + def _import_einzugsgebiet_ag96(self): + for row in self.session_interlis.query(self.model_classes_interlis.einzugsgebiet): + einzugsgebiet = self.model_classes_tww_app.einzugsgebiet( + **self.base_common_ag_xx(row), + **self.gep_metainformation_common_ag_xx(row), + abflussbegrenzung_geplant=row.abflussbegrenzung_geplant, + abflussbegrenzung_ist=row.abflussbegrenzung_ist, + abflussbeiwert_rw_geplant=row.abflussbeiwert_rw_geplant, + abflussbeiwert_rw_ist=row.abflussbeiwert_rw_ist, + abflussbeiwert_sw_geplant=row.abflussbeiwert_sw_geplant, + abflussbeiwert_sw_ist=row.abflussbeiwert_sw_ist, + befestigungsgrad_rw_geplant=row.befestigungsgrad_rw_geplant, + befestigungsgrad_rw_ist=row.befestigungsgrad_rw_ist, + befestigungsgrad_sw_geplant=row.befestigungsgrad_sw_geplant, + befestigungsgrad_sw_ist=row.befestigungsgrad_sw_ist, + direkteinleitung_in_gewaesser_geplant=row.direkteinleitung_in_gewaesser_geplant, + direkteinleitung_in_gewaesser_ist=row.direkteinleitung_in_gewaesser_ist, + einwohnerdichte_geplant=row.einwohnerdichte_geplant, + einwohnerdichte_ist=row.einwohnerdichte_ist, + entwaesserungssystemag_geplant=row.entwaesserungssystemag_geplant, + entwaesserungssystemag_ist=row.entwaesserungssystemag_ist, + flaeche=row.flaeche, + fremdwasseranfall_geplant=row.fremdwasseranfall_geplant, + fremdwasseranfall_ist=row.fremdwasseranfall_ist, + perimeter=row.perimeter, + perimetertyp=row.perimetertyp, + retention_geplant=row.retention_geplant, + retention_ist=row.retention_ist, + schmutzabwasseranfall_geplant=row.schmutzabwasseranfall_geplant, + schmutzabwasseranfall_ist=row.schmutzabwasseranfall_ist, + versickerung_geplant=row.versickerung_geplant, + versickerung_ist=row.versickerung_ist, + gepknoten_rw_geplantref=self.get_pk(row.gepknoten_rw_geplantref__REL), + gepknoten_rw_istref=self.get_pk(row.gepknoten_rw_istref__REL), + gepknoten_sw_geplantref=self.get_pk(row.gepknoten_sw_geplantref__REL), + gepknoten_sw_istref=self.get_pk(row.gepknoten_sw_istref__REL), + ) + self.session_tww.add(einzugsgebiet) + print(".", end="") + + def _import_bautenausserhalbbaugebiet(self): + for row in self.session_interlis.query( + self.model_classes_interlis.bautenausserhalbbaugebiet + ): + bautenausserhalbbaugebiet = self.model_classes_tww_app.bautenausserhalbbaugebiet( + **self.base_common_ag_xx(row), + **self.gep_metainformation_common_ag_xx(row), + anzstaendigeeinwohner=row.anzstaendigeeinwohner, + arealnutzung=row.arealnutzung, + beseitigung_haeusliches_abwasser=row.beseitigung_haeusliches_abwasser, + beseitigung_gewerbliches_abwasser=row.beseitigung_gewerbliches_abwasser, + beseitigung_platzentwaesserung=row.beseitigung_platzentwaesserung, + beseitigung_dachentwaesserung=row.beseitigung_dachentwaesserung, + eigentuemeradresse=row.eigentuemeradresse, + eigentuemername=row.eigentuemername, + einwohnergleichwert=row.einwohnergleichwert, + lage=row.lage, + nummer=row.nummer, + sanierungsbedarf=row.sanierungsbedarf, + sanierungsdatum=row.sanierungsdatum, + sanierungskonzept=row.sanierungskonzept, + ) + self.session_tww.add(bautenausserhalbbaugebiet) + print(".", end="") + + def _import_ueberlauf_foerderaggregat_ag96(self): + for row in self.session_interlis.query( + self.model_classes_interlis.ueberlauf_foerderaggregat + ): + ueberlauf_foerderaggregat = self.model_classes_tww_app.ueberlauf_foerderaggregat( + **self.gep_metainformation_common_ag_xx(row), + **self.ueberlauf_foerderaggregat_common_ag_xx(row), + ) + self.session_tww.add(ueberlauf_foerderaggregat) + print(".", end="") + + def _import_ueberlauf_foerderaggregat_ag64(self): + + for row in self.session_interlis.query( + self.model_classes_interlis.ueberlauf_foerderaggregat + ): + ueberlauf_foerderaggregat = self.model_classes_tww_app.ueberlauf_foerderaggregat( + **self.ueberlauf_foerderaggregat_common_ag_xx(row), + ) + self.session_tww.add(ueberlauf_foerderaggregat) + print(".", end="") + logger.info("done") + + def _import_sbw_einzugsgebiet(self): + for row in self.session_interlis.query(self.model_classes_interlis.sbw_einzugsgebiet): + sbw_einzugsgebiet = self.model_classes_tww_app.sbw_einzugsgebiet( + **self.base_common_ag_xx(row), + **self.gep_metainformation_common_ag_xx(row), + einwohner_geplant=row.einwohner_geplant, + einwohner_ist=row.einwohner_ist, + flaeche_geplant=row.flaeche_geplant, + flaeche_ist=row.flaeche_ist, + flaeche_befestigt_geplant=row.flaeche_befestigt_geplant, + flaeche_befestigt_ist=row.flaeche_befestigt_ist, + flaeche_reduziert_geplant=row.flaeche_reduziert_geplant, + flaeche_reduziert_ist=row.flaeche_reduziert_ist, + fremdwasseranfall_geplant=row.fremdwasseranfall_geplant, + fremdwasseranfall_ist=row.fremdwasseranfall_ist, + perimeter_ist=ST_Multi(row.perimeter_ist), + schmutzabwasseranfall_geplant=row.schmutzabwasseranfall_geplant, + schmutzabwasseranfall_ist=row.schmutzabwasseranfall_ist, + einleitstelleref=self.get_pk(row.einleitstelleref__REL), + sonderbauwerk_ref=self.get_pk(row.sonderbauwerk_ref__REL), + ) + self.session_tww.add(sbw_einzugsgebiet) + print(".", end="") + + def _import_versickerungsbereichag(self): + for row in self.session_interlis.query(self.model_classes_interlis.versickerungsbereichag): + versickerungsbereichag = self.model_classes_tww_app.versickerungsbereichag( + # --- abwasserbauwerk --- + **self.base_common_ag_xx(row), + **self.gep_metainformation_common_ag_xx(row), + durchlaessigkeit=row.durchlaessigkeit, + einschraenkung=row.einschraenkung, + maechtigkeit=row.maechtigkeit, + perimeter=row.perimeter, + q_check=row.q_check, + versickerungsmoeglichkeitag=row.versickerungsmoeglichkeitag, + ) + self.session_tww.add(versickerungsbereichag) + print(".", end="") + def _check_for_stop(self): if self.callback_progress_done: self.callback_progress_done() diff --git a/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_interlis_ag64.py b/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_interlis_ag64.py new file mode 100644 index 000000000..43b356e77 --- /dev/null +++ b/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_interlis_ag64.py @@ -0,0 +1,63 @@ +from .. import config +from .model_base import ModelBase + + +class ModelInterlisAG64(ModelBase): + def __init__(self): + super().__init__(config.ABWASSER_SCHEMA) + + class baseclass(self.Base): + __tablename__ = "baseclass" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG64.baseclass = baseclass + + class organisation(self.Base): + __tablename__ = "organisation" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG64.organisation = organisation + + class haltung(self.Base): + __tablename__ = "infrastrukturhaltung" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + # Nomenklatur .haltung, damit es für den Label-Export mit VSA-DSS übereinstimmt + ModelInterlisAG64.haltung = haltung + + class abwasserbauwerk(self.Base): + __tablename__ = "infrastrukturknoten" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + # Nomenklatur .abwasserbauwerk, damit es für den Label-Export mit VSA-DSS übereinstimmt + ModelInterlisAG64.abwasserbauwerk = abwasserbauwerk + + class ueberlauf_foerderaggregat(self.Base): + __tablename__ = "ueberlauf_foerderaggregat" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG64.ueberlauf_foerderaggregat = ueberlauf_foerderaggregat + + class textpos(baseclass): + __tablename__ = "textpos" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG64.textpos = textpos + + class sia405_textpos(textpos): + __tablename__ = "sia405_textpos" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG64.sia405_textpos = sia405_textpos + + class haltung_text(sia405_textpos): + __tablename__ = "infrastrukturhaltung_text" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG64.haltung_text = haltung_text + + class abwasserbauwerk_text(sia405_textpos): + __tablename__ = "infrastrukturknoten_text" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG64.abwasserbauwerk_text = abwasserbauwerk_text diff --git a/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_interlis_ag96.py b/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_interlis_ag96.py new file mode 100644 index 000000000..9fdd72e2d --- /dev/null +++ b/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_interlis_ag96.py @@ -0,0 +1,117 @@ +from .. import config +from .model_base import ModelBase + + +class ModelInterlisAG96(ModelBase): + def __init__(self): + super().__init__(config.ABWASSER_SCHEMA) + + class baseclass(self.Base): + __tablename__ = "baseclass" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.baseclass = baseclass + + class metainformation(self.Base): + __tablename__ = "metainformation" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.metainformation = metainformation + + class organisation(self.Base): + __tablename__ = "organisation" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.organisation = organisation + + class bautenausserhalbbaugebiet(metainformation): + __tablename__ = "bautenausserhalbbaugebiet" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.bautenausserhalbbaugebiet = bautenausserhalbbaugebiet + + class einzugsgebiet(metainformation): + __tablename__ = "einzugsgebiet" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.einzugsgebiet = einzugsgebiet + + class haltung(metainformation): + __tablename__ = "gephaltung" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + # Nomenklatur .haltung, damit es für den Label-Export mit VSA-DSS übereinstimmt + ModelInterlisAG96.haltung = haltung + + class abwasserbauwerk(metainformation): + __tablename__ = "gepknoten" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + # Nomenklatur .abwasserbauwerk, damit es für den Label-Export mit VSA-DSS übereinstimmt + ModelInterlisAG96.abwasserbauwerk = abwasserbauwerk + + class gepmassnahme(metainformation): + __tablename__ = "gepmassnahme" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.gepmassnahme = gepmassnahme + + class sbw_einzugsgebiet(metainformation): + __tablename__ = "sbw_einzugsgebiet" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.sbw_einzugsgebiet = sbw_einzugsgebiet + + class ueberlauf_foerderaggregat(metainformation): + __tablename__ = "ueberlauf_foerderaggregat" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.ueberlauf_foerderaggregat = ueberlauf_foerderaggregat + + class versickerungsbereichag(metainformation): + __tablename__ = "versickerungsbereichag" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.versickerungsbereichag = versickerungsbereichag + + class textpos(baseclass): + __tablename__ = "textpos" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.textpos = textpos + + class sia405_textpos(textpos): + __tablename__ = "sia405_textpos" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.sia405_textpos = sia405_textpos + + class haltung_text(sia405_textpos): + __tablename__ = "gephaltung_text" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.haltung_text = haltung_text + + class abwasserbauwerk_text(sia405_textpos): + __tablename__ = "gepknoten_text" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.abwasserbauwerk_text = abwasserbauwerk_text + + class bautenausserhalbbaugebiet_text(sia405_textpos): + __tablename__ = "bautenausserhalbbaugebiet_text" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.bautenausserhalbbaugebiet_text = bautenausserhalbbaugebiet_text + + class einzugsgebiet_text(sia405_textpos): + __tablename__ = "einzugsgebiet_text" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.einzugsgebiet_text = einzugsgebiet_text + + class gepmassnahme_text(sia405_textpos): + __tablename__ = "gepmassnahme_text" + __table_args__ = {"schema": config.ABWASSER_SCHEMA} + + ModelInterlisAG96.gepmassnahme_text = gepmassnahme_text diff --git a/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_tww_ag6496.py b/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_tww_ag6496.py new file mode 100644 index 000000000..929663125 --- /dev/null +++ b/plugin/teksi_wastewater/interlis/interlis_model_mapping/model_tww_ag6496.py @@ -0,0 +1,260 @@ +from geoalchemy2 import Geometry +from sqlalchemy import Boolean, Column, DateTime, Float, Integer, String + +from .. import config +from .model_base import ModelBase + + +class ModelTwwAG6496(ModelBase): + def __init__(self): + super().__init__(config.TWW_APP_SCHEMA) + + class organisation(self.Base): + __tablename__ = "vw_agxx_organisation" + obj_id = Column(String, primary_key=True) + uid = Column(String) + bezeichnung = Column(String) + kurzbezeichnung = Column(String) + datenbewirtschafter_kt = Column(String) + organisationtyp = Column(String) + letzte_aenderung = Column(DateTime) + bemerkung = Column(String) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.organisation = organisation + + class gepmassnahme(self.Base): + __tablename__ = "vw_agxx_gepmassnahme" + obj_id = Column(String, primary_key=True) + ausdehnung = Column(Geometry) + beschreibung = Column(String) + bezeichnung = Column(String) + datum_eingang = Column(DateTime) + gesamtkosten = Column(Float) + handlungsbedarf = Column(String) + jahr_umsetzung_effektiv = Column(Integer) + jahr_umsetzung_geplant = Column(Integer) + kategorie = Column(String) + perimeter = Column(Geometry) + prioritaetag = Column(String) + status = Column(String) + symbolpos = Column(Geometry) + verweis = Column(String) + traegerschaft = Column(String) + verantwortlich_ausloesung = Column(String) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + letzte_aenderung_gep = Column(DateTime) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.gepmassnahme = gepmassnahme + + class gepknoten(self.Base): + __tablename__ = "vw_agxx_gepknoten" + obj_id = Column(String, primary_key=True) + ara_nr = Column(Integer) + baujahr = Column(Integer) + baulicherzustand = Column(String) + bauwerkstatus = Column(String) + bemerkung_wi = Column(String) + bezeichnung = Column(String) + deckelkote = Column(Float) + detailgeometrie = Column(Geometry) + finanzierung = Column(String) + funktionag = Column(String) + funktionhierarchisch = Column(String) + istschnittstelle = Column(String) + jahr_zustandserhebung = Column(Integer) + lage = Column(Geometry) + lagegenauigkeit = Column(String) + letzte_aenderung_wi = Column(DateTime) + maxrueckstauhoehe = Column(Float) + sanierungsbedarf = Column(String) + sohlenkote = Column(Float) + zugaenglichkeit = Column(String) + betreiber = Column(String) + datenbewirtschafter_wi = Column(String) + eigentuemer = Column(String) + gepmassnahmeref = Column(String) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + letzte_aenderung_gep = Column(DateTime) + ignore_ws = Column(Boolean) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.gepknoten = gepknoten + + class gephaltung(self.Base): + __tablename__ = "vw_agxx_gephaltung" + obj_id = Column(String, primary_key=True) + baujahr = Column(Integer) + baulicherzustand = Column(String) + bauwerkstatus = Column(String) + bemerkung_wi = Column(String) + bezeichnung = Column(String) + finanzierung = Column(String) + funktionhierarchisch = Column(String) + funktionhydraulisch = Column(String) + hoehengenauigkeit_nach = Column(String) + hoehengenauigkeit_von = Column(String) + hydraulischebelastung = Column(Integer) + jahr_zustandserhebung = Column(Integer) + kote_beginn = Column(Float) + kote_ende = Column(Float) + letzte_aenderung_wi = Column(DateTime) + lichte_breite_ist = Column(Integer) + lichte_breite_geplant = Column(Integer) + lichte_hoehe_ist = Column(Integer) + lichte_hoehe_geplant = Column(Integer) + laengeeffektiv = Column(Float) + material = Column(String) + profiltyp = Column(String) + nutzungsartag_ist = Column(String) + nutzungsartag_geplant = Column(String) + reliner_art = Column(String) + reliner_bautechnik = Column(String) + reliner_material = Column(String) + reliner_nennweite = Column(Integer) + sanierungsbedarf = Column(String) + verlauf = Column(Geometry) + wbw_basisjahr = Column(Integer) + wiederbeschaffungswert = Column(Float) + betreiber = Column(String) + datenbewirtschafter_wi = Column(String) + eigentuemer = Column(String) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + gepmassnahmeref = Column(String) + letzte_aenderung_gep = Column(DateTime) + startknoten = Column(String) + endknoten = Column(String) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.gephaltung = gephaltung + + class einzugsgebiet(self.Base): + __tablename__ = "vw_agxx_einzugsgebiet" + obj_id = Column(String, primary_key=True) + abflussbegrenzung_geplant = Column(Float) + abflussbegrenzung_ist = Column(Float) + abflussbeiwert_rw_geplant = Column(Float) + abflussbeiwert_rw_ist = Column(Float) + abflussbeiwert_sw_geplant = Column(Float) + abflussbeiwert_sw_ist = Column(Float) + befestigungsgrad_rw_geplant = Column(Float) + befestigungsgrad_rw_ist = Column(Float) + befestigungsgrad_sw_geplant = Column(Float) + befestigungsgrad_sw_ist = Column(Float) + bezeichnung = Column(String) + direkteinleitung_in_gewaesser_geplant = Column(String) + direkteinleitung_in_gewaesser_ist = Column(String) + einwohnerdichte_geplant = Column(Integer) + einwohnerdichte_ist = Column(Integer) + entwaesserungssystemag_geplant = Column(String) + entwaesserungssystemag_ist = Column(String) + flaeche = Column(Float) + fremdwasseranfall_geplant = Column(Float) + fremdwasseranfall_ist = Column(Float) + perimeter = Column(Geometry) + perimetertyp = Column(String) + retention_geplant = Column(String) + retention_ist = Column(String) + schmutzabwasseranfall_geplant = Column(Float) + schmutzabwasseranfall_ist = Column(Float) + versickerung_geplant = Column(String) + versickerung_ist = Column(String) + gepknoten_rw_geplantref = Column(String) + gepknoten_rw_istref = Column(String) + gepknoten_sw_geplantref = Column(String) + gepknoten_sw_istref = Column(String) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + letzte_aenderung_gep = Column(DateTime) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.einzugsgebiet = einzugsgebiet + + class bautenausserhalbbaugebiet(self.Base): + __tablename__ = "vw_agxx_bautenausserhalbbaugebiet" + obj_id = Column(String, primary_key=True) + anzstaendigeeinwohner = Column(Integer) + arealnutzung = Column(String) + beseitigung_haeusliches_abwasser = Column(String) + beseitigung_gewerbliches_abwasser = Column(String) + beseitigung_platzentwaesserung = Column(String) + beseitigung_dachentwaesserung = Column(String) + bezeichnung = Column(String) + eigentuemeradresse = Column(String) + eigentuemername = Column(String) + einwohnergleichwert = Column(Integer) + lage = Column(Geometry) + nummer = Column(Integer) + sanierungsbedarf = Column(String) + sanierungsdatum = Column(DateTime) + sanierungskonzept = Column(String) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + letzte_aenderung_gep = Column(DateTime) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.bautenausserhalbbaugebiet = bautenausserhalbbaugebiet + + class ueberlauf_foerderaggregat(self.Base): + __tablename__ = "vw_agxx_ueberlauf_foerderaggregat" + obj_id = Column(String, primary_key=True) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + bemerkung_wi = Column(String) + letzte_aenderung_gep = Column(DateTime) + letzte_aenderung_wi = Column(DateTime) + art = Column(String) + bezeichnung = Column(String) + knotenref = Column(String) + knoten_nachref = Column(String) + + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.ueberlauf_foerderaggregat = ueberlauf_foerderaggregat + + class sbw_einzugsgebiet(self.Base): + __tablename__ = "vw_agxx_sbw_einzugsgebiet" + obj_id = Column(String, primary_key=True) + bezeichnung = Column(String) + einwohner_geplant = Column(Integer) + einwohner_ist = Column(Integer) + flaeche_geplant = Column(Float) + flaeche_ist = Column(Float) + flaeche_befestigt_geplant = Column(Float) + flaeche_befestigt_ist = Column(Float) + flaeche_reduziert_geplant = Column(Float) + flaeche_reduziert_ist = Column(Float) + fremdwasseranfall_geplant = Column(Float) + fremdwasseranfall_ist = Column(Float) + perimeter_ist = Column(Geometry) + schmutzabwasseranfall_geplant = Column(Float) + schmutzabwasseranfall_ist = Column(Float) + einleitstelleref = Column(String) + sonderbauwerk_ref = Column(String) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + letzte_aenderung_gep = Column(DateTime) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.sbw_einzugsgebiet = sbw_einzugsgebiet + + class versickerungsbereichag(self.Base): + __tablename__ = "vw_agxx_versickerungsbereichag" + obj_id = Column(String, primary_key=True) + datenbewirtschafter_gep = Column(String) + bemerkung_gep = Column(String) + letzte_aenderung_gep = Column(DateTime) + bezeichnung = Column(String) + durchlaessigkeit = Column(String) + einschraenkung = Column(String) + maechtigkeit = Column(String) + perimeter = Column(Geometry) + q_check = Column(String) + versickerungsmoeglichkeitag = Column(String) + __table_args__ = {"schema": config.TWW_APP_SCHEMA} + + ModelTwwAG6496.versickerungsbereichag = versickerungsbereichag diff --git a/plugin/teksi_wastewater/interlis/processing_algs/extractlabels_interlis.py b/plugin/teksi_wastewater/interlis/processing_algs/extractlabels_interlis.py index 45355ae52..689fdbd51 100644 --- a/plugin/teksi_wastewater/interlis/processing_algs/extractlabels_interlis.py +++ b/plugin/teksi_wastewater/interlis/processing_algs/extractlabels_interlis.py @@ -50,6 +50,12 @@ class ExtractlabelsInterlisAlgorithm(TwwAlgorithm): INPUT_SCALES = "SCALES" INPUT_STRUCTURE_VIEW_LAYER = "STRUCTURE_VIEW_LAYER" INPUT_REACH_VIEW_LAYER = "REACH_VIEW_LAYER" + INPUT_CATCHMENT_LAYER = "CATCHMENT_LAYER" + INPUT_MEASURE_POINT_LAYER = "MEASURE_POINT_LAYER" + INPUT_MEASURE_LINE_LAYER = "MEASURE_LINE_LAYER" + INPUT_MEASURE_POLYGON_LAYER = "MEASURE_POLYGON_LAYER" + INPUT_BUILDING_GROUP_LAYER = "BUILDING_GROUP_LAYER" + INPUT_REPLACE_WS_WITH_WN = "REPLACE_WS_WITH_WN" def name(self): return "extractlabels_interlis" @@ -99,6 +105,60 @@ def initAlgorithm(self, config=None): ) ) + self.addParameter( + QgsProcessingParameterVectorLayer( + self.INPUT_CATCHMENT_LAYER, + description=self.tr("Catchment layer"), + types=[QgsWkbTypes.PolygonGeometry], + optional=True, + ) + ) + + self.addParameter( + QgsProcessingParameterVectorLayer( + self.INPUT_MEASURE_POINT_LAYER, + description=self.tr("Measure Point layer"), + types=[QgsWkbTypes.LineGeometry], + optional=True, + ) + ) + + self.addParameter( + QgsProcessingParameterVectorLayer( + self.INPUT_MEASURE_LINE_LAYER, + description=self.tr("Measure Line layer"), + types=[QgsWkbTypes.LineGeometry], + optional=True, + ) + ) + + self.addParameter( + QgsProcessingParameterVectorLayer( + self.INPUT_MEASURE_POLYGON_LAYER, + description=self.tr("Measure Polygon layer"), + types=[QgsWkbTypes.PolygonGeometry], + optional=True, + ) + ) + + self.addParameter( + QgsProcessingParameterVectorLayer( + self.INPUT_BUILDING_GROUP_LAYER, + description=self.tr("Building group layer"), + types=[QgsWkbTypes.PolygonGeometry], + optional=True, + ) + ) + + self.addParameter( + QgsProcessingParameterBoolean( + self.INPUT_REPLACE_WS_WITH_WN, + description=self.tr("Export wn_obj_id for Structure view layer"), + defaultValue=False, + optional=True, + ) + ) + def processAlgorithm( self, parameters, context: QgsProcessingContext, feedback: QgsProcessingFeedback ): @@ -112,6 +172,27 @@ def processAlgorithm( reach_view_layer = self.parameterAsVectorLayer( parameters, self.INPUT_REACH_VIEW_LAYER, context ) + + catchment_layer = self.parameterAsVectorLayer( + parameters, self.INPUT_CATCHMENT_LAYER, context + ) + building_group_layer = self.parameterAsVectorLayer( + parameters, self.INPUT_BUILDING_GROUP_LAYER, context + ) + measure_point_layer = self.parameterAsVectorLayer( + parameters, self.INPUT_MEASURE_POINT_LAYER, context + ) + measure_line_layer = self.parameterAsVectorLayer( + parameters, self.INPUT_MEASURE_LINE_LAYER, context + ) + measure_polygon_layer = self.parameterAsVectorLayer( + parameters, self.INPUT_MEASURE_POLYGON_LAYER, context + ) + + use_wastewater_node = self.parameterAsBoolean( + parameters, self.INPUT_REPLACE_WS_WITH_WN, context + ) + scales = [ self.AVAILABLE_SCALES[i] for i in self.parameterAsEnums(parameters, self.INPUT_SCALES, context) @@ -132,12 +213,51 @@ def processAlgorithm( # Store a mapping from FeatureID to obj_id (used below) reach_feats = reach_view_layer.getFeatures() structure_feats = structure_view_layer.getFeatures() - rowid_to_obj_id = { - "vw_tww_reach": {f.id(): f.attribute("obj_id") for f in reach_feats}, - "vw_tww_wastewater_structure": { - f.id(): f.attribute("obj_id") for f in structure_feats - }, - } + + rowid_to_obj_id = {"vw_tww_reach": {f.id(): f.attribute("obj_id") for f in reach_feats}} + + # AG-64 and AG-96 need to map the wastewater structure label to the wastewater node + if use_wastewater_node: + rowid_to_obj_id.update( + { + "vw_tww_wastewater_structure": { + f.id(): f.attribute("wn_obj_id") for f in structure_feats + } + } + ) + else: + rowid_to_obj_id.update( + { + "vw_tww_wastewater_structure": { + f.id(): f.attribute("obj_id") for f in structure_feats + } + } + ) + if catchment_layer: + catchment_feats = catchment_layer.getFeatures() + rowid_to_obj_id.update( + {"catchment_area": {f.id(): f.attribute("obj_id") for f in catchment_feats}} + ) + if building_group_layer: + building_group_feats = building_group_layer.getFeatures() + rowid_to_obj_id.update( + {"building_group": {f.id(): f.attribute("obj_id") for f in building_group_feats}} + ) + if measure_point_layer: + measure_point_feats = measure_point_layer.getFeatures() + rowid_to_obj_id.update( + {"measure_point": {f.id(): f.attribute("obj_id") for f in measure_point_feats}} + ) + if measure_line_layer: + measure_line_feats = measure_line_layer.getFeatures() + rowid_to_obj_id.update( + {"measure_line": {f.id(): f.attribute("obj_id") for f in measure_line_feats}} + ) + if measure_polygon_layer: + measure_polygon_feats = measure_polygon_layer.getFeatures() + rowid_to_obj_id.update( + {"measure_polygon": {f.id(): f.attribute("obj_id") for f in measure_polygon_feats}} + ) annotated_paths = [] @@ -177,13 +297,44 @@ def processAlgorithm( if labels_count == 0: continue - # Annotate features with tww_obj_id and scal + # Annotate features with tww_obj_id and scale lyr_name_to_key = { TwwLayerManager.layer( "vw_tww_wastewater_structure" ).name(): "vw_tww_wastewater_structure", TwwLayerManager.layer("vw_tww_reach").name(): "vw_tww_reach", } + if catchment_layer: + lyr_name_to_key.update( + { + TwwLayerManager.layer("catchment_area").name(): "catchment_area", + } + ) + if building_group_layer: + lyr_name_to_key.update( + { + TwwLayerManager.layer("building_group").name(): "building_group", + } + ) + if measure_point_layer: + lyr_name_to_key.update( + { + TwwLayerManager.layer("measure_point").name(): "measure_point", + } + ) + if measure_line_layer: + lyr_name_to_key.update( + { + TwwLayerManager.layer("measure_line").name(): "measure_line", + } + ) + if measure_polygon_layer: + lyr_name_to_key.update( + { + TwwLayerManager.layer("measure_polygon").name(): "measure_polygon", + } + ) + feedback.pushInfo(f"used layers: {lyr_name_to_key}") for label in geojson["features"]: layer_name = label["properties"]["Layer"] # this is a non-TWW layer, we don't annotate it diff --git a/plugin/teksi_wastewater/interlis/utils/ili2db.py b/plugin/teksi_wastewater/interlis/utils/ili2db.py index 570564d8e..2cdc856fd 100644 --- a/plugin/teksi_wastewater/interlis/utils/ili2db.py +++ b/plugin/teksi_wastewater/interlis/utils/ili2db.py @@ -121,6 +121,11 @@ def export_xtf_data(self, schema, xtf_file, log_path, model_name, export_model_n "-jar", f'"{self.ili2pg_executable_path}"', "--export", + *( + ["--exportTid"] + if model_name in [config.MODEL_NAME_AG64, config.MODEL_NAME_AG96] + else [] + ), "--models", f"{model_name}", *export_model_name_args, diff --git a/plugin/teksi_wastewater/ui/twwsettingsdialog.ui b/plugin/teksi_wastewater/ui/twwsettingsdialog.ui index 0c09013d5..85878b9c5 100644 --- a/plugin/teksi_wastewater/ui/twwsettingsdialog.ui +++ b/plugin/teksi_wastewater/ui/twwsettingsdialog.ui @@ -185,43 +185,6 @@ - - - - Layout - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - Override default profile template - - - true - - - false - - - - - - - - - ... - - - - - - - - - @@ -315,7 +278,86 @@ - + + + + Layout + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + Override default profile template + + + true + + + false + + + + + + + + + ... + + + + + + + + + + + + + true + + + Enable AG-64 and AG-96 extensions + + + true + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + + WI + + + + + GEP + + + + + None + + + + + Both + + + + + + + + diff --git a/plugin/tww_cmd.py b/plugin/tww_cmd.py index 5711bc3fe..ee8d454d8 100755 --- a/plugin/tww_cmd.py +++ b/plugin/tww_cmd.py @@ -72,6 +72,8 @@ def _add_subparser_interlis_export(self, subparsers): config.MODEL_NAME_SIA405_ABWASSER, config.MODEL_NAME_DSS, config.MODEL_NAME_VSA_KEK, + config.MODEL_NAME_AG96, + config.MODEL_NAME_AG64, ], help="Model to export (default: %(default)s)", )