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

1"""ALKIS test dataset. 

2 

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. 

6 

7Most objects have two versions: a historic one (``endet`` set) and a current 

8one. Some objects only have an ended version. 

9 

10Places: 

11 

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 

16 

17Flurstuecke (100 x 100 m squares, in a row along the x axis): 

18 

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 

28 

29Land register: 

30 

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) 

35 

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``. 

39 

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:: 

45 

46 python3 /gws-app/gws/plugin/alkis/_test/data.py <base dir> > data.md 

47 

48where ``<base dir>`` is ``runner.base_dir`` of the test harness. 

49""" 

50 

51import contextlib 

52import json 

53import os 

54import sys 

55 

56import gws 

57import gws.test.util as u 

58 

59SCHEMA = 'alkis_test' 

60 

61SRID = 25832 

62 

63X0 = 400000 

64Y0 = 5700000 

65 

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.""" 

70 

71ANLASS_OLD = '010101' 

72ANLASS_NEW = '010102' 

73ANLASS_END = '300500' 

74ANLASS_NONE = '000000' 

75 

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' 

89 

90HISTORY = dict(wantHistorySearch=True, wantHistoryDisplay=True) 

91 

92MD_PATH = os.path.dirname(__file__) + '/data.md' 

93 

94 

95def _uid(kind: str, n: int) -> str: 

96 """Return the 16-character ``gml_id`` of a test object, e.g. ``_uid('fs', 1)`` -> ``DEFS000000000001``.""" 

97 

98 s = 'DE' + kind.upper() 

99 return s + str(n).zfill(16 - len(s)) 

100 

101 

102def _flurstueckskennzeichen(gemarkung: str, flur: int, zaehler: int, nenner: int = 0, folge: str = '') -> str: 

103 """Return a Flurstueckskennzeichen in the ALKIS format.""" 

104 

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 ) 

113 

114 

115def _buchungsblattkennzeichen(n: int) -> str: 

116 """Return the Buchungsblattkennzeichen of ``bb n``.""" 

117 

118 return LAND + BEZIRK + f'{n:06d}' 

119 

120 

121def generate(base_dir: str): 

122 """Create the dataset in the test database, run the test requests and print ``data.md`` to stdout. 

123 

124 Args: 

125 base_dir: ``runner.base_dir`` of the test harness. 

126 """ 

127 

128 from gws.plugin.alkis._test import action_test 

129 

130 u.load_options(base_dir) 

131 gws.u.ensure_system_dirs() 

132 gws.log.set_level('ERROR') 

133 

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 ] 

142 

143 sys.stdout.write('\n'.join(lines).rstrip() + '\n') 

144 

145 

146def load(path: str = MD_PATH) -> dict: 

147 """Read ``data.md``. 

148 

149 Args: 

150 path: Path to the markdown file. 

151 

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 """ 

159 

160 tables = {} 

161 cases = [] 

162 

163 part = '' 

164 section = '' 

165 group = '' 

166 table = None 

167 block = None 

168 

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 

178 

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 

195 

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)}) 

204 

205 return dict(tables=tables, cases=cases) 

206 

207 

208## 

209 

210def _point_props(x, y): 

211 return {'crs': f'EPSG:{SRID}', 'geometry': {'type': 'Point', 'coordinates': [X0 + x, Y0 + y]}} 

212 

213 

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``. 

429 

430The view selects the part of the response that is compared, see ``action_test.run_case``. 

431""" 

432 

433 

434def _tables_json(): 

435 """Convert the dataset into the ``tables`` structure returned by ``load``. 

436 

437 Columns that are empty in all rows are left out. 

438 """ 

439 

440 tables = {} 

441 

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 ) 

449 

450 return tables 

451 

452 

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) 

459 

460 

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 '' 

466 

467 for name, tab in tables.items(): 

468 yield f'## Table {name}' 

469 yield '' 

470 

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)] 

474 

475 def line(cells): 

476 return '| ' + ' | '.join(s.ljust(w) for s, w in zip(cells, widths)) + ' |' 

477 

478 yield line(header) 

479 yield '|' + '|'.join('-' * (w + 2) for w in widths) + '|' 

480 for cells in body: 

481 yield line(cells) 

482 yield '' 

483 

484 

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 '' 

490 

491 for sec in _TESTS: 

492 yield f'## {sec["title"]}' 

493 yield '' 

494 if sec.get('text'): 

495 yield sec['text'] 

496 yield '' 

497 

498 for group, requests in sec['groups']: 

499 if group: 

500 yield f'### {group}' 

501 yield '' 

502 

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)) 

511 

512 yield '```' 

513 yield '\n\n'.join(texts) 

514 yield '```' 

515 yield '' 

516 

517 

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) 

527 

528 

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 + ']' 

533 

534 

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 ) 

551 

552 

553def _compact(v): 

554 return json.dumps(v, ensure_ascii=False) 

555 

556## 

557 

558 

559_COMMON_COLUMNS = { 

560 'gml_id': 'character(16)', 

561 'anlass': 'varchar[]', 

562 'beginnt': 'character(20)', 

563 'endet': 'character(20)', 

564} 

565 

566_GEOM = f'geometry(Geometry, {SRID})' 

567 

568 

569def _changed(gml_id, old=None, **row): 

570 """Rows of an object with a historic version and a current version. 

571 

572 The historic version has the values of ``row`` updated with ``old``. 

573 """ 

574 

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 ] 

579 

580 

581def _ended(gml_id, **row): 

582 """Rows of an object that has ended.""" 

583 

584 return [ 

585 dict(row, gml_id=gml_id, beginnt=BEGIN_OLD, endet=BEGIN_NEW, anlass=[ANLASS_OLD, ANLASS_END]), 

586 ] 

587 

588 

589def _box(x1, y1, x2, y2): 

590 """Polygon in local coordinates, relative to ``X0``, ``Y0``.""" 

591 

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}))' 

594 

595 

596def _point(x, y): 

597 """Point in local coordinates, relative to ``X0``, ``Y0``.""" 

598 

599 return f'POINT({X0 + x} {Y0 + y})' 

600 

601 

602def _fs_box(n): 

603 """Geometry of ``fs n``.""" 

604 

605 return _box((n - 1) * 100, 0, n * 100, 100) 

606 

607 

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(), 

617 

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(), 

623 

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(), 

629 

630 'ax_flurstueck': _ax_flurstueck(), 

631 'ax_historischesflurstueck': _ax_historischesflurstueck(), 

632 

633 'ax_wohnbauflaeche': _ax_wohnbauflaeche(), 

634 'ax_strassenverkehr': _ax_strassenverkehr(), 

635 'ax_bodenschaetzung': _ax_bodenschaetzung(), 

636 'ax_denkmalschutzrecht': _ax_denkmalschutzrecht(), 

637 } 

638 

639 

640## 

641 

642_PLACE_COLUMNS = { 

643 'bezeichnung': 'varchar', 

644 'schluesselgesamt': 'varchar', 

645} 

646 

647 

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 

656 

657 

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 

674 

675 

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 

694 

695 

696def _ax_gemeinde(): 

697 cols = _PLACE_COLUMNS | { 

698 'land': 'varchar', 

699 'regierungsbezirk': 'varchar', 

700 'kreis': 'varchar', 

701 'gemeinde': 'varchar', 

702 } 

703 

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 ) 

713 

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 

720 

721 

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 } 

731 

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 ) 

743 

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 

750 

751 

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 

772 

773 

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 

792 

793 

794## 

795 

796_LAGE_KEY_COLUMNS = { 

797 'land': 'varchar', 

798 'regierungsbezirk': 'varchar', 

799 'kreis': 'varchar', 

800 'gemeinde': 'varchar', 

801 'lage': 'varchar', 

802} 

803 

804 

805def _lage_key(gemeinde, lage): 

806 return dict(land=LAND, regierungsbezirk=REGIERUNGSBEZIRK, kreis=KREIS, gemeinde=gemeinde, lage=lage) 

807 

808 

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 

831 

832 

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 

850 

851 

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 

863 

864 

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 

879 

880 

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 

926 

927 

928## 

929 

930 

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 

964 

965 

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 

1014 

1015 

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 

1084 

1085 

1086def _ax_buchungsblatt(): 

1087 cols = { 

1088 'land': 'varchar', 

1089 'bezirk': 'varchar', 

1090 'buchungsblattkennzeichen': 'varchar', 

1091 'buchungsblattnummermitbuchstabenerweiterung': 'varchar', 

1092 'blattart': 'integer', 

1093 } 

1094 

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 ) 

1103 

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 

1111 

1112 

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 

1175 

1176 

1177## 

1178 

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} 

1198 

1199 

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 ) 

1217 

1218 

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 

1273 

1274 

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 

1317 

1318 

1319## 

1320 

1321_PART_COLUMNS = { 

1322 'wkb_geometry': _GEOM, 

1323} 

1324 

1325 

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 

1344 

1345 

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 

1368 

1369 

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 

1401 

1402 

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 

1423 

1424 

1425if __name__ == '__main__': 

1426 generate(sys.argv[1])