wldge2sql

Testbed zur Konvertierung von WLDGE-Dateien in SQL-Statements zum Aufbau und zur Fortführung von ALB Beständen.

^0 Allgemeines zur Benutzung >

Die Applikation wldge2sql konvertiert die Zeilen von WLDGE-Dateien (Workdatei Liegenschaftsbuch Daten-Gewinnung mit Entschlüsselungen) in SQL-Statements (Structured Query Language). Die SQL-Statements können zum Aufbau eines ALB-Bestandes (Automatisiertes LiegenschaftsBuch) in Form einer relationalen Datenbank in Anlehnung an das Modell des Programms ALB-Info des Kommunalen Rechenzentrum Minden-Ravensberg/Lippe verwendet werden.

Dieses Testbed wurde entwickelt zum Testen der Funktionen zum Konvertieren von WLDGE Dateien in SQL-Statements zum Aufbau und zur Fortführung von ALB Beständen des Liegenschaftskatasters. Die gegenwärtige Version wurde bisher nur gegen Daten aus dem Bundesland Mecklenburg/Vorpommern getestet. Dieses Testbed soll dazu dienen die Konvertierungsfunktionen zu testen und eventuell notwendige Anpassungen für andere Bundesländer oder allgemein gültige Fehler aufzudecken. Hinweise und Kommentare bitte an peter.korduan@auf.uni-rostock.de.

^ < 1 Installation >

Für Eilige:

  1. Entpacken Sie wldge2sql.gz in ein Webverzeichnis.
  2. Legen Sie eine neue Datenbank mit dem Namen ALB an und setzen host: localhost user: testuser password no.
  3. Führen Sie zum Erzeugen der Tabellen die create-Statements aus der Datei Tabellenschema.sql aus
  4. Kopieren Sie Ihre WLDGE Datei in ein Verzeichnis auf Ihrem Server und passen Sie den Pfad in der Konstane: WLDGEFILEPATH in der Datei config.php an.
  5. Starten Sie wldge2sql/index.php

^ < 1.1 Installation unter UNIX/Linux >

Vergewissern Sie sich, daß auf Ihrem System ein Webserber läuft, z.B. Apache und PHP. Modifizieren Sie eventuell die Parameter Register_Global Off in der php.ini wenn Sie Probleme mit der Variablenübergabe haben.

Entpacken Sie das Packet wldge2sql.gz mit
# /home/downloads> gunzip wldge2sql_0-0-1.gz
an der Stelle wo Sie es runtergeladen haben. Danach sollte die Datei wldge2sql.tar vorhanden sein und sie können das Archiv mit
# /home/downloads> tar xvf wldge2sql_0-0-1.tar
entpacken. Das entstanden Verzeichnis wldge2sql kopieren Sie unterhalb Ihres Webordners (wwwroot), z.B. bei Apache /usr/local/httpd/htdocs.
# /home/downloads> cp -R wldge2sql /usr/local/httpd/htdocs
Machen Sie den Ordner und alle darin befindlichen Dateien für den www-deamon zugänglich und setzen Sie die Rechte z.B. mit
# /usr/local/httpd/htdocs> chown -R wwwrun.users wldge2sql
# /usr/local/httpd/htdocs> chmod -R 760 wldge2sql
Rufen Sie mit Ihrem Browser die Datei install.htm auf
# />lynx http://localhost/wldge2sql/install.htm
Diese Seite sollte erscheinen.

^ < 1.2. Installation unter Windows >

Entpacken Sie die Datei wldge2sql.zip in den Webfolder unterhalb des wwwroot-Verzeichnisses.

^ < 1.3. Einrichten der Datenbank >

1.3.1 MySQL unter UNIX/Linux

Sorgen Sie dafür, daß auf Ihrem System der Datenbankserver Ihrer Wahl installiert ist und läuft.
Installation siehe Dokumentation. Testen Sie den mysql-deamon mit
# />mysqld -v
Es kann natürlich auch eine andere Datenbank benutzt werden mit der Sie von PHP aus zugreifen können. Passen Sie ggf. die Datei config.php im Verzeichnis wldge2sql an.

Legen Sie eine neue Datenbank mit dem Namen ALB an. z.B. über den Browser mit phpMyAdmin oder über das Programm mysql_setpermission.

Richten Sie die Zugriffsrechte für die Datenbank so ein, daß user: tester von host: localhost mit password '' (ohne) zugreifen kann. Testen Sie den Zugang über:
# />mysql -u tester
mysql> use mysql;
mysql> select host,users,passwd from users where users like 'tester';
Hier sollten Ihre Eintragungen erscheien.
Wenn Sie andere Rechte vergeben wollen passen Sie Ihre Werte in der Datei config.php im Array der Variablen $ALBdb an.

Legen Sie die Tabellen für den ALB-Bestand (Tabellenname) und die Tabellen für die Fortführung (x_Tabellenname) an in dem sie die SQL-Anweisungen aus dem SQL-Dump /schema/table_dump_mysql.sql ausführen.
# />mysql < table_dump_mysql.sql (irgentwie so ging das, oder ähnlich)
oder über phpMyAdmin SQL wählen und einfach den Text aus Tabellenschema.sql in das Textfeld kopieren und die Statements absetzen. Den Inhalt der Datei Tabellenschema.sql in die Zwischenablage kopieren. In phpMyAdmin das SQL-Textfenster öffnen, die SQL-Statements aus der Zwischenablage hinein kopieren und ausführen. Nun sollten 63 leere Tabellen erstellt worden sein. Prüfen Sie ob die Tabellen vorhanden sind.
mysql>show tables;
oder in phpMyAdmin Tabellenleiste Aktualisieren.

1.3.2 MySQL unter Windows

Legen Sie die neue Datenbank ALB an.
c:\> c:\xampp\mysql\bin mysqladmin.exe create ALB
Den Inhalt der Datei Tabellenschema.sql in die Zwischenablage kopieren. In phpMyAdmin das SQL-Textfenster öffnen, die SQL-Statements aus der Zwischenablage hinein kopieren und ausführen. Nun sollten 63 leere Tabellen erstellt worden sein.

1.3.3 PostgreSQL mit PostGIS

(Für diesen Abschnitt Dank an Astrid Emde)

Installieren Sie PostgreSQL. Eine Beschreibung der Installation finden Sie unter http://postgis.refractions.net/documentation.php

Legen Sie die neue Datenbank alb (Kleinschreibung verwenden) an.
Achten Sie darauf, dass die Datenbank üie PostGIS Funktionalitäverfübr>
createdb [-U user] -E Latin1 -T template1 alb

createlang [-U user] plpgsql alb

psql [-U user] -f postgis.sql alb
(Suche der Datei üind / -name postgis.sql oder locate)

Anlegen der Tabelle spatial_ref_sys (epsg-codes)
psql -d alb -f spatial_ref_sys.sql

Liegt auf Ihrem Rechner schon ein PostGIS-Template vor kön Sie die Datenbank auch üolgende Zeile erzeugen:
createdb [-U user] -E Latin1 -T postgis_template alb

Erstellen der ALB-Datenbanktabellen
Erstellen der ALB-Datenbanktabellen durch ausführen der SQL-Anweisungen in /schema/table_dump_postgres.sql

Bitte beachten Sie:
Sollte Ihre DB einen anderen Namen als alb haben, müSie eine Anpassung in der Datei table_dump_postgres.sql durchfü bevor Sie das SQL abschicken.
Die PostGIS-Funktion AddGeometryColumn mußzweimal im SQL angepaß werden.
Bitte tragen Sie als ersten Üergabeparameter, den von Ihnen verwendeten Datenbanknamen ein. Üerprüie außrdem das Projektionssystem (4. Üergabeparameter) und äern gegebenenfalls den Wert.

SELECT AddGeometryColumn('alb','alb_flurstuecke','the_geom','31466','POINT','2');
SELECT AddGeometryColumn('alb','alb_x_flurstuecke','the_geom','31466','POINT','2');

epsg-Codes für Referenzsystem Bessel (alte Länder):

epsg-Codes für Referenzsystem Krassowski (neue Länder):
(Krassowski Ellipsoied, Datum Pulkowo 42, Gauss-Krüger Projektion 3° Streifensystem)

Visualisierung der ALB-Daten
Die nach PostgreSQl eingelesenen Daten kön z. B. mit dem UMN MapServer oder dem DesktopGIS Jump, Quantum GIS oder uDig visualisiert werden. Die Geometrieobjekte befinden sich dabei in der Tabelle alb_flurstuecke in der Spalte the_geom. Es handelt sich dabei um Punkte.

Mehr zu UMN MapServer finden Sie unter:

JUMP, Quantum GIS und uDig steht zum Download unter:

^ < 2 Nutzung

2.1 Allgemeine Funktionsweise

Starten der Anwendung
So gehts los. Starten sie index.php im Verzeichnis wldge2sql
# />lynx http://localhost/wldge2sql/index.php

Fortführung oder Grunddatenbestand
Mit der Variable $ist_Fortfuehtung im Formular der Datei wldgeDateiWahl.php wird angegeben ob ein neuer Grunddatenbestand an ALB-Daten in der Datenbank angelegt werden soll ($ist_Fortführung=0), oder ein schon vorhandener in der Datenbank aktualisiert werden soll ($ist_Fortführung=1). Dieser Wert wird nach der Initialisierung des Objektes ALB an die Variable ALB->ist_Fortfuehrung übergeben und steht dort für die weitere Unterscheidung in die beiden Fälle wärende der Laufzeit des Scriptes bereit.

Prüfung
Die WLDGE-Dateien werden vor dem Einlesen geprüft. Für nähere Angaben siehe Abschnitt 2.2.

Einlesen der WLDGE-Dateien
Die WLDGE-Dateien werden zeilenweise eingelesen und ausgewertet, siehe (Einlesen der WLDGE-Datei). Aus jeder Zeile wird ein SQL-Statement gebildet. Ausnahmen bilden Angaben, die über mehrer Zeilen gehen, aber nur in einem Datenbank-Datensatz eingetragen werden sollen, z.B. für Namensangaben Name1, Name2, Name3 und Name4. Diese werden in einem SQL-Statement zusammengefasst.
Die SQL Statements werden in die SQL-Dump Datei geschieben (siehe Abschnitt Erzeugen der SQL-Statements).
Je nach dem, ob die Konstante DBWRITE in der config.php gesetzt ist, werden entweder
(DBWRITE=0) nur die SQL-Statements in die Dump-Datei geschrieben oder
(DBWRITE=1) die SQL-Statements auch direkt an die Datenbank abgesetzt und ausgeführt.

Schreiben der Tabellen
Bei der Anlage des Grunddatenbestandes werden beim Einlesen der WLDGE-Datei die Daten gleich in die Originaltabellen eingelesen. Bei der Fortführung zunächst nur temporär in die Tabellen zur Fortführung, die mit x am Anfang gekennzeichnet sind. z.B. x_Flurstuecke.

Schreiben der Fortführung
Anschließend werden mit der Methode ALB->Fortfuehren(boolean $logSQL) die Originaltabellen aktualisiert, also Angaben daraus gelöscht, überschrieben oder aktualisiert mit DELETE, INSERT oder UPDATE Statements, siehe ALB Fortführen)

2.2 Prüfung der WLDGE Dateien

In beiden Fällen wird die WLDGE-Datei zunächst auf Richtigkeit geprüft. Die Prüfung wird durch die Methode WLDGE_Datei_Pruefen() des Objektes ALB vorgenommen. Folgende Prüfungen werden vorgenommen?

Werden keine Fehler gefunden liefert die Funktion einen leeren String zurück, sonst die entsprechende Fehlermeldung.

2.3 Erzeugen der SQL-Statements

Wenn die Methoden ALB->WLDGE_Datei_einlesen(boolean $logSQL) und ALB->Fortfuehren(boolean $logSQL) mit dem Parameter 1 übergeben werden, wird eine Log-Datei angelegt, die die SQL-Statements enthalten.
Der Name setzt sich wie folgt zusammen: WLDGE_<update_ für Fortführung>Dump_<aktuelles Datum und Zeit in 'Ymdhis'>.sql, z.B. WLDGE_update_Dump_20040516051941.sql oder WLDGE_Dump_20040516051942.sql
Auf diese Weise können die Änderungen später der Reihenfolge nach rekonstruiert werden.

2.4 Einlesen der WLDGE-Datei

Vor dem Einlesen der WLDGE-Datei werden zunächst die Tabellen in der Datenbank geleert. Handelt es sich um eine Fortführung werden nur die temporären Tabellen mit x_ am Anfang geleert.
Beim Einlesen werden die Fälle zunächst nach der Dateikennung unterschieden. Folgende Fälle treten auf:



Ausschnitt aus dem Datenmodell des ALB für Eigentümer, Grundstücke, Buchungen und Flurstücke

2.5 ALB Fortführen

Die Fortführung des ALB-Bestandes wird durch die Funktion Fortfuehren der Klasse ALB ausgeführt.
Die Klasse ALB hat dazu ein Objekt database zugewiesen bekommen. Das Objekt database kann mit einer MySQL- oder mit einer PostgreSQL-Datenbank kommunizieren. Die Tabellenstruktur ist die Selbe. Die Funktionen zur Fortführung der einzelnen Tabellen und zur Abfrage von Informationen über den aktuellen Bestand und die Quantität der fortgeführten Elemente erfolgt über Funktionen in der Klasse database. Die Reihenfolge bei der Fortführung ist wie folgt:

  1. Prüfen der WLDGE-Datei (siehe Prüfung)
  2. Einlesen der WLDGE-Datei (siehe Einlesen)
  3. Aktualisieren der Grundbücher
    1. Abfrage der Anzahl an historischer Grundbuechern (Anzahl der Einträge mit AktualitaetsNr="hist")
    2. Löschen aller Grundbuchblätter (grundbuecher), zu denen neue Informationen vorhanden sind (auch die historischen, da im nächsten Schritt nur die nicht historischen eingetragen werden.
    3. Einfügen aller neuen Grundbuecher (grundbuecher), außer den historischen, Alle die gelöscht wurden, werden hier wieder eingefügt (ge-update-ed), außer die, die historisch sind.
    4. Löschen aller Grundstuecke (g_grundstuecke), für die Änderungsdaten vorliegen
    5. Löschen aller Buchungen (g_buchungen), für die Änderungsdaten vorliegen
    6. Löschen aller Eigentümer (g_eigentuemer), für die Änderungsdaten vorliegen
  4. Aktualisieren aller bestehenden Bestandsdaten
    1. Einfügen neuer Grundstücke
    2. Einfügen der neuen Eintragungen für die Buchungen
    3. Einfügen der neuen Eintragungen für Eigentuemer und Namen
      1. Aktualisierung der Adressdaten von schon vorhandenen Eigentuemern, Bezirk, Blatt und NamensNr von bestehender Eigentümertabelle g_eigentuemer wird mit neuer Eigentümertabelle x_g_eigentuemer gleichgesetzt
        und alle Felder der dazugehörigen Einträge zu Namen g_namen durch die neue Namen überschieben.
      2. Finden von schon vorhandenen Namen im Grundbestand und Kennzeichnen in neuer Tabelle
        A) Übernahme der alten lfdNr für Namen in die Tabelle der neue Namen
        In den Fällen wo alle 4 Namensteile der alten und der neuen Namenstabelle identisch sind
        wird die alte lfd_Nr für Namen in die neue Tabelle zwischengespeichert
      3. Anhängen aller neuen Namen an die Namenstabelle des Grundbestands
        Es sind alle die Namen neu, für die im vorhergehenden Schritt keine Übereinstimmungen gefunden wurden.
      4. Jetzt werden die Nummern, die über Autonummer in der Grundbestandstabelle für die neuen Namen vergeben wurden
        durch wiederholen von Schritt A) zurück in die neue Namenstabelle geschrieben.
        In der neuen Namentabelle haben jetzt alle neue Namen und alle schon vorhandene Namen eine Nummer im Fortführungsbestand
        und eine Nummer im Grundbestand
      5. Übernahme der neuen Eigentümerdaten in den Grundbestand die lfd_Nr für die Namen im Bestand werden aus der Spalte lfd_Nr_altentnommen
  5. Aktualisieren der Flurstücksdaten
    Der Übersicht halber werden zunächst alle Einträge von historisch gewordenen Flurstücken gelöscht. Im nachhinein werden weitere Löschanfragen ausgeführt, z.B. vor dem Eintragen neuer Adressen, die auch zusammen mit dem Löschvorgang für historische Flurstücke hätten durchgeführt werden können.
    1. Löschen aller historischen Flurstücke und der dazugehörigen Daten
      1. Löschen aller historischen Flurstücke
      2. Löschen der Zuordnungen zum Bestand in g_Buchungen
      3. Löschen der Zuordnungen zu Adressen
      4. Löschen der historischen Zuordnungen zu Anlieger
      5. Löschen der historischen Zuordnung zu Baulasten
      6. Löschen der Zuordnung zu Hinweisen zum Flurstück
      7. Löschen der Zuordnung zur Flurstückshistorie
        1. Löschen aller Vorgänger von historischen Flurstücke in x_f_Historie
          Dies ist nur eine Änderung der eingelesenen Informationen wird nicht in der Ausgabe gelistet
        2. Löschen aller Einträge in f_Historie bei denen die Nachfolger historische Flurstücke sind
      8. Löschen der Zuordnung zu Klassifizierungen von historischen Flurstuecken
      9. Löschen der Zuordnung zu Lagebezeichnungen von historischen Flurstuecken
      10. Löschen der Zuordnung zu Nutzungen von historischen Flurstuecken
      11. Löschen der Zuordnung zu Texten von historischen Flurstuecken
      12. Löschen der Zuordnung zu Verfahren von historischen Flurstuecken
    2. Aktualisieren der vorhandenen Flurstücke und dessen Angaben
      1. Aktualisieren der Tabelle mit den Flurstücken
        1. Abfrage der Anzahl der nicht historischen neuen Flurstücke
        2. Abfrage der Anzahl der Flurstücke vor dem Update
        3. Aktualisieren der Flurstückstabelle
        4. Abfragen der Anzahl Flurstücke nach der Aktualisierung
      2. Aktualisieren der Flurstückshistorie
        1. Löschen der Historien, die durch neue überschrieben werden.
        2. Einfügen aller neuen Historienbeziehungen
      3. Aktualisieren der Nutzungen auf Flurstücken
        1. Löschen aller Nutzungsarteneinträge für Flurstücke, zu denen neue Nutzungen angegeben wurden
        2. Eintragen aller neuen Nutzungsarten
      4. Aktualisieren der Adressen
        1. Löschen aller Adresseinträge von vorhandenen Flurstücke mit Änderungen
        2. Eintragen aller neuen Adressen
      5. Aktualisieren der Lagebezeichnungen
        1. Löschen der Einträge in f_Lage, dessen FlurstKennz in x_f_Lage vorhanden sind
        2. Einfügen aller Einträge aus x_f_Lage in f_Lage
        3. Löschen aller Lagebezeichnungen für Flurstücke, die mindestens einen Adresseintrag haben
      6. Aktualisieren der Verfahrenszuordnungen
        1. Löschen der Einträge in f_Verfahren, dessen FlurstKennz in x_f_Verfahren vorhanden sind
        2. Eintragen aller neuen Verfahrenszuordnungen
      7. Aktualisieren der Baulastenzuordnungen
        1. Löschen der Einträge in f_Baulasten, dessen FlurstKennz in x_f_Baulasten vorhanden sind
        2. Eintragen aller neuen Baulastenzuordnungen
      8. Aktualisieren der Hinweisezuordnungen
        1. Löschen der Einträge in f_Hinweise, dessen FlurstKennz in x_f_Hinweise vorhanden sind
        2. Eintragen aller neuen Hinweisezuordnungen
      9. Aktualisieren der Klassifizierungenzuordnungen
        1. Löschen der Einträge in f_Klassifizierungen, dessen FlurstKennz in x_f_Klassifizierungen vorhanden sind
        2. Eintragen aller neuen Klassifizierungenzuordnungen
      10. Aktualisieren der Textezuordnungen
        1. Löschen der Einträge in f_Texte, dessen FlurstKennz in x_f_Texte vorhanden sind
        2. Eintragen aller neuen Textezuordnungen
      11. Aktualisieren der Anliegerzuordnungen
        1. Löschen der Einträge in f_Anlieger, dessen FlurstKennz in x_f_Anlieger vorhanden sind
        2. Eintragen aller neuen Anliegerzuordnungen
  6. Aktualisieren der Tabellen mit Entschlüsselungen

^ < 3. FAQ

Leider scheitere ich immer wieder an einem Timeout des Browsers trotz hochgesetzter Zeitlimits.
Prüfen ob der Timeout richtig gesetzt ist in der httpd.conf des Apache WebServers:
Timeout 36000
Und in der php.ini der PHP Konfigurationsdatei:
max_execution_time = 36000
Aber noch eines muß berücksichtigt werden. Ich lasse alle 1000 Zeilen einen echo raus mit der Zeilennummer, die gerade gelesen wird.
Zeile 681 in alb.php function WLDGE_Datei_einlesen()

$zeNr++;
  if ($zeNr==$zeNr1000) {
  echo "<br>".$zeNr." Zeilen eingelesen.";
  $zeNr1000+=1000;
}
Das echo führt zu einer Aktion, die den Timeout untergräbt. Das geht natürlich nur, wenn man den Buffer nicht erst nach Abarbeitung des Skriptes an den Client schickt, also mit der Funktion ob_start().