Skip to content

Commit

Permalink
WIP: Error in text positions fixed, time control
Browse files Browse the repository at this point in the history
- Error in textpositions fixed
- time control and additional layers for time intervalls
- error in qgsadapt fixed
  • Loading branch information
hoettges committed Feb 29, 2024
1 parent d1cd7a8 commit dba6d35
Show file tree
Hide file tree
Showing 7 changed files with 26,620 additions and 20,753 deletions.
15 changes: 8 additions & 7 deletions qkan/database/dbfunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -878,8 +878,8 @@ def calctextpositions(self, data, tdist:float = 0.5, bdist:float = 0.25):

id = data[0][1]
ianf = 0
for iend in range(si):
if data[iend][1] == id and iend < si - 1:
for iend in range(si + 1):
if iend < si and data[iend][1] == id:
# iend innerhalb eines Blocks der aktuellen id
continue

Expand All @@ -898,7 +898,7 @@ def calctextpositions(self, data, tdist:float = 0.5, bdist:float = 0.25):
mavor = ma[i]
stvor = station

pevor = data[i][3]
pevor = data[iend - 1][3] - (tdist + bdist)
mevor = 1 # Initialisierung mit 1 = True
stvor = 0
for i in range(iend - 1, ianf - 1, -1):
Expand All @@ -921,13 +921,14 @@ def calctextpositions(self, data, tdist:float = 0.5, bdist:float = 0.25):
else:
po[i] = (pa[i] + pe[i]) / 2.
# Nächsten Block vorbereiten
ianf = iend
id = data[iend][1]
if iend < si:
ianf = iend
id = data[iend][1]

# Debug:
logzeilen = []
logzeilen = [' uh.pk hu.pk station pa pe ma me po']
for i in range(si):
zeile = f'{data[i][0]:8d} {data[i][1]:8s} {data[i][2]:8.2f} {pa[i]:8.2f} {pe[i]:8.2f} {ma[i]:8.2f} {me[i]:8.2f} {po[i]:8.2f}'
zeile = f'{data[i][0]:8d} {data[i][1]:8d} {data[i][2]:8.2f} {pa[i]:8.2f} {pe[i]:8.2f} {ma[i]:8.2f} {me[i]:8.2f} {po[i]:8.2f}'
logzeilen.append(zeile)
proto = '\n'.join(logzeilen)
logger.debug(f'{self.__class__.__name__} - calctextpositions: Ergebnis der SQL-Anweisung: \n{proto}')
Expand Down
156 changes: 156 additions & 0 deletions qkan/database/migrations/0037_untersuchdat.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
import logging

from qkan.database.dbfunc import DBConnection
from qkan.tools.k_layersadapt import load_plausisql

VERSION = "3.3.8" # must be higher than previous one and correspond with qkan_database.py: __dbVersion__

logger = logging.getLogger("QKan.database.migrations")


def run(dbcon: DBConnection) -> bool:
"""Zusätzliche Spalten in der Haltungstabelle
:type dbcon: DBConnection
"""
if not dbcon.alter_table(
"haltungen_untersucht",
[
"haltnam TEXT",
"schoben TEXT -- join schaechte.schnam",
"schunten TEXT -- join schaechte.schnam",
"hoehe REAL -- Profilhoehe (m)",
"breite REAL -- Profilbreite (m)",
"laenge REAL -- abweichende Haltungslänge (m)",
"baujahr INTEGER",
"untersuchtag TEXT",
"untersucher TEXT",
"wetter INTEGER DEFAULT 0",
"bewertungsart TEXT",
"bewertungstag TEXT",
"strasse TEXT",
"datenart TEXT",
"max_ZD INTEGER",
"max_ZB INTEGER ",
"max_ZS INTEGER",
"xschob REAL",
"yschob REAL",
"xschun REAL",
"yschun REAL",
"kommentar TEXT",
"createdat TEXT DEFAULT CURRENT_TIMESTAMP",
]
):
logger.error(
f"Fehler bei Migration zu Version {VERSION}: "
"Hinzufügen von untersuchtag "
"zu Tabelle 'haltungen_untersucht' fehlgeschlagen"
)

if not load_plausisql(dbcon):
logger.error("Fehler in migration 0036_haltung_ergaenzung")
return False

if not dbcon.alter_table(
"untersuchdat_haltung",
[
"untersuchhal TEXT",
"untersuchrichtung TEXT",
"schoben TEXT -- join schaechte.schnam ",
"schunten TEXT -- join schaechte.schnam",
"id INTEGER -- TODO: join haltungen_untersucht.pk",
"untersuchtag TEXT",
"bandnr INTEGER",
"videozaehler TEXT",
"inspektionslaenge REAL",
"station REAL",
"stationtext REAL",
"timecode INTEGER",
"video_offset REAL",
"kuerzel TEXT",
"charakt1 TEXT",
"charakt2 TEXT",
"quantnr1 REAL",
"quantnr2 REAL",
"streckenschaden TEXT",
"streckenschaden_lfdnr INTEGER",
"pos_von INTEGER",
"pos_bis INTEGER",
"foto_dateiname TEXT",
"film_dateiname TEXT",
"ordner_bild TEXT",
"ordner_video TEXT",
"richtung TEXT",
"ZD INTEGER",
"ZB INTEGER",
"ZS INTEGER",
"createdat TEXT DEFAULT CURRENT_TIMESTAMP",
]
):
logger.error(
f"Fehler bei Migration zu Version {VERSION}: "
"Hinzufügen von untersuchtag "
"zu Tabelle 'untersuchdat_haltung' fehlgeschlagen"
)

if not dbcon.alter_table(
"schaechte_untersucht",
[
"schnam TEXT",
"durchm REAL",
"baujahr INTEGER",
"untersuchtag TEXT",
"untersucher TEXT",
"wetter INTEGER DEFAULT 0",
"strasse TEXT",
"bewertungsart TEXT",
"bewertungstag TEXT",
"datenart TEXT",
"max_ZD INTEGER",
"max_ZB INTEGER",
"max_ZS INTEGER",
"kommentar TEXT",
"createdat TEXT DEFAULT CURRENT_TIMESTAMP",
]
):
logger.error(
f"Fehler bei Migration zu Version {VERSION}: "
"Hinzufügen von untersuchtag "
"zu Tabelle 'schaechte_untersucht' fehlgeschlagen"
)

if not dbcon.alter_table(
"untersuchdat_schacht",
[
"untersuchsch TEXT",
"id INTEGER -- TODO: join schaechte_untersucht.pk",
"untersuchtag TEXT",
"bandnr INTEGER",
"videozaehler TEXT",
"timecode INTEGER",
"kuerzel TEXT",
"charakt1 TEXT",
"charakt2 TEXT",
"quantnr1 REAL",
"quantnr2 REAL",
"streckenschaden TEXT",
"streckenschaden_lfdnr INTEGER",
"pos_von INTEGER",
"pos_bis INTEGER",
"vertikale_lage INTEGER",
"inspektionslaenge INTEGER",
"bereich TEXT",
"foto_dateiname TEXT",
"ordner TEXT",
"ZD INTEGER",
"ZB INTEGER",
"ZS INTEGER",
"createdat TEXT DEFAULT CURRENT_TIMESTAMP",
]
):
logger.error(
f"Fehler bei Migration zu Version {VERSION}: "
"Hinzufügen von untersuchtag "
"zu Tabelle 'untersuchdat_schacht' fehlgeschlagen"
)

return True
8 changes: 4 additions & 4 deletions qkan/database/qkan_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
__author__ = "Joerg Hoettges"
__date__ = "August 2019"
__copyright__ = "(C) 2016, Joerg Hoettges"
__dbVersion__ = "3.3.7" # Version der QKan-Datenbank
__dbVersion__ = "3.3.8" # Version der QKan-Datenbank
__qgsVersion__ = "3.3.8" # Version des Projektes und der Projektdatei. Kann höher als die der QKan-Datenbank sein


Expand Down Expand Up @@ -471,9 +471,9 @@ def createdbtables(
bereich TEXT,
foto_dateiname TEXT,
ordner TEXT,
ZD INTEGER,
ZB INTEGER,
ZS INTEGER,
ZD INTEGER,
ZB INTEGER,
ZS INTEGER,
createdat TEXT DEFAULT CURRENT_TIMESTAMP
)""",
"""SELECT AddGeometryColumn('Untersuchdat_schacht','geop',{},'POINT',2);""".format(epsg),
Expand Down
22 changes: 16 additions & 6 deletions qkan/database/qkan_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -144,17 +144,27 @@ def list_qkan_layers(qgs_template: str = None) -> Dict[str, List]:

qgsxml = ElementTree()
qgsxml.parse(qgs_template)
tag_group = "layer-tree-group/layer-tree-group/[@name='QKan']/layer-tree-group"
qgs_groups = qgsxml.findall(tag_group)

# Search all levels of nested groups
tag_group = "layer-tree-group/layer-tree-group/[@name='QKan']"
qgs_groups = []
while True:
qqsgroup = qgsxml.findall(tag_group)
if not qqsgroup:
break
qgs_groups += qqsgroup
tag_group += '/layer-tree-group'
qkan_layers = {}
for group in qgs_groups:
group_name = group.attrib["name"]
group_layers = group.findall("layer-tree-layer")
for layer in group_layers:
layer_name = layer.attrib["name"]
layer_source = layer.attrib["source"]
dbname, table, geom, sql = get_qkanlayer_attributes(layer_source)
qkan_layers[layer_name] = [table, geom, sql, group_name]
layer_name = layer.attrib.get("name", None)
if layer_name:
# only when group level has layers ...
layer_source = layer.attrib["source"]
dbname, table, geom, sql = get_qkanlayer_attributes(layer_source)
qkan_layers[layer_name] = [table, geom, sql, group_name]
logger.debug("qkan_layers: \n{}".format(qkan_layers))
return qkan_layers

Expand Down
24 changes: 15 additions & 9 deletions qkan/m150porter/_import.py
Original file line number Diff line number Diff line change
Expand Up @@ -1963,16 +1963,19 @@ def _iter() -> Iterator[Untersuchdat_haltung]:
# Textpositionen für Schadenstexte berechnen

sql = """SELECT
uh.pk, uh.untersuchhal || '-' || uh.untersuchtag AS id,
uh.pk, hu.pk AS id,
CASE untersuchrichtung
WHEN 'gegen Fließrichtung' THEN GLength(hu.geom) - uh.station
WHEN 'in Fließrichtung' THEN uh.station
ELSE NULL END AS station,
GLength(hu.geom) AS laenge
FROM untersuchdat_haltung AS uh
JOIN haltungen_untersucht AS hu ON hu.haltnam = uh.untersuchhal AND hu.untersuchtag = uh.untersuchtag
WHERE uh.untersuchhal IS NOT NULL AND uh.untersuchtag IS NOT NULL AND coalesce(laenge, 0) > 0.05
GROUP BY uh.untersuchhal, uh.untersuchtag, station, uh.kuerzel
JOIN haltungen_untersucht AS hu
ON hu.haltnam = uh.untersuchhal AND
hu.schoben = uh.schoben AND
hu.schunten = uh.schunten
WHERE hu.haltnam IS NOT NULL AND hu.untersuchtag IS NOT NULL AND coalesce(laenge, 0) > 0.05
GROUP BY hu.haltnam, hu.untersuchtag, round(station, 3), uh.kuerzel
ORDER BY id, station;"""

if not self.db_qkan.sql(
Expand Down Expand Up @@ -2007,15 +2010,18 @@ def _iter() -> Iterator[Untersuchdat_haltung]:
FROM (VALUES (0.0000000001, 1.0, 0.0), (1.0, 1.0, 0.0), (1.5, 0.0, 1.0), (4.0, 0.0, 1.0))
)
UPDATE untersuchdat_haltung SET geom = (
SELECT MakeLine(Line_Interpolate_Point(OffsetCurve(ha.geom, di.d),
SELECT MakeLine(Line_Interpolate_Point(OffsetCurve(hu.geom, di.d),
(
CASE untersuchrichtung
WHEN 'gegen Fließrichtung' THEN ST_Length(ha.geom) - uh.station
WHEN 'gegen Fließrichtung' THEN ST_Length(hu.geom) - uh.station
WHEN 'in Fließrichtung' THEN uh.station
ELSE ST_Length(ha.geom) - uh.station END * di.stat +
uh.stationtext * di.tpos) / ST_Length(ha.geom))) AS textline
ELSE ST_Length(hu.geom) - uh.station END * di.stat +
uh.stationtext * di.tpos) / ST_Length(hu.geom))) AS textline
FROM dist AS di, untersuchdat_haltung AS uh
JOIN haltungen_untersucht AS ha ON ha.haltnam = uh.untersuchhal
JOIN haltungen_untersucht AS hu
ON hu.haltnam = uh.untersuchhal AND
hu.schoben = uh.schoben AND
hu.schunten = uh.schunten
WHERE uh.pk = untersuchdat_haltung.pk
GROUP BY uh.pk)"""
if not self.db_qkan.sql(
Expand Down
Loading

0 comments on commit dba6d35

Please sign in to comment.