Coverage for gws-app/gws/plugin/alkis/_test/data.py: 46%
300 statements
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-23 20:06 +0200
« prev ^ index » next coverage.py v7.17.0, created at 2026-10-23 20:06 +0200
1"""ALKIS test dataset.
3Creates a small ALKIS dataset in the norBIT table layout (GeoInfoDok 7),
4as read by ``gws.plugin.alkis.data.norbit``. Table and column definitions
5follow the norBIT import, only the columns used by the reader are created.
7Most objects have two versions: a historic one (``endet`` set) and a current
8one. Some objects only have an ended version.
10Places:
12- Land1 > Regierungsbezirk1 > Kreis1 > Gemeinde1, Gemeinde2
13- Gemeinde3 has ended, Flurstuecke in it are excluded
14- Gemarkung1, Gemarkung2 (in Gemeinde1, Gemeinde2), Gemarkung3 (for ``excludeGemarkung``)
15- Buchungsblattbezirk1, Dienststelle1
17Flurstuecke (100 x 100 m squares, in a row along the x axis):
19- fs 1: Gemarkung1, booked on bs 1 (was bs 5), two addresses, one Lage without number, two buildings
20- fs 2: Gemarkung1, addresses for house number ranges, booked on bs 3, which is booked ``zu`` bs 2, booked ``an`` bs 1
21- fs 3: Gemarkung2, Gemeinde2, unencoded addresses, with nenner and flurstuecksfolge
22- fs 4: ended, booked on the ended bs 6
23- fs 5: Gemeinde3 (ended), excluded
24- fs 6: no geometry
25- fs 7: Gemarkung3
26- hfs 1: ``AX_HistorischesFlurstueck`` with Buchung data, successors fs 1, fs 2 and an unknown one
27- hfs 2: ``AX_HistorischesFlurstueck`` without Buchung data
29Land register:
31- bb 1: bs 1, bs 4, bs 5 (ended); nn 1 (Person1), nn 2 (Firma1), nn 3 (ended, Person3)
32- bb 2: bs 2 (Erbbaurecht ``an`` bs 1); nn 4 (Person4)
33- bb 3: bs 3 (``zu`` bs 2); nn 5 (Erbengemeinschaft), nn 6 (Person1)
34- bb 4: ended; bs 6 (ended)
36Parts: a Wohnbauflaeche over fs 1 and fs 2, Strassenverkehr over fs 3 (and an
37ended one), a Bodenschaetzung over half of fs 3, a Denkmalschutzrecht over a
38quarter of fs 1 that touches fs 2 by less than ``MIN_PART_AREA``.
40The dataset and the test cases with their expected results are kept in
41``data.md``, which drives the tests. ``generate`` creates ``data.md`` from the
42dataset and the requests in ``_TESTS``, by running the requests against the
43test database; review the expected results after generating. ``load`` reads
44``data.md``. To generate, run in the test container::
46 python3 /gws-app/gws/plugin/alkis/_test/data.py <base dir> > data.md
48where ``<base dir>`` is ``runner.base_dir`` of the test harness.
49"""
51import contextlib
52import json
53import os
54import sys
56import gws
57import gws.test.util as u
59SCHEMA = 'alkis_test'
61SRID = 25832
63X0 = 400000
64Y0 = 5700000
66BEGIN_OLD = '2020-01-01T00:00:00Z'
67"""Start of historic versions."""
68BEGIN_NEW = '2025-06-01T00:00:00Z'
69"""End of historic versions, start of current versions."""
71ANLASS_OLD = '010101'
72ANLASS_NEW = '010102'
73ANLASS_END = '300500'
74ANLASS_NONE = '000000'
76LAND = '05'
77REGIERUNGSBEZIRK = '9'
78KREIS = '78'
79GEMEINDE_1 = '001'
80GEMEINDE_2 = '002'
81GEMEINDE_3 = '003'
82GEMARKUNG_1 = '1001'
83GEMARKUNG_2 = '1002'
84GEMARKUNG_3 = '1003'
85BEZIRK = '2001'
86STELLE = '3001'
87LAGE_1 = '00001'
88LAGE_2 = '00002'
90HISTORY = dict(wantHistorySearch=True, wantHistoryDisplay=True)
92MD_PATH = os.path.dirname(__file__) + '/data.md'
95def _uid(kind: str, n: int) -> str:
96 """Return the 16-character ``gml_id`` of a test object, e.g. ``_uid('fs', 1)`` -> ``DEFS000000000001``."""
98 s = 'DE' + kind.upper()
99 return s + str(n).zfill(16 - len(s))
102def _flurstueckskennzeichen(gemarkung: str, flur: int, zaehler: int, nenner: int = 0, folge: str = '') -> str:
103 """Return a Flurstueckskennzeichen in the ALKIS format."""
105 return (
106 LAND
107 + gemarkung
108 + f'{flur:03d}'
109 + f'{zaehler:05d}'
110 + (f'{nenner:04d}' if nenner else '____')
111 + (folge or '__')
112 )
115def _buchungsblattkennzeichen(n: int) -> str:
116 """Return the Buchungsblattkennzeichen of ``bb n``."""
118 return LAND + BEZIRK + f'{n:06d}'
121def generate(base_dir: str):
122 """Create the dataset in the test database, run the test requests and print ``data.md`` to stdout.
124 Args:
125 base_dir: ``runner.base_dir`` of the test harness.
126 """
128 from gws.plugin.alkis._test import action_test
130 u.load_options(base_dir)
131 gws.u.ensure_system_dirs()
132 gws.log.set_level('ERROR')
134 with contextlib.redirect_stdout(sys.stderr):
135 tables = _tables_json()
136 action_test.create_tables(tables)
137 root = action_test.create_root()
138 lines = [
139 *_render_tables(tables),
140 *_render_tests(root, action_test.run_case),
141 ]
143 sys.stdout.write('\n'.join(lines).rstrip() + '\n')
146def load(path: str = MD_PATH) -> dict:
147 """Read ``data.md``.
149 Args:
150 path: Path to the markdown file.
152 Returns:
153 A dict with the keys ``tables`` and ``cases``. ``tables`` maps a table
154 name to ``{columns: {name: type}, rows: [{name: value}]}``, values are
155 strings or ``None``. ``cases`` is a list of
156 ``{section, group, command, request, status, view, response}``;
157 ``view`` and ``response`` are ``None`` if the status is not 200.
158 """
160 tables = {}
161 cases = []
163 part = ''
164 section = ''
165 group = ''
166 table = None
167 block = None
169 for line in gws.u.read_file(path).splitlines():
170 if block is not None:
171 if line.startswith('```'):
172 for text in '\n'.join(block).strip().split('\n\n'):
173 cases.append(_parse_case(text, section, group))
174 block = None
175 else:
176 block.append(line)
177 continue
179 if line.startswith('# '):
180 part = line[2:].strip()
181 continue
182 if line.startswith('## '):
183 section = line[3:].strip()
184 group = ''
185 if part == 'Source data':
186 name = section.removeprefix('Table ').strip()
187 table = tables[name] = dict(columns={}, rows=[])
188 continue
189 if line.startswith('### '):
190 group = line[4:].strip()
191 continue
192 if line.startswith('```'):
193 block = []
194 continue
196 if part == 'Source data' and table is not None and line.startswith('|'):
197 cells = [c.strip() for c in line.strip().strip('|').split('|')]
198 if not table['columns']:
199 for c in cells:
200 name, _, typ = c.partition(' ')
201 table['columns'][name] = typ.strip()
202 elif not set(''.join(cells)) <= set('-'):
203 table['rows'].append({name: c or None for name, c in zip(table['columns'], cells)})
205 return dict(tables=tables, cases=cases)
208##
210def _point_props(x, y):
211 return {'crs': f'EPSG:{SRID}', 'geometry': {'type': 'Point', 'coordinates': [X0 + x, Y0 + y]}}
214_TESTS = [
215 dict(
216 title='Find Flurstueck',
217 command='alkisFindFlurstueck',
218 view='uids',
219 groups=[
220 ('Places', [
221 dict(gemarkungCode=GEMARKUNG_1),
222 dict(gemarkungCode=LAND + GEMARKUNG_2),
223 dict(gemarkungCode=GEMARKUNG_3),
224 dict(gemarkung='Gemarkung1'),
225 dict(gemarkung='gemarkung1'),
226 dict(gemeinde='Gemeinde2'),
227 dict(gemeindeCode=LAND + REGIERUNGSBEZIRK + KREIS + GEMEINDE_1),
228 dict(kreis='Kreis1'),
229 dict(regierungsbezirk='Regierungsbezirk1'),
230 dict(land='Land1'),
231 dict(landCode=LAND, gemarkungCode=GEMARKUNG_1),
232 ]),
233 ('Parcel numbers', [
234 dict(flurnummer='2'),
235 dict(zaehler='1'),
236 dict(zaehler='2', nenner='1'),
237 dict(flurstuecksfolge='01'),
238 dict(fsnummer=LAND + GEMARKUNG_1 + ' 1-2/1'),
239 dict(fsnummer='1-1'),
240 dict(fsnummer=LAND + GEMARKUNG_2 + ' 2-3/2 (01)'),
241 dict(fsnummer=_flurstueckskennzeichen(GEMARKUNG_2, 2, 3, 2, '01')),
242 dict(fsnummer=_flurstueckskennzeichen(GEMARKUNG_1, 1, 1)[:14]),
243 dict(fsnummer=_uid('fs', 3)),
244 dict(combinedFlurstueckCode=f'{LAND}_{GEMARKUNG_1}_1_2_1'),
245 dict(combinedFlurstueckCode=f'0_{GEMARKUNG_1}_0_1'),
246 dict(uids=[_uid('fs', 1), _uid('fs', 3)]),
247 ]),
248 ('Area', [
249 dict(flaecheVon=10000, flaecheBis=10000),
250 dict(flaecheBis=9995),
251 dict(flaecheBis=9995, **HISTORY),
252 ]),
253 ('Search area', [
254 dict(shapes=[_point_props(250, 50)]),
255 dict(shapes=[_point_props(450, 50)]),
256 dict(shapes=[_point_props(50, 50), _point_props(650, 50)]),
257 ]),
258 ('Addresses', [
259 dict(strasse='Strasse1'),
260 dict(strasse='strasse1'),
261 dict(strasse='Str'),
262 dict(strasse='Gewann1'),
263 dict(strasse='Strasse1', hausnummer='1'),
264 dict(strasse='Strasse1', hausnummer='*'),
265 dict(strasse='Strasse2', hausnummer='10'),
266 dict(strasse='Strasse1', hausnummer='1a'),
267 dict(strasse='Strasse1', hausnummer='1a', **HISTORY),
268 dict(strasse='Strasse1', hausnummer='9'),
269 dict(strasse='Strasse3alt'),
270 dict(strasse='Strasse3alt', **HISTORY),
271 ]),
272 ('History', [
273 dict(gemarkungCode=GEMARKUNG_1, **HISTORY),
274 dict(gemarkungCode=GEMARKUNG_1, wantHistorySearch=True),
275 dict(gemeinde='Gemeinde1', **HISTORY),
276 dict(uids=[_uid('fs', 4)]),
277 dict(uids=[_uid('fs', 4)], **HISTORY),
278 ]),
279 ('Land register', [
280 dict(bblatt=_buchungsblattkennzeichen(1)),
281 dict(bblatt=_buchungsblattkennzeichen(2)),
282 dict(bblatt=_buchungsblattkennzeichen(3)),
283 dict(bblatt=f'{_buchungsblattkennzeichen(2)}, {_buchungsblattkennzeichen(4)}'),
284 dict(bblatt=_buchungsblattkennzeichen(4)),
285 dict(bblatt=_buchungsblattkennzeichen(4), **HISTORY),
286 ]),
287 ('Owners', [
288 dict(personName='Name1'),
289 dict(personName='name'),
290 dict(personName='Firma1'),
291 dict(personName='Name4'),
292 dict(personName='Name1', personVorname='Vorname1'),
293 dict(personName='Name1', personVorname='Vorname4'),
294 dict(personName='Name3'),
295 dict(personName='Name3', **HISTORY),
296 dict(personName='Geburtsname1'),
297 dict(personName='Geburtsname1', **HISTORY),
298 ]),
299 ],
300 ),
301 dict(
302 title='Find Flurstueck: errors',
303 command='alkisFindFlurstueck',
304 view='uids',
305 groups=[
306 ('', [
307 dict(hausnummer='1'),
308 dict(personVorname='Vorname1'),
309 dict(fsnummer='xyz'),
310 dict(gemarkungCode=GEMARKUNG_1, limit=1),
311 ]),
312 ('No access to owner and land register data in project B', [
313 dict(projectUid='B', personName='Name1'),
314 dict(projectUid='B', bblatt=_buchungsblattkennzeichen(1)),
315 dict(projectUid='B', zaehler='1', wantEigentuemer=True),
316 dict(projectUid='B', zaehler='1', displayThemes=['buchung']),
317 dict(projectUid='B', zaehler='1', displayThemes=['eigentuemer']),
318 ]),
319 ('Access to owner data, but not to land register data, in project D', [
320 dict(projectUid='D', personName='Name1'),
321 dict(projectUid='D', zaehler='1', wantEigentuemer=True),
322 dict(projectUid='D', zaehler='1', displayThemes=['eigentuemer']),
323 ]),
324 ],
325 ),
326 dict(
327 title='Find Flurstueck: other projects',
328 command='alkisFindFlurstueck',
329 view='uids',
330 groups=[
331 ('Project B: no access to owner and land register data, other searches work', [
332 dict(projectUid='B', zaehler='1'),
333 dict(projectUid='B', zaehler='1', displayThemes=['lage', 'gebaeude', 'nutzung']),
334 ]),
335 ('Project C: Gemarkung3 is excluded from the index, searches are restricted to Gemarkung1 and Gemarkung3', [
336 dict(projectUid='C', kreis='Kreis1'),
337 dict(projectUid='C', gemarkungCode=GEMARKUNG_2),
338 dict(projectUid='C', gemarkungCode=GEMARKUNG_3),
339 ]),
340 ],
341 ),
342 dict(
343 title='Find Flurstueck: geometry',
344 command='alkisFindFlurstueck',
345 view='geometry',
346 groups=[
347 ('', [
348 dict(uids=[_uid('fs', 3)]),
349 dict(uids=[_uid('fs', 3)], crs='EPSG:4326'),
350 ]),
351 ],
352 ),
353 dict(
354 title='Export Flurstueck',
355 command='alkisExportFlurstueck',
356 view='export',
357 text='Exporter `EXPORT` (GeoJSON), the fields are listed in `action_test.create_root`.',
358 groups=[
359 ('Parts', [
360 dict(exporterUid='EXPORT', findRequest=dict(
361 uids=[_uid('fs', 1), _uid('fs', 2), _uid('fs', 3)],
362 displayThemes=['nutzung', 'festlegung', 'bewertung'],
363 )),
364 ]),
365 ('Part and building properties', [
366 dict(exporterUid='EXPORT_PROPS', findRequest=dict(
367 uids=[_uid('fs', 1), _uid('fs', 3)],
368 displayThemes=['nutzung', 'bewertung', 'gebaeude'],
369 )),
370 ]),
371 ],
372 ),
373 dict(
374 title='Find Adresse',
375 command='alkisFindAdresse',
376 view='uids',
377 groups=[
378 ('', [
379 dict(strasse='Strasse'),
380 dict(strasse='Strasse1', hausnummer='1'),
381 dict(strasse='Strasse', hausnummerNotNull=True),
382 dict(strasse='Strasse1', hausnummer='*'),
383 ]),
384 ('House number ranges: 1, 2, 2b, 2e, 2f, 5a, 10', [
385 dict(strasse='Strasse', bisHausnummer='5'),
386 dict(strasse='Strasse', bisHausnummer='2a'),
387 dict(strasse='Strasse', hausnummer='2', bisHausnummer='10'),
388 dict(strasse='Strasse', hausnummer='2b', bisHausnummer='2e'),
389 dict(strasse='Strasse', hausnummer='2 B', bisHausnummer='2 E'),
390 dict(strasse='Strasse', hausnummer='2', bisHausnummer='2'),
391 dict(strasse='Strasse', hausnummer='2a', bisHausnummer='5'),
392 dict(strasse='Strasse', hausnummer='6', bisHausnummer='9'),
393 ]),
394 ('History and places', [
395 dict(strasse='Strasse1', hausnummer='1a'),
396 dict(strasse='Strasse1', hausnummer='1a', wantHistorySearch=True),
397 dict(strasse='Strasse3', gemeinde='Gemeinde2'),
398 dict(strasse='Strasse3', gemeinde='Gemeinde1'),
399 dict(strasse='Gewann'),
400 dict(combinedAdresseCode='Strasse1_1'),
401 ]),
402 ],
403 ),
404 dict(
405 title='Find Adresse: errors',
406 command='alkisFindAdresse',
407 view='uids',
408 groups=[
409 ('', [
410 dict(hausnummer='1'),
411 dict(strasse='Strasse', bisHausnummer='x'),
412 dict(strasse='Strasse', hausnummer='x', bisHausnummer='5'),
413 ]),
414 ],
415 ),
416 dict(
417 title='Get toponyms',
418 command='alkisGetToponyms',
419 view='toponyms',
420 groups=[
421 ('', [
422 dict(),
423 dict(projectUid='C'),
424 ]),
425 ],
426 ),
427]
428"""Test requests by section. A request without ``projectUid`` runs in project ``A``.
430The view selects the part of the response that is compared, see ``action_test.run_case``.
431"""
434def _tables_json():
435 """Convert the dataset into the ``tables`` structure returned by ``load``.
437 Columns that are empty in all rows are left out.
438 """
440 tables = {}
442 for name, (cols, rows) in _tables().items():
443 cols = _COMMON_COLUMNS | cols
444 cols = {c: typ for c, typ in cols.items() if any(r.get(c) is not None for r in rows)}
445 tables[name] = dict(
446 columns=cols,
447 rows=[{c: _str(r.get(c)) for c in cols} for r in rows],
448 )
450 return tables
453def _str(v):
454 if v is None:
455 return None
456 if isinstance(v, list):
457 return '{' + ', '.join(str(x) for x in v) + '}'
458 return str(v)
461def _render_tables(tables):
462 yield '# Source data'
463 yield ''
464 yield f'Schema `{SCHEMA}`. The header cells contain the column name and the column type. Empty cells are NULL, geometries are WKT in EPSG:{SRID}.'
465 yield ''
467 for name, tab in tables.items():
468 yield f'## Table {name}'
469 yield ''
471 header = [f'{c} {typ}' for c, typ in tab['columns'].items()]
472 body = [[r[c] or '' for c in tab['columns']] for r in tab['rows']]
473 widths = [max(len(s) for s in col) for col in zip(header, *body)]
475 def line(cells):
476 return '| ' + ' | '.join(s.ljust(w) for s, w in zip(cells, widths)) + ' |'
478 yield line(header)
479 yield '|' + '|'.join('-' * (w + 2) for w in widths) + '|'
480 for cells in body:
481 yield line(cells)
482 yield ''
485def _render_tests(root, run_case):
486 yield '# Tests'
487 yield ''
488 yield 'A request without `projectUid` runs in project `A`. Each case is the command with the request, the HTTP status and, if the status is 200, the expected response, prefixed with the view that selects the part of the response that is compared.'
489 yield ''
491 for sec in _TESTS:
492 yield f'## {sec["title"]}'
493 yield ''
494 if sec.get('text'):
495 yield sec['text']
496 yield ''
498 for group, requests in sec['groups']:
499 if group:
500 yield f'### {group}'
501 yield ''
503 texts = []
504 for request in requests:
505 case = dict(view=sec['view'], command=sec['command'], request=request)
506 status, response = run_case(root, case)
507 lines = [f'{sec["command"]} {_compact(request)}', str(status)]
508 if response is not None:
509 lines.append(sec['view'] + ' ' + _render_response(sec['view'], response))
510 texts.append('\n'.join(lines))
512 yield '```'
513 yield '\n\n'.join(texts)
514 yield '```'
515 yield ''
518def _render_response(view, response):
519 if view == 'toponyms':
520 lines = []
521 for k, vals in response.items():
522 lines.append(f' "{k}": ' + _render_list(vals, indent=' '))
523 return '{\n' + ',\n'.join(lines) + '\n}'
524 if view == 'export':
525 return _render_list(response)
526 return _compact(response)
529def _render_list(items, indent=''):
530 if not items:
531 return '[]'
532 return '[\n' + ',\n'.join(indent + ' ' + _compact(v) for v in items) + '\n' + indent + ']'
535def _parse_case(text, section, group):
536 lines = text.split('\n')
537 command, _, request = lines[0].partition(' ')
538 view = response = None
539 if len(lines) > 2:
540 view, _, first = lines[2].partition(' ')
541 response = json.loads('\n'.join([first, *lines[3:]]))
542 return dict(
543 section=section,
544 group=group,
545 command=command,
546 request=json.loads(request),
547 status=int(lines[1]),
548 view=view,
549 response=response,
550 )
553def _compact(v):
554 return json.dumps(v, ensure_ascii=False)
556##
559_COMMON_COLUMNS = {
560 'gml_id': 'character(16)',
561 'anlass': 'varchar[]',
562 'beginnt': 'character(20)',
563 'endet': 'character(20)',
564}
566_GEOM = f'geometry(Geometry, {SRID})'
569def _changed(gml_id, old=None, **row):
570 """Rows of an object with a historic version and a current version.
572 The historic version has the values of ``row`` updated with ``old``.
573 """
575 return [
576 dict(row, **(old or {}), gml_id=gml_id, beginnt=BEGIN_OLD, endet=BEGIN_NEW, anlass=[ANLASS_OLD]),
577 dict(row, gml_id=gml_id, beginnt=BEGIN_NEW, endet=None, anlass=[ANLASS_NEW]),
578 ]
581def _ended(gml_id, **row):
582 """Rows of an object that has ended."""
584 return [
585 dict(row, gml_id=gml_id, beginnt=BEGIN_OLD, endet=BEGIN_NEW, anlass=[ANLASS_OLD, ANLASS_END]),
586 ]
589def _box(x1, y1, x2, y2):
590 """Polygon in local coordinates, relative to ``X0``, ``Y0``."""
592 x1, y1, x2, y2 = X0 + x1, Y0 + y1, X0 + x2, Y0 + y2
593 return f'POLYGON(({x1} {y1}, {x2} {y1}, {x2} {y2}, {x1} {y2}, {x1} {y1}))'
596def _point(x, y):
597 """Point in local coordinates, relative to ``X0``, ``Y0``."""
599 return f'POINT({X0 + x} {Y0 + y})'
602def _fs_box(n):
603 """Geometry of ``fs n``."""
605 return _box((n - 1) * 100, 0, n * 100, 100)
608def _tables():
609 return {
610 'ax_bundesland': _ax_bundesland(),
611 'ax_regierungsbezirk': _ax_regierungsbezirk(),
612 'ax_kreisregion': _ax_kreisregion(),
613 'ax_gemeinde': _ax_gemeinde(),
614 'ax_gemarkung': _ax_gemarkung(),
615 'ax_buchungsblattbezirk': _ax_buchungsblattbezirk(),
616 'ax_dienststelle': _ax_dienststelle(),
618 'ax_lagebezeichnungkatalogeintrag': _ax_lagebezeichnungkatalogeintrag(),
619 'ax_lagebezeichnungmithausnummer': _ax_lagebezeichnungmithausnummer(),
620 'ax_lagebezeichnungohnehausnummer': _ax_lagebezeichnungohnehausnummer(),
621 'ap_pto': _ap_pto(),
622 'ax_gebaeude': _ax_gebaeude(),
624 'ax_anschrift': _ax_anschrift(),
625 'ax_person': _ax_person(),
626 'ax_namensnummer': _ax_namensnummer(),
627 'ax_buchungsblatt': _ax_buchungsblatt(),
628 'ax_buchungsstelle': _ax_buchungsstelle(),
630 'ax_flurstueck': _ax_flurstueck(),
631 'ax_historischesflurstueck': _ax_historischesflurstueck(),
633 'ax_wohnbauflaeche': _ax_wohnbauflaeche(),
634 'ax_strassenverkehr': _ax_strassenverkehr(),
635 'ax_bodenschaetzung': _ax_bodenschaetzung(),
636 'ax_denkmalschutzrecht': _ax_denkmalschutzrecht(),
637 }
640##
642_PLACE_COLUMNS = {
643 'bezeichnung': 'varchar',
644 'schluesselgesamt': 'varchar',
645}
648def _ax_bundesland():
649 cols = _PLACE_COLUMNS | {
650 'land': 'varchar',
651 }
652 rows = [
653 *_changed(_uid('land', 1), old=dict(bezeichnung='Land1alt'), bezeichnung='Land1', land=LAND, schluesselgesamt=LAND),
654 ]
655 return cols, rows
658def _ax_regierungsbezirk():
659 cols = _PLACE_COLUMNS | {
660 'land': 'varchar',
661 'regierungsbezirk': 'varchar',
662 }
663 rows = [
664 *_changed(
665 _uid('rb', 1),
666 old=dict(bezeichnung='Regierungsbezirk1alt'),
667 bezeichnung='Regierungsbezirk1',
668 land=LAND,
669 regierungsbezirk=REGIERUNGSBEZIRK,
670 schluesselgesamt=LAND + REGIERUNGSBEZIRK,
671 ),
672 ]
673 return cols, rows
676def _ax_kreisregion():
677 cols = _PLACE_COLUMNS | {
678 'land': 'varchar',
679 'regierungsbezirk': 'varchar',
680 'kreis': 'varchar',
681 }
682 rows = [
683 *_changed(
684 _uid('kreis', 1),
685 old=dict(bezeichnung='Kreis1alt'),
686 bezeichnung='Kreis1',
687 land=LAND,
688 regierungsbezirk=REGIERUNGSBEZIRK,
689 kreis=KREIS,
690 schluesselgesamt=LAND + REGIERUNGSBEZIRK + KREIS,
691 ),
692 ]
693 return cols, rows
696def _ax_gemeinde():
697 cols = _PLACE_COLUMNS | {
698 'land': 'varchar',
699 'regierungsbezirk': 'varchar',
700 'kreis': 'varchar',
701 'gemeinde': 'varchar',
702 }
704 def row(n, code):
705 return dict(
706 bezeichnung=f'Gemeinde{n}',
707 land=LAND,
708 regierungsbezirk=REGIERUNGSBEZIRK,
709 kreis=KREIS,
710 gemeinde=code,
711 schluesselgesamt=LAND + REGIERUNGSBEZIRK + KREIS + code,
712 )
714 rows = [
715 *_changed(_uid('gem', 1), old=dict(bezeichnung='Gemeinde1alt'), **row(1, GEMEINDE_1)),
716 *_changed(_uid('gem', 2), old=dict(bezeichnung='Gemeinde2alt'), **row(2, GEMEINDE_2)),
717 *_ended(_uid('gem', 3), **row(3, GEMEINDE_3)),
718 ]
719 return cols, rows
722def _ax_gemarkung():
723 cols = _PLACE_COLUMNS | {
724 'land': 'varchar',
725 'gemarkungsnummer': 'varchar',
726 'gemeindezugehoerigkeit_land': 'varchar[]',
727 'gemeindezugehoerigkeit_regierungsbezirk': 'varchar[]',
728 'gemeindezugehoerigkeit_kreis': 'varchar[]',
729 'gemeindezugehoerigkeit_gemeinde': 'varchar[]',
730 }
732 def row(n, code, gemeinde):
733 return dict(
734 bezeichnung=f'Gemarkung{n}',
735 land=LAND,
736 gemarkungsnummer=code,
737 schluesselgesamt=LAND + code,
738 gemeindezugehoerigkeit_land=[LAND],
739 gemeindezugehoerigkeit_regierungsbezirk=[REGIERUNGSBEZIRK],
740 gemeindezugehoerigkeit_kreis=[KREIS],
741 gemeindezugehoerigkeit_gemeinde=[gemeinde],
742 )
744 rows = [
745 *_changed(_uid('gemkg', 1), old=dict(bezeichnung='Gemarkung1alt'), **row(1, GEMARKUNG_1, GEMEINDE_1)),
746 *_changed(_uid('gemkg', 2), old=dict(bezeichnung='Gemarkung2alt'), **row(2, GEMARKUNG_2, GEMEINDE_2)),
747 *_changed(_uid('gemkg', 3), old=dict(bezeichnung='Gemarkung3alt'), **row(3, GEMARKUNG_3, GEMEINDE_1)),
748 ]
749 return cols, rows
752def _ax_buchungsblattbezirk():
753 cols = _PLACE_COLUMNS | {
754 'land': 'varchar',
755 'bezirk': 'varchar',
756 'gehoertzu_land': 'varchar',
757 'gehoertzu_stelle': 'varchar',
758 }
759 rows = [
760 *_changed(
761 _uid('bbbez', 1),
762 old=dict(bezeichnung='Buchungsblattbezirk1alt'),
763 bezeichnung='Buchungsblattbezirk1',
764 land=LAND,
765 bezirk=BEZIRK,
766 schluesselgesamt=LAND + BEZIRK,
767 gehoertzu_land=LAND,
768 gehoertzu_stelle=STELLE,
769 ),
770 ]
771 return cols, rows
774def _ax_dienststelle():
775 cols = _PLACE_COLUMNS | {
776 'land': 'varchar',
777 'stelle': 'varchar',
778 'stellenart': 'integer',
779 }
780 rows = [
781 *_changed(
782 _uid('dst', 1),
783 old=dict(bezeichnung='Dienststelle1alt'),
784 bezeichnung='Dienststelle1',
785 land=LAND,
786 stelle=STELLE,
787 schluesselgesamt=LAND + STELLE,
788 stellenart=1100,
789 ),
790 ]
791 return cols, rows
794##
796_LAGE_KEY_COLUMNS = {
797 'land': 'varchar',
798 'regierungsbezirk': 'varchar',
799 'kreis': 'varchar',
800 'gemeinde': 'varchar',
801 'lage': 'varchar',
802}
805def _lage_key(gemeinde, lage):
806 return dict(land=LAND, regierungsbezirk=REGIERUNGSBEZIRK, kreis=KREIS, gemeinde=gemeinde, lage=lage)
809def _ax_lagebezeichnungkatalogeintrag():
810 cols = _LAGE_KEY_COLUMNS | {
811 'bezeichnung': 'varchar',
812 'schluesselgesamt': 'varchar',
813 }
814 rows = [
815 *_changed(
816 _uid('kat', 1),
817 old=dict(bezeichnung='Strasse1alt'),
818 bezeichnung='Strasse1',
819 schluesselgesamt=LAND + REGIERUNGSBEZIRK + KREIS + GEMEINDE_1 + LAGE_1,
820 **_lage_key(GEMEINDE_1, LAGE_1),
821 ),
822 *_changed(
823 _uid('kat', 2),
824 old=dict(bezeichnung='Strasse2alt'),
825 bezeichnung='Strasse2',
826 schluesselgesamt=LAND + REGIERUNGSBEZIRK + KREIS + GEMEINDE_1 + LAGE_2,
827 **_lage_key(GEMEINDE_1, LAGE_2),
828 ),
829 ]
830 return cols, rows
833def _ax_lagebezeichnungmithausnummer():
834 cols = _LAGE_KEY_COLUMNS | {
835 'unverschluesselt': 'varchar',
836 'hausnummer': 'varchar',
837 'ortsteil': 'varchar',
838 }
839 rows = [
840 *_changed(_uid('lmh', 1), old=dict(hausnummer='1a'), hausnummer='1', **_lage_key(GEMEINDE_1, LAGE_1)),
841 *_changed(_uid('lmh', 2), old=dict(hausnummer='12'), hausnummer='10', **_lage_key(GEMEINDE_1, LAGE_2)),
842 *_changed(_uid('lmh', 5), hausnummer='2', **_lage_key(GEMEINDE_1, LAGE_2)),
843 *_changed(_uid('lmh', 6), hausnummer='2e', **_lage_key(GEMEINDE_1, LAGE_2)),
844 *_changed(_uid('lmh', 7), hausnummer='2f', **_lage_key(GEMEINDE_1, LAGE_2)),
845 *_changed(_uid('lmh', 8), hausnummer='5a', **_lage_key(GEMEINDE_1, LAGE_2)),
846 *_changed(_uid('lmh', 3), old=dict(unverschluesselt='Strasse3alt'), unverschluesselt='Strasse3', hausnummer='2b', ortsteil='Ortsteil1'),
847 *_ended(_uid('lmh', 4), hausnummer='9', **_lage_key(GEMEINDE_1, LAGE_1)),
848 ]
849 return cols, rows
852def _ax_lagebezeichnungohnehausnummer():
853 cols = _LAGE_KEY_COLUMNS | {
854 'unverschluesselt': 'varchar',
855 'zusatzzurlagebezeichnung': 'varchar',
856 'ortsteil': 'varchar',
857 }
858 rows = [
859 *_changed(_uid('loh', 1), old=dict(zusatzzurlagebezeichnung='Zusatz1'), **_lage_key(GEMEINDE_1, LAGE_1)),
860 *_changed(_uid('loh', 2), old=dict(unverschluesselt='Gewann1alt'), unverschluesselt='Gewann1'),
861 ]
862 return cols, rows
865def _ap_pto():
866 cols = {
867 'art': 'varchar',
868 'schriftinhalt': 'varchar',
869 'dientzurdarstellungvon': 'character(16)[]',
870 'wkb_geometry': _GEOM,
871 }
872 rows = [
873 *_changed(_uid('pto', 1), old=dict(wkb_geometry=_point(20, 20)), art='HNR', dientzurdarstellungvon=[_uid('lmh', 1)], wkb_geometry=_point(10, 10)),
874 *_changed(_uid('pto', 2), art='HNR', dientzurdarstellungvon=[_uid('lmh', 2)], wkb_geometry=_point(150, 10)),
875 *_changed(_uid('pto', 3), art='Strasse', schriftinhalt='Strasse3', dientzurdarstellungvon=[_uid('lmh', 3)], wkb_geometry=_point(250, 10)),
876 *_ended(_uid('pto', 4), art='HNR', dientzurdarstellungvon=[_uid('lmh', 4)], wkb_geometry=_point(90, 90)),
877 ]
878 return cols, rows
881def _ax_gebaeude():
882 cols = {
883 'gebaeudefunktion': 'integer',
884 'name': 'varchar[]',
885 'grundflaeche': 'double precision',
886 'anzahlderoberirdischengeschosse': 'integer',
887 'baujahr': 'integer[]',
888 'hoehe': 'double precision[]',
889 'obererbezugspunkt': 'integer[]',
890 'untererbezugspunkt': 'integer[]',
891 'gebaeudekennzeichen': 'varchar',
892 'zeigtauf': 'character(16)[]',
893 'wkb_geometry': _GEOM,
894 }
895 rows = [
896 *_changed(
897 _uid('geb', 1),
898 old=dict(grundflaeche=60, anzahlderoberirdischengeschosse=1),
899 gebaeudefunktion=1000,
900 name=['Gebaeude1'],
901 grundflaeche=80,
902 anzahlderoberirdischengeschosse=2,
903 baujahr=[2000],
904 hoehe=[7.5, 9.0],
905 obererbezugspunkt=[1000, 1100],
906 untererbezugspunkt=[2000, 2000],
907 zeigtauf=[_uid('lmh', 1)],
908 wkb_geometry=_box(10, 10, 20, 20),
909 ),
910 *_ended(
911 _uid('geb', 2),
912 gebaeudefunktion=2000,
913 grundflaeche=30,
914 zeigtauf=[_uid('lmh', 1)],
915 wkb_geometry=_box(30, 30, 35, 36),
916 ),
917 *_changed(
918 _uid('geb', 3),
919 old=dict(gebaeudefunktion=1000),
920 gebaeudefunktion=1010,
921 zeigtauf=[_uid('lmh', 2)],
922 wkb_geometry=_box(110, 10, 130, 30),
923 ),
924 ]
925 return cols, rows
928##
931def _ax_anschrift():
932 cols = {
933 'strasse': 'varchar',
934 'hausnummer': 'varchar',
935 'postleitzahlpostzustellung': 'varchar',
936 'ort_post': 'varchar',
937 'ort_amtlichesortsnamensverzeichnis': 'varchar',
938 'ortsteil': 'varchar',
939 'bestimmungsland': 'varchar',
940 'telefon': 'varchar[]',
941 }
942 rows = [
943 *_changed(
944 _uid('ans', 1),
945 old=dict(strasse='Strasse5', hausnummer='5'),
946 strasse='Strasse4',
947 hausnummer='4',
948 postleitzahlpostzustellung='00001',
949 ort_post='Ort1',
950 telefon=['Telefon1'],
951 ),
952 *_changed(
953 _uid('ans', 2),
954 old=dict(postleitzahlpostzustellung='00003'),
955 strasse='Strasse6',
956 hausnummer='6',
957 postleitzahlpostzustellung='00002',
958 ort_amtlichesortsnamensverzeichnis='Ort2',
959 ort_post='Ort2post',
960 ),
961 *_ended(_uid('ans', 3), strasse='Strasse7', hausnummer='7', postleitzahlpostzustellung='00003', ort_post='Ort3'),
962 ]
963 return cols, rows
966def _ax_person():
967 cols = {
968 'anrede': 'integer',
969 'akademischergrad': 'varchar',
970 'nachnameoderfirma': 'varchar',
971 'vorname': 'varchar',
972 'geburtsname': 'varchar',
973 'geburtsdatum': 'date',
974 'wohnortodersitz': 'varchar',
975 'hat': 'character(16)[]',
976 }
977 rows = [
978 *_changed(
979 _uid('pers', 1),
980 old=dict(nachnameoderfirma='Geburtsname1', akademischergrad=None),
981 anrede=1000,
982 akademischergrad='Grad1',
983 nachnameoderfirma='Name1',
984 vorname='Vorname1',
985 geburtsname='Geburtsname1',
986 geburtsdatum='1970-01-01',
987 hat=[_uid('ans', 1)],
988 ),
989 *_changed(
990 _uid('pers', 2),
991 old=dict(nachnameoderfirma='Firma1alt'),
992 anrede=3000,
993 nachnameoderfirma='Firma1',
994 wohnortodersitz='Ort2',
995 hat=[_uid('ans', 2)],
996 ),
997 *_ended(
998 _uid('pers', 3),
999 anrede=2000,
1000 nachnameoderfirma='Name3',
1001 vorname='Vorname3',
1002 geburtsdatum='1950-01-01',
1003 hat=[_uid('ans', 3)],
1004 ),
1005 *_changed(
1006 _uid('pers', 4),
1007 old=dict(vorname='Vorname4alt'),
1008 anrede=2000,
1009 nachnameoderfirma='Name4',
1010 vorname='Vorname4',
1011 ),
1012 ]
1013 return cols, rows
1016def _ax_namensnummer():
1017 cols = {
1018 'laufendenummernachdin1421': 'varchar',
1019 'nummer': 'varchar',
1020 'zaehler': 'double precision',
1021 'nenner': 'double precision',
1022 'eigentuemerart': 'integer',
1023 'artderrechtsgemeinschaft': 'integer',
1024 'beschriebderrechtsgemeinschaft': 'varchar',
1025 'istbestandteilvon': 'character(16)',
1026 'benennt': 'character(16)',
1027 }
1028 rows = [
1029 *_changed(
1030 _uid('nn', 1),
1031 old=dict(zaehler=1, nenner=1),
1032 laufendenummernachdin1421='0001',
1033 zaehler=1,
1034 nenner=2,
1035 eigentuemerart=1000,
1036 istbestandteilvon=_uid('bb', 1),
1037 benennt=_uid('pers', 1),
1038 ),
1039 *_changed(
1040 _uid('nn', 2),
1041 old=dict(eigentuemerart=1000),
1042 laufendenummernachdin1421='0002',
1043 zaehler=1,
1044 nenner=2,
1045 eigentuemerart=1100,
1046 istbestandteilvon=_uid('bb', 1),
1047 benennt=_uid('pers', 2),
1048 ),
1049 *_ended(
1050 _uid('nn', 3),
1051 laufendenummernachdin1421='0003',
1052 zaehler=1,
1053 nenner=1,
1054 eigentuemerart=1000,
1055 istbestandteilvon=_uid('bb', 1),
1056 benennt=_uid('pers', 3),
1057 ),
1058 *_changed(
1059 _uid('nn', 4),
1060 laufendenummernachdin1421='0001',
1061 eigentuemerart=1000,
1062 istbestandteilvon=_uid('bb', 2),
1063 benennt=_uid('pers', 4),
1064 ),
1065 *_changed(
1066 _uid('nn', 5),
1067 old=dict(beschriebderrechtsgemeinschaft='Rechtsgemeinschaft1alt'),
1068 laufendenummernachdin1421='0001',
1069 artderrechtsgemeinschaft=1000,
1070 beschriebderrechtsgemeinschaft='Rechtsgemeinschaft1',
1071 istbestandteilvon=_uid('bb', 3),
1072 ),
1073 *_changed(
1074 _uid('nn', 6),
1075 laufendenummernachdin1421='0001.01',
1076 zaehler=1,
1077 nenner=3,
1078 eigentuemerart=1000,
1079 istbestandteilvon=_uid('bb', 3),
1080 benennt=_uid('pers', 1),
1081 ),
1082 ]
1083 return cols, rows
1086def _ax_buchungsblatt():
1087 cols = {
1088 'land': 'varchar',
1089 'bezirk': 'varchar',
1090 'buchungsblattkennzeichen': 'varchar',
1091 'buchungsblattnummermitbuchstabenerweiterung': 'varchar',
1092 'blattart': 'integer',
1093 }
1095 def row(n, blattart=1000):
1096 return dict(
1097 land=LAND,
1098 bezirk=BEZIRK,
1099 buchungsblattkennzeichen=_buchungsblattkennzeichen(n),
1100 buchungsblattnummermitbuchstabenerweiterung=f'{n:06d}',
1101 blattart=blattart,
1102 )
1104 rows = [
1105 *_changed(_uid('bb', 1), old=dict(blattart=2000), **row(1)),
1106 *_changed(_uid('bb', 2), **row(2)),
1107 *_changed(_uid('bb', 3), old=dict(blattart=3000), **row(3)),
1108 *_ended(_uid('bb', 4), **row(4)),
1109 ]
1110 return cols, rows
1113def _ax_buchungsstelle():
1114 cols = {
1115 'laufendenummer': 'varchar',
1116 'buchungsart': 'integer',
1117 'zaehler': 'double precision',
1118 'nenner': 'double precision',
1119 'buchungstext': 'varchar',
1120 'beschreibungdessondereigentums': 'varchar',
1121 'beschreibungdesumfangsderbuchung': 'varchar',
1122 'istbestandteilvon': 'character(16)',
1123 'an': 'character(16)[]',
1124 'zu': 'character(16)[]',
1125 }
1126 rows = [
1127 *_changed(
1128 _uid('bs', 1),
1129 old=dict(buchungstext='Buchungstext1alt'),
1130 laufendenummer='0001',
1131 buchungsart=1100,
1132 buchungstext='Buchungstext1',
1133 istbestandteilvon=_uid('bb', 1),
1134 ),
1135 *_changed(
1136 _uid('bs', 2),
1137 old=dict(buchungsart=2102),
1138 laufendenummer='0001',
1139 buchungsart=2101,
1140 istbestandteilvon=_uid('bb', 2),
1141 an=[_uid('bs', 1)],
1142 ),
1143 *_changed(
1144 _uid('bs', 3),
1145 old=dict(zaehler=1, nenner=2),
1146 laufendenummer='0001',
1147 buchungsart=1301,
1148 zaehler=1,
1149 nenner=4,
1150 beschreibungdessondereigentums='Sondereigentum1',
1151 istbestandteilvon=_uid('bb', 3),
1152 zu=[_uid('bs', 2)],
1153 ),
1154 *_changed(
1155 _uid('bs', 4),
1156 old=dict(laufendenummer='0010'),
1157 laufendenummer='0002',
1158 buchungsart=1100,
1159 istbestandteilvon=_uid('bb', 1),
1160 ),
1161 *_ended(
1162 _uid('bs', 5),
1163 laufendenummer='0003',
1164 buchungsart=1100,
1165 istbestandteilvon=_uid('bb', 1),
1166 ),
1167 *_ended(
1168 _uid('bs', 6),
1169 laufendenummer='0001',
1170 buchungsart=1100,
1171 istbestandteilvon=_uid('bb', 4),
1172 ),
1173 ]
1174 return cols, rows
1177##
1179_FS_COLUMNS = {
1180 'flurstueckskennzeichen': 'varchar',
1181 'amtlicheflaeche': 'double precision',
1182 'flurnummer': 'integer',
1183 'zaehler': 'varchar',
1184 'nenner': 'varchar',
1185 'flurstuecksfolge': 'varchar',
1186 'land': 'varchar',
1187 'gemarkungsnummer': 'varchar',
1188 'gemeindezugehoerigkeit_land': 'varchar',
1189 'gemeindezugehoerigkeit_regierungsbezirk': 'varchar',
1190 'gemeindezugehoerigkeit_kreis': 'varchar',
1191 'gemeindezugehoerigkeit_gemeinde': 'varchar',
1192 'abweichenderrechtszustand': 'varchar',
1193 'zweifelhafterflurstuecksnachweis': 'varchar',
1194 'rechtsbehelfsverfahren': 'varchar',
1195 'zeitpunktderentstehung': 'date',
1196 'wkb_geometry': _GEOM,
1197}
1200def _fs_row(n, gemarkung, gemeinde, flur, zaehler, nenner=0, folge='', geom=True):
1201 return dict(
1202 flurstueckskennzeichen=_flurstueckskennzeichen(gemarkung, flur, zaehler, nenner, folge),
1203 amtlicheflaeche=10000,
1204 flurnummer=flur,
1205 zaehler=str(zaehler),
1206 nenner=str(nenner) if nenner else None,
1207 flurstuecksfolge=folge or None,
1208 land=LAND,
1209 gemarkungsnummer=gemarkung,
1210 gemeindezugehoerigkeit_land=LAND,
1211 gemeindezugehoerigkeit_regierungsbezirk=REGIERUNGSBEZIRK,
1212 gemeindezugehoerigkeit_kreis=KREIS,
1213 gemeindezugehoerigkeit_gemeinde=gemeinde,
1214 zeitpunktderentstehung='2000-01-01',
1215 wkb_geometry=_fs_box(n) if geom else None,
1216 )
1219def _ax_flurstueck():
1220 cols = _FS_COLUMNS | {
1221 'zustaendigestelle_land': 'varchar[]',
1222 'zustaendigestelle_stelle': 'varchar[]',
1223 'istgebucht': 'character(16)',
1224 'zeigtauf': 'character(16)[]',
1225 'weistauf': 'character(16)[]',
1226 }
1227 rows = [
1228 *_changed(
1229 _uid('fs', 1),
1230 old=dict(amtlicheflaeche=9990, istgebucht=_uid('bs', 5), weistauf=[_uid('lmh', 4)]),
1231 **_fs_row(1, GEMARKUNG_1, GEMEINDE_1, 1, 1),
1232 zustaendigestelle_land=[LAND],
1233 zustaendigestelle_stelle=[STELLE],
1234 istgebucht=_uid('bs', 1),
1235 weistauf=[_uid('lmh', 1), _uid('lmh', 4)],
1236 zeigtauf=[_uid('loh', 1)],
1237 ),
1238 *_changed(
1239 _uid('fs', 2),
1240 old=dict(abweichenderrechtszustand='true'),
1241 **_fs_row(2, GEMARKUNG_1, GEMEINDE_1, 1, 2, nenner=1),
1242 istgebucht=_uid('bs', 3),
1243 weistauf=[_uid('lmh', 2), _uid('lmh', 5), _uid('lmh', 6), _uid('lmh', 7), _uid('lmh', 8)],
1244 ),
1245 *_changed(
1246 _uid('fs', 3),
1247 old=dict(gemeindezugehoerigkeit_gemeinde=GEMEINDE_1),
1248 **_fs_row(3, GEMARKUNG_2, GEMEINDE_2, 2, 3, nenner=2, folge='01'),
1249 istgebucht=_uid('bs', 4),
1250 weistauf=[_uid('lmh', 3)],
1251 zeigtauf=[_uid('loh', 2)],
1252 ),
1253 *_ended(
1254 _uid('fs', 4),
1255 **_fs_row(4, GEMARKUNG_1, GEMEINDE_1, 1, 4),
1256 istgebucht=_uid('bs', 6),
1257 ),
1258 *_changed(
1259 _uid('fs', 5),
1260 **_fs_row(5, GEMARKUNG_1, GEMEINDE_3, 1, 5),
1261 ),
1262 *_changed(
1263 _uid('fs', 6),
1264 **_fs_row(6, GEMARKUNG_1, GEMEINDE_1, 1, 6, geom=False),
1265 ),
1266 *_changed(
1267 _uid('fs', 7),
1268 old=dict(amtlicheflaeche=10010),
1269 **_fs_row(7, GEMARKUNG_3, GEMEINDE_1, 3, 7),
1270 ),
1271 ]
1272 return cols, rows
1275def _ax_historischesflurstueck():
1276 cols = _FS_COLUMNS | {
1277 'nachfolgerflurstueckskennzeichen': 'varchar[]',
1278 'zeitpunktderhistorisierung': 'date',
1279 'blattart': 'integer[]',
1280 'buchungsart': 'varchar[]',
1281 'buchungsblattbezirk_land': 'varchar[]',
1282 'buchungsblattbezirk_bezirk': 'varchar[]',
1283 'buchungsblattkennzeichen': 'varchar[]',
1284 'buchungsblattnummermitbuchstabenerweiterung': 'varchar[]',
1285 'laufendenummerderbuchungsstelle': 'varchar[]',
1286 }
1287 rows = [
1288 dict(
1289 gml_id=_uid('hfs', 1),
1290 beginnt=BEGIN_OLD,
1291 anlass=[ANLASS_OLD],
1292 **_fs_row(8, GEMARKUNG_1, GEMEINDE_1, 1, 8),
1293 zeitpunktderhistorisierung='2025-06-01',
1294 nachfolgerflurstueckskennzeichen=[
1295 _flurstueckskennzeichen(GEMARKUNG_1, 1, 1),
1296 _flurstueckskennzeichen(GEMARKUNG_1, 1, 2, nenner=1),
1297 _flurstueckskennzeichen(GEMARKUNG_1, 1, 99),
1298 ],
1299 blattart=[1000, 1000],
1300 buchungsart=['1100', '1100'],
1301 buchungsblattbezirk_land=[LAND, LAND],
1302 buchungsblattbezirk_bezirk=[BEZIRK, BEZIRK],
1303 buchungsblattkennzeichen=[_buchungsblattkennzeichen(4), _buchungsblattkennzeichen(1)],
1304 buchungsblattnummermitbuchstabenerweiterung=[f'{4:06d}', f'{1:06d}'],
1305 laufendenummerderbuchungsstelle=['0001', '0009'],
1306 ),
1307 dict(
1308 gml_id=_uid('hfs', 2),
1309 beginnt=BEGIN_OLD,
1310 anlass=[ANLASS_OLD],
1311 **_fs_row(9, GEMARKUNG_1, GEMEINDE_1, 1, 9),
1312 zeitpunktderhistorisierung='2025-06-01',
1313 nachfolgerflurstueckskennzeichen=[_flurstueckskennzeichen(GEMARKUNG_1, 1, 1)],
1314 ),
1315 ]
1316 return cols, rows
1319##
1321_PART_COLUMNS = {
1322 'wkb_geometry': _GEOM,
1323}
1326def _ax_wohnbauflaeche():
1327 cols = _PART_COLUMNS | {
1328 'artderbebauung': 'integer',
1329 'funktion': 'integer',
1330 'zustand': 'integer',
1331 'name': 'varchar',
1332 }
1333 rows = [
1334 *_changed(
1335 _uid('wohn', 1),
1336 old=dict(wkb_geometry=_box(0, 0, 100, 100), artderbebauung=2000),
1337 artderbebauung=1000,
1338 funktion=1200,
1339 name='Wohnbauflaeche1',
1340 wkb_geometry=_box(0, 0, 200, 100),
1341 ),
1342 ]
1343 return cols, rows
1346def _ax_strassenverkehr():
1347 cols = _PART_COLUMNS | _LAGE_KEY_COLUMNS | {
1348 'funktion': 'integer',
1349 'unverschluesselt': 'varchar',
1350 'zweitname': 'varchar',
1351 }
1352 rows = [
1353 *_changed(
1354 _uid('str', 1),
1355 old=dict(funktion=2312),
1356 funktion=2311,
1357 unverschluesselt='Strasse3',
1358 wkb_geometry=_box(200, 0, 300, 100),
1359 ),
1360 *_ended(
1361 _uid('str', 2),
1362 funktion=2311,
1363 wkb_geometry=_box(200, 50, 300, 100),
1364 **_lage_key(GEMEINDE_1, LAGE_1),
1365 ),
1366 ]
1367 return cols, rows
1370def _ax_bodenschaetzung():
1371 cols = _PART_COLUMNS | {
1372 'ackerzahlodergruenlandzahl': 'varchar',
1373 'bodenzahlodergruenlandgrundzahl': 'varchar',
1374 'bodenart': 'integer',
1375 'nutzungsart': 'integer',
1376 'zustandsstufe': 'integer',
1377 'bodenstufe': 'integer',
1378 'klimastufe': 'integer',
1379 'wasserverhaeltnisse': 'integer',
1380 'entstehungsart': 'integer[]',
1381 'jahreszahl': 'integer',
1382 }
1383 rows = [
1384 *_changed(
1385 _uid('bod', 1),
1386 old=dict(ackerzahlodergruenlandzahl='40'),
1387 ackerzahlodergruenlandzahl='45',
1388 bodenzahlodergruenlandgrundzahl='50',
1389 bodenart=2100,
1390 nutzungsart=1000,
1391 zustandsstufe=1200,
1392 bodenstufe=2200,
1393 klimastufe=6100,
1394 wasserverhaeltnisse=7100,
1395 entstehungsart=[1000],
1396 jahreszahl=1950,
1397 wkb_geometry=_box(200, 0, 250, 100),
1398 ),
1399 ]
1400 return cols, rows
1403def _ax_denkmalschutzrecht():
1404 cols = _PART_COLUMNS | {
1405 'artderfestlegung': 'integer',
1406 'land': 'varchar',
1407 'stelle': 'varchar',
1408 'bezeichnung': 'varchar',
1409 'name': 'varchar',
1410 }
1411 rows = [
1412 *_changed(
1413 _uid('denk', 1),
1414 old=dict(artderfestlegung=2700),
1415 artderfestlegung=2711,
1416 name='Denkmal1',
1417 land=LAND,
1418 stelle=STELLE,
1419 wkb_geometry=_box(50, 0, 100.005, 50),
1420 ),
1421 ]
1422 return cols, rows
1425if __name__ == '__main__':
1426 generate(sys.argv[1])