Source code for gws.ext.helper.alkis.data.resolver

import os

import gws
import gws.tools.json2

from ..util import indexer
from ..util.connection import AlkisConnection

# table name, key column, value column

place_tables = {
    'land': 'ax_bundesland',
    'regierungsbezirk': 'ax_regierungsbezirk',
    'kreis': 'ax_kreisregion',
    'gemeinde': 'ax_gemeinde',
    'gemarkungsnummer': 'ax_gemarkung',
    'bezirk': 'ax_buchungsblattbezirk',
    'stelle': 'ax_dienststelle',
}

place_fields = {
    'land': ['land'],
    'regierungsbezirk': ['regierungsbezirk', 'land'],
    'kreis': ['kreis', 'regierungsbezirk', 'land'],
    'gemeinde': ['gemeinde', 'kreis', 'regierungsbezirk', 'land'],
    'gemarkungsnummer': ['gemarkungsnummer', 'land'],
    'bezirk': ['bezirk', 'land'],
    'stelle': ['stelle', 'land']
}

column_labels = {
    'abbaugut': u'Abbaugut',
    'abmarkung_marke': u'Abmarkung (Marke)',
    'administrativefunktion': u'administrative Funktion',
    'advstandardmodell': u'AdV Standard Modell',
    'anlass': u'Anlass',
    'anlassdesprozesses': u'Anlass des Prozesses',
    'anrede': u'Anrede',
    'anzahlderstreckengleise': u'Anzahl der Streckengleise',
    'archaeologischertyp': u'archäologischer Typ',
    'art': u'Art',
    'artderaussparung': u'Art der Aussparung',
    'artderbebauung': u'Art der Bebauung',
    'artderfestlegung': u'Art der Festlegung',
    'artderflurstuecksgrenze': u'Art der Flurstücksgrenze',
    'artdergebietsgrenze': u'Art der Gebietsgrenze',
    'artdergelaendekante': u'Art der Geländekante',
    'artdergeripplinie': u'Art der Geripplinie',
    'artdergewaesserachse': u'Art der Gewässerachse',
    'artdernichtgelaendepunkte': u'Art der Nicht Geländepunkte',
    'artderrechtsgemeinschaft': u'Art der Rechtsgemeinschaft',
    'artderstrukturierung': u'Art der Strukturierung',
    'artderverbandsgemeinde': u'Art der Verbandsgemeinde',
    'artdesmarkantenpunktes': u'Art des Markanten Punktes',
    'artdesnullpunktes': u'Art des Nullpunktes',
    'artdespolders': u'Art des Polders',
    'ausgabeform': u'Ausgabeform',
    'ausgabemedium': u'Ausgabemedium',
    'bahnhofskategorie': u'Bahnhofskategorie',
    'bahnkategorie': u'Bahnkategorie',
    'bauart': u'Bauart',
    'bauweise': u'Bauweise',
    'bauwerksfunktion': u'Bauwerksfunktion',
    'bedeutung': u'Bedeutung',
    'befestigung': u'Befestigung',
    'bemerkungzurabmarkung': u'Bemerkung zur Abmarkung',
    'berechnungsmethode': u'Berechnungsmethode',
    'berechnungsmethodehoehenlinie': u'Berechnungsmethode Höhenlinie',
    'beschaffenheit': u'Beschaffenheit',
    'besondereartdergewaesserbegrenzung': u'besondere Art der Gewässerbegrenzung',
    'besonderebedeutung': u'besondere Bedeutung',
    'besonderefahrstreifen': u'besondere Fahrstreifen',
    'besonderefunktion': u'besondere Funktion',
    'bewuchs': u'Bewuchs',
    'bezeichnungart': u'Bezeichnung (Art)',
    'blattart': u'Blattart',
    'bodenart': u'Bodenart',
    'buchungsart': u'Buchungsart',
    'dachform': u'Dachform',
    'dachgeschossausbau': u'Dachgeschossausbau',
    'darstellung': u'Darstellung',
    'dateityp': u'Datei Typ',
    'datenerhebung': u'Datenerhebung',
    'datenformat': u'Datenformat',
    'description': u'Description',
    'dimension': u'Dimension',
    'eigentuemerart': u'Eigentümerart',
    'elektrifizierung': u'Elektrifizierung',
    'entstehungsartoderklimastufewasserverhaeltnisse': u'Entstehungsart oder Klimastufe/Wasserverhältnisse',
    'fahrbahntrennung': u'Fahrbahntrennung',
    'foerdergut': u'Fördergut',
    'funktion': u'Funktion',
    'funktionhgr': u'Funktion HGR',
    'funktionoa': u'Funktion OA',
    'gebaeudefunktion': u'Gebäudefunktion',
    'genauigkeitsstufe': u'Genauigkeitsstufe',
    'geologischestabilitaet': u'geologische Stabilität',
    'gnsstauglichkeit': u'GNSS Tauglichkeit',
    'gruendederausgesetztenabmarkung': u'Gründe der ausgesetzten Abmarkung',
    'grundwasserschwankung': u'Grundwasserschwankung',
    'grundwasserstand': u'Grundwasserstand',
    'guetedesbaugrundes': u'Güte des Baugrundes',
    'guetedesvermarkungstraegers': u'Güte des Vermarkungsträgers',
    'hafenkategorie': u'Hafenkategorie',
    'hierarchiestufe3d': u'Hierarchiestufe3D',
    'hoehenstabilitaetauswiederholungsmessungen': u'Höhenstabilität aus Wiederholungsmessungen',
    'horizontaleausrichtung': u'horizontale Ausrichtung',
    'horizontfreiheit': u'Horizontfreiheit',
    'hydrologischesmerkmal': u'hydrologisches Merkmal',
    'identifikation': u'Identifikation',
    'impliziteloeschungderreservierung': u'implizite Löschung der Reservierung',
    'internationalebedeutung': u'internationale Bedeutung',
    'klassifizierung': u'Klassifizierung',
    'klassifizierunggr': u'Klassifizierung GR',
    'klassifizierungobg': u'Klassifizierung OBG',
    'konstruktionsmerkmalbauart': u'Konstruktionsmerkmal Bauart',
    'koordinatenstatus': u'Koordinatenstatus',
    'kulturart': u'Kulturart',
    'lagergut': u'Lagergut',
    'lagezurerdoberflaeche': u'Lage zur Erdoberfläche',
    'lagezuroberflaeche': u'Lage zur Oberfläche',
    'landschaftstyp': u'Landschaftstyp',
    'letzteabgabeart': u'Letzte Abgabe Art',
    'levelofdetail': u'level of detail',
    'liniendarstellung': u'Liniendarstellung',
    'markierung': u'Markierung',
    'merkmal': u'Merkmal',
    'messmethode': u'Messmethode',
    'nutzung': u'Nutzung',
    'oberflaechenmaterial': u'Oberflächenmaterial',
    'ordnung': u'Ordnung',
    'primaerenergie': u'Primärenergie',
    'produkt': u'Produkt',
    'punktart': u'Punktart',
    'punktstabilitaet': u'Punktstabilität',
    'punktvermarkung': u'Punktvermarkung',
    'qualitaetsangaben': u'Qualitätsangaben',
    'rechtszustand': u'Rechtszustand',
    'reservierungsart': u'Reservierungsart',
    'schifffahrtskategorie': u'Schifffahrtskategorie',
    'schwerestatus': u'Schwerestatus',
    'schweresystem': u'Schweresystem',
    'selektionsmassstab': u'Selektionsmassstab',
    'skizzenart': u'Skizzenart',
    'sonstigeangaben': u'Sonstige Angaben',
    'speicherinhalt': u'Speicherinhalt',
    'sportart': u'Sportart',
    'spurweite': u'Spurweite',
    'stellenart': u'Stellenart',
    'tidemerkmal': u'Tidemerkmal',
    'topographieundumwelt': u'Topographie und Umwelt',
    'ueberschriftimfortfuehrungsnachweis': u'Überschrift im Fortführungsnachweis',
    'ursprung': u'Ursprung',
    'vegetationsmerkmal': u'Vegetationsmerkmal',
    'verarbeitungsart': u'Verarbeitungsart',
    'verkehrsbedeutunginneroertlich': u'Verkehrsbedeutung Innerörtlich',
    'verkehrsbedeutungueberoertlich': u'Verkehrsbedeutung Ueberörtlich',
    'vermarkung_marke': u'Vermarkung (Marke)',
    'vermutetehoehenstabilitaet': u'Vermutete Höhenstabilität',
    'vertikaleausrichtung': u'Vertikale Ausrichtung',
    'vertrauenswuerdigkeit': u'Vertraünswürdigkeit',
    'verwendeteinstanzenthemen': u'Verwendete Instanzenthemen',
    'verwendeteobjekte': u'Verwendete Objekte',
    'verwendetethemen': u'Verwendete Themen',
    'weiteregebaeudefunktion': u'Weitere Gebäudefunktion',
    'wertigkeit': u'Wertigkeit',
    'widmung': u'Widmung',
    'wirtschaftsart': u'Wirtschaftsart',
    'zone': u'Zone',
    'zugriffsartfortfuehrungsanlass': u'Zugriffsart Fortführungsanlass',
    'zugriffsartproduktkennungbenutzung': u'Zugriffsart Produktkennung Benutzung',
    'zugriffsartproduktkennungfuehrung': u'Zugriffsart Produktkennung Führung',
    'zustand': u'Zustand',
    'zustandsstufeoderbodenstufe': u'Zustandsstufe oder Bodenstufe',

    'land': u'Bundesland',
    'regierungsbezirk': u'Regierungsbezirk',
    'kreis': u'Kreis',
    'gemeinde': u'Gemeinde',
    'bezirk': u'Buchungsblattbezirk',
    'stelle': u'Dienststelle'
}

# s. ALKIS_OK_6_0.html#_3DFA354A0193
# id - table - label
nutzung_tables = [
    (41001, 'ax_wohnbauflaeche', u'Wohnbaufläche'),
    (41002, 'ax_industrieundgewerbeflaeche', u'Industrie- und Gewerbefläche'),
    (41003, 'ax_halde', u'Halde'),
    (41004, 'ax_bergbaubetrieb', u'Bergbaubetrieb'),
    (41005, 'ax_tagebaugrubesteinbruch', u'Tagebau, Grube, Steinbruch'),
    (41006, 'ax_flaechegemischternutzung', u'Fläche gemischter Nutzung'),
    (41007, 'ax_flaechebesondererfunktionalerpraegung', u'Fläche besonderer funktionaler Prägung'),
    (41008, 'ax_sportfreizeitunderholungsflaeche', u'Sport-, Freizeit- und Erholungsfläche'),
    (41009, 'ax_friedhof', u'Friedhof'),
    (41010, 'ax_siedlungsflaeche', u'Siedlungsfläche'),
    (42001, 'ax_strassenverkehr', u'Straßenverkehr'),
    (42002, 'ax_strasse', u'Straße'),
    (42003, 'ax_strassenachse', u'Straßenachse'),
    (42005, 'ax_fahrbahnachse', u'Fahrbahnachse'),
    (42006, 'ax_weg', u'Weg'),
    (42008, 'ax_fahrwegachse', u'Fahrwegachse'),
    (42009, 'ax_platz', u'Platz'),
    (42010, 'ax_bahnverkehr', u'Bahnverkehr'),
    (42014, 'ax_bahnstrecke', u'Bahnstrecke'),
    (42015, 'ax_flugverkehr', u'Flugverkehr'),
    (42016, 'ax_schiffsverkehr', u'Schiffsverkehr'),
    (43001, 'ax_landwirtschaft', u'Landwirtschaft'),
    (43002, 'ax_wald', u'Wald'),
    (43003, 'ax_gehoelz', u'Gehölz'),
    (43004, 'ax_heide', u'Heide'),
    (43005, 'ax_moor', u'Moor'),
    (43006, 'ax_sumpf', u'Sumpf'),
    (43007, 'ax_unlandvegetationsloseflaeche', u'Unland/Vegetationslose Fläche'),
    (43008, 'ax_flaechezurzeitunbestimmbar', u'Fläche zur Zeit unbestimmbar'),
    (44001, 'ax_fliessgewaesser', u'Fließgewässer'),
    (44002, 'ax_wasserlauf', u'Wasserlauf'),
    (44003, 'ax_kanal', u'Kanal'),
    (44004, 'ax_gewaesserachse', u'Gewässerachse'),
    (44005, 'ax_hafenbecken', u'Hafenbecken'),
    (44006, 'ax_stehendesgewaesser', u'Stehendes Gewässer'),
    (44007, 'ax_meer', u'Meer'),
]

# 'category' key
# for other tables it's assumed to be 'funktion'

nutzung_keys = {
    41003: 'lagergut',
    41004: 'abbaugut',
    41005: 'abbaugut',
    43001: 'vegetationsmerkmal',
    43002: 'vegetationsmerkmal',
    43003: 'vegetationsmerkmal',
}

PROPS_INDEX = 'idx_resolver_props'
PLACE_INDEX = 'idx_resolver_place'


def _create_props_index(conn):
    props = gws.tools.json2.from_path(os.path.dirname(__file__) + '/nasprops.json')
    data = []

    for ident, value in props.items():
        # e.g.  ['ax_polder:artdespolders:1000', 'Sommerpolder']
        s = ident.split(':')
        data.append({
            'table_name': s[0],
            'column_name': s[1],
            'property_key': s[2],
            'property_value': value,
        })

    conn.create_index_table(PROPS_INDEX, '''
        id SERIAL PRIMARY KEY,
        table_name CHARACTER VARYING,
        column_name CHARACTER VARYING,
        property_key CHARACTER VARYING,
        property_value CHARACTER VARYING
    ''')
    conn.index_insert(PROPS_INDEX, data)
    conn.mark_index_table(PROPS_INDEX)


def _create_place_index(conn: AlkisConnection):
    data = []
    tables = conn.table_names(conn.data_schema)

    for key, table in place_tables.items():
        if table not in tables:
            continue

        fields = place_fields[key]

        for r in conn.select_from_ax(table, fields + ['bezeichnung']):
            data.append({
                'table_name': table,
                'place_key': ','.join('%s=%s' % (f, r[f]) for f in fields),
                'place_id': r[fields[0]],
                'place_name': r['bezeichnung']

            })

    conn.create_index_table(PLACE_INDEX, '''
        id SERIAL PRIMARY KEY,
        table_name CHARACTER VARYING,
        place_key CHARACTER VARYING,
        place_id CHARACTER VARYING,
        place_name CHARACTER VARYING
    ''')
    conn.index_insert(PLACE_INDEX, data)
    conn.mark_index_table(PLACE_INDEX)


[docs]def create_index(conn: AlkisConnection): if not indexer.check_version(conn, PROPS_INDEX): _create_props_index(conn) if not indexer.check_version(conn, PLACE_INDEX): _create_place_index(conn)
[docs]def index_ok(conn: AlkisConnection): return indexer.check_version(conn, PROPS_INDEX) and indexer.check_version(conn, PLACE_INDEX)
def _load_props_for_table(conn: AlkisConnection, table): idx = conn.index_schema d = {} sql = f'SELECT * FROM {idx}.{PROPS_INDEX} WHERE table_name=%s' for r in conn.select(sql, [table]): c = r['column_name'] d.setdefault(c, {})[r['property_key']] = r['property_value'] return d def _load_places(conn: AlkisConnection): idx = conn.index_schema d = {} rs = conn.select(f'SELECT place_key, place_name FROM {idx}.{PLACE_INDEX}') for r in rs: d[r['place_key']] = r['place_name'] return d
[docs]def attributes(conn: AlkisConnection, table, rec): cc = gws.get_global( 'alkis_resolver_props_' + table, lambda: _load_props_for_table(conn, table)) attr = {} for name in cc: if name not in rec: continue v = cc[name].get(str(rec[name])) if v is not None: attr[name] = v attr[name + '_id'] = rec[name] return attr
[docs]def places(conn: AlkisConnection, rec): cc = gws.get_global( 'alkis_resolver_places', lambda: _load_places(conn)) attr = {} for name, fields in place_fields.items(): key = ','.join('%s=%s' % (f, rec.get(f, '')) for f in fields) if key in cc: s = 'gemarkung' if name == 'gemarkungsnummer' else name attr[s] = cc[key] attr[s + '_id'] = rec[name] return attr
[docs]def nutzung_key(type_id, rec): key = nutzung_keys.get(type_id, 'funktion') if rec.get(key): return { 'key': rec[key], 'key_id': rec[key + '_id'], 'key_label': column_labels[key] }