source: trunk/info/info/alkis/alkisexport.php @ 376

Revision 376, 8.6 KB checked in by frank.jaeger, 7 years ago (diff)

Verbesserungen an der ALKIS-Buchauskunft (Geschwindigkeit, Fehlerkorrekturen, Mandantenfähigkeit) und an der Mapbender2-Navigation.

RevLine 
[301]1<?php
2/*      Modul alkisexport.php
[330]3        CSV-Export von ALKIS-Daten zu einem Flurstueck, Grundbuch oder EigentÃŒmer.
4        Es wird eine GML-ID ÃŒbergeben.
[301]5        Es wird ein gespeicherter View verwendet, der nach der gml_id gefiltert wird.
6        Der View verkettet Flurstueck - Buchungsstelle - Grundbuch - Eigentuemer
[330]7        Die Lagebezeichnung des FlurstÃŒcks wird in ein Feld komprimiert.
[376]8        Parameter Beispiele:
9                ?gkz=mandant&tabtyp=flurstueck/grundbuch/person&gmlid=DE...
10                ?gkz=270&tabtyp=gemarkung&gemarkung=2662   
11                ?gkz=270&gemarkung=2662
12        Parameter Beispiele fÃŒr Fehler:
13                ?gkz=270&tabtyp=gemarkung&gmlid=2662
14                ?gkz=270&tabtyp=flurstueck&gemarkung=2662
15                ?gkz=270&tabtyp=flurstueck
16                ?gkz=270&gmlid=2662
[301]17
[376]18        Version
19        2016-02-23 Version fuer norGIS-ALKIS-Import
20        2016-10-18 Export einer ganzen Gemarkung zulassen (Sonderfall bei den Parametern)
21        2016-11-29 Gemeinsam genutzte Datenbanken ermöglichen
22
23++ ToDo: SQL "exp_csv_str" und "exp_csv_str" optimieren
[301]24*/
25
26function lage_zum_fs($gmlid) {
[330]27        // Zu einem FlurstÃŒck die Lagebezeichnungen (mit Hausnummer) so aufbereiten,
[303]28        // dass ggf. mehrere Lagebezeichnungen in eine Zelle der Tabelle passen.
[330]29        // FS >westAuf> Lage >> Katalog
30        $sql ="SELECT DISTINCT s.bezeichnung, l.hausnummer
[339]31        FROM ax_flurstueck f JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(f.weistauf)
[330]32        JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage
33        WHERE f.gml_id= $1 ORDER BY s.bezeichnung, l.hausnummer;";
34
[303]35        $v=array($gmlid);
36        $res=pg_prepare("", $sql);
37        $res=pg_execute("", $v);
[376]38        if (!$res) {return "** Fehler bei Lagebezeichnung **";}
[301]39        $j=0;
[303]40        $lagehsnr="";
[355]41        $salt="";
[301]42        while($row = pg_fetch_array($res)) {
[303]43                if ($j > 0) {$lagehsnr.=", ";}
[301]44                $sneu=$row["bezeichnung"];
45                if ($sneu == $salt) { // gleiche Str.
46                        $lagehsnr.=$row["hausnummer"]; // HsNr dran haengen
47                } else { // Name UND HsNr dranhaengen
48                        $lagehsnr.=$sneu." ".$row["hausnummer"];
49                }
50                $salt=$sneu; // Name f. naechste Runde
[303]51                $j++;
[301]52        }
53        pg_free_result($res);
54        return($lagehsnr);
55}
56
[330]57// HIER START //
58
[376]59$gkz=''; $tabtyp = ''; $gemarkung=''; $gmlid=''; // erwartete Parameter initialisieren
60$cntget = extract($_GET); // aktuelle Parameter aus URL auslesen
61require_once("alkis_conf_location.php"); // Konfiguration laden
62include("alkisfkt.php"); // Funktionen der ALKIS-Auskunft laden
63
64if ($tabtyp == '') { // Parameter (-kombinationen) pruefen
65        if ($gemarkung == '') { // Beim Wert "gmlid" MUSS man die Tabelle dazu nennen
66                exit ("Fehler: Art des Suchfilters nicht angeben.");
67        } else {  // Art des Wertes bestimmt eindeutig den Filter
68                $tabtyp = 'gemarkung';
69        }
70} elseif ($tabtyp == 'gemarkung') {
71        if ($gemarkung == '') {
72                exit ("Fehler: Gemarkungsnummer nicht angeben.");
73        }
74}
75if ($gmlid == '') {
76        if ($gemarkung == '') {
77                exit ("Fehler: Kein Wert fuer die Suche angegeben.");
78        } else { // Wert fÃŒr Gemarkungsnummer angegeben
79                if ($tabtyp != 'gemarkung') {
80                        exit ("Fehler: Falsche Kombination Parameter tabtyp='".$tabtyp."' mit Wert fuer Gemarkungsnummer.");
81                }
82                $filename='alkis_'.$tabtyp.'_'.$gemarkung.'.csv';
83        }
84} else { // alles gut
85        $filename='alkis_'.$tabtyp.'_'.$gmlid.'.csv';
86}
87
88// DOWNLOAD der CSV-Datei vorbereiten (statt HTML-Ausgabe)
[301]89header('Content-type: application/octet-stream');
[376]90header('Content-Disposition: attachment; filename="'.$filename.'"');
[301]91
92// CSV-Ausgabe: Kopfzeile mit Feldnamen
[305]93echo "FS-Kennzeichen;GmkgNr;Gemarkung;Flur;Flurstueck;Flaeche;Adressen;GB-BezNr;GB-Bezirk;GB-Blatt;BVNR;Anteil_am_FS;Buchungsart;Namensnummer;AnteilDerPerson;RechtsGemeinschaft;Person;GebDatum;Anschrift;Anteil(berechnet)";
[301]94
[303]95// Datenbank-Verbindung
[376]96$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisexport.php'");
97if (!$con) {exit("Fehler beim Verbinden der DB");}
[355]98pg_set_client_encoding($con, 'LATIN1'); // FÃŒr Excel kein UTF8 ausgeben
[301]99
[376]100$viewname="exp_csv"; // Standard-View, ist in der Datenbank gespeichert
101$v=array($gmlid); // Standard-Filter-Feld
102
[305]103// Der Parameter "Tabellentyp" bestimmt den Namen des Filter-Feldes aus dem View "exp_csv".
104switch ($tabtyp) { // zulaessige Werte fuer &tabtyp=
[376]105        case 'flurstueck': // ax_flurstueck.gml_id
106                $filter = "fsgml";
107                break;
108        case 'grundbuch': // ax_buchungsblatt.gml_id
109                $filter = "gbgml";
110                break;
111        case 'person': // ax_person.gml_id
112                $filter = "psgml";
113                break;
114        case 'strasse': // ax_lagebezeichnungkatalogeintrag.gml_id = Straße-GML-ID
115                $filter = "stgml";
116                $viewname="exp_csv_str"; // alternativer View mit "_str", ist in der Datenbank gespeichert 
117                break;
118        case 'gemarkung': // SONDERfall als Parameter wird "Gemarkungsnummer" und nicht "gml_id" geliefert
119                $filter = "gemarkungsnummer";
120                $v=array($gemarkung); // anderes Filter-Feld, anderer Parameter
121                break;
122        default:
123                exit("Falscher Parameter '".$tabtyp."'");
124                break;
[301]125}
126
[308]127// Daten aus gespeichertem View, zusaetzlich Filter: "feld"='wert' mitgeben
[376]128$sql="SELECT * FROM ".$viewname." WHERE ".$filter." = $1 ";
[308]129
130$res=pg_prepare("", $sql);
131$res=pg_execute("", $v);
[305]132if (!$res) {exit("Fehler bei Datenbankabfrage");}
[330]133$i=1; // Kopfzeile zÀhlt mit
[301]134$fsalt='';
135
136// Datenfelder auslesen
137while($row = pg_fetch_array($res)) {
[305]138        $i++; // Zeile der Tabelle
139        $rechnen=true; // Formel in letzte Spalte?
[301]140
141        // Flurstueck
142        $fsgml=$row["fsgml"];
[303]143        $fs_kennz=$row["fs_kennz"]; // Rechts Trim "_" ?
[301]144        $gmkgnr=$row["gemarkungsnummer"];
[303]145        $gemkname=$row["gemarkung"];
146        $flurnummer=$row["flurnummer"];
147        $flstnummer=$row["zaehler"];
[301]148        $nenner=$row["nenner"];
[376]149        // Bruchnummer kann in Excel als Datum interpretiert werden. In '' setzen.
150        if ($nenner > 0) {$flstnummer="'".$flstnummer."/".$nenner."'";} // BruchNr
[301]151        $fs_flae=$row["fs_flae"]; // amtliche Fl. aus DB-Feld
152
153        // Grundbuch (Blatt)
[303]154        $gb_bezirk=$row["gb_bezirk"]; // Nummer des Bezirks
155    $gb_beznam=$row["beznam"];    // Name des Bezirks
[301]156        $gb_blatt=$row["gb_blatt"];
157
158        // Buchungsstelle (Grundstueck)
[303]159        $bu_lfd=$row["bu_lfd"]; // BVNR
[305]160        $bu_ant=$row["bu_ant"]; // '=zaehler/nenner' oder NULL
[330]161        $bu_key=$row["buchungsart"]; // SchlÃŒssel
162        $bu_art=$row["bu_art"]; // entschlÃŒsselt (Umlaute in ANSI!)
[305]163        if($bu_ant == '') { // Keine Bruch-Zahl
164                $bu_ant = '1'; // "voller Anteil" (Faktor 1)
165        } else {
166                $bu_ant=str_replace(".", ",", $bu_ant); // Dezimalkomma statt -punkt.           
[303]167        }
168
169        // Namensnummer
[308]170        $nam_lfd="'".kurz_namnr($row["nam_lfd"])."'"; // In Hochkomma, wird sonst wie Datum dargestellt.
[304]171        $nam_ant=$row["nam_ant"];
[330]172        $nam_adr=$row["nam_adr"]; // Art der Rechtsgemeischaft (SchlÃŒssel)
[308]173
174        if ($nam_adr == '') {     // keine Rechtsgemeinschaft
175                $rechtsg='';
[305]176                if ($nam_ant == '') { // und kein Bruch-Anteil
177                        $nam_ant=1; // dann ganzer Anteil
178                }
[303]179        } else {
[308]180                $rechnen=false; // bei Rechtsgemeinschaft die Anteile manuell interpretieren
[305]181                if ($nam_adr == 9999) { // sonstiges
182                        $rechtsg=$row["nam_bes"]; // Beschrieb der Rechtsgemeinschaft
183                } else {
[376]184                //      $rechtsg=rechtsgemeinschaft($nam_adr); // EntschlÃŒsseln
185                        $rechtsg=$row["nam_adrv"]; // Art der Rechtsgemeischaft (Value zum Key)
[305]186                }
[303]187        }
188
[301]189        // Person
[308]190        $vnam=$row["vorname"];
[303]191        $nana=$row["nachnameoderfirma"];
[308]192        $namteil=$row["namensbestandteil"];
[376]193        //$name=anrede($row["anrede"]); 
194        $name=$row["anrv"]; // Anrede (Value zum Key)
[308]195        if ($name != "") {$name.=" ";} // Trenner
196        if ($namteil != "") {$name.=$namteil." ";} // von und zu
197        $name.=$nana;
198        if ($vnam != "") {$name.=", ".$vnam;} // Vorname nach hinten
[303]199        $gebdat=$row["geburtsdatum"];
[301]200
[303]201        // Adresse der Person (Eigentuemer))
202        $ort=$row["ort"];
203        if ($ort == "") {
204                $adresse="";
205        } else {
206                $adresse=$row["strasse"]." ".$row["hausnummer"].", ".$row["plz"]." ".$ort;
[330]207                $land=$row["land"]; // nur andere LÀnder anzeigen
[303]208                if (($land != "DEUTSCHLAND") and ($land != "")) {
209                        $adresse.=" (".$land.")";
210                }
211        }
[301]212
[303]213        // Adressen (Lage) zum FS
[330]214        if($fsgml != $fsalt) { // nur bei geÀndertem Kennz.
[301]215                $lage=lage_zum_fs($fsgml); // die Lage neu ermitteln
216                $fsalt=$fsgml;
217        }
218
[330]219        // Den Ausgabe-Satz montieren aus FlurstÃŒcks-, Grundbuch- und Namens-Teil
[305]220        //      A             B           C             D               E               F            G
[303]221        $fsteil=$fs_kennz.";".$gmkgnr.";".$gemkname.";".$flurnummer.";".$flstnummer.";".$fs_flae.";".$lage.";";
[305]222        //      H              I              J             K           L           M
[303]223        $gbteil=$gb_bezirk.";".$gb_beznam.";".$gb_blatt.";".$bu_lfd.";".$bu_ant.";".$bu_art.";";
[305]224        //       N            O            P            Q         R           S
[303]225        $namteil=$nam_lfd.";".$nam_ant.";".$rechtsg.";".$name.";".$gebdat.";".$adresse;
[301]226
[305]227        // Anteile "GB am FS" und "Pers am GB" verrechnen
228        if ($rechnen) { // beide Anteile verwertbar
229                $formelteil=";=L".$i."*O".$i; // Spalte T
230        } else {
231                $formelteil=';';
232        }
233
[330]234        // Ausgabe in die CSV-Datei -> Download -> Tabellenkalkulation
[305]235        echo "\n".$fsteil.$gbteil.$namteil.$formelteil;
[301]236}
237pg_free_result($res);
[305]238if ($i == 1) {exit ("Kein Treffer fuer gml_id=".$gmlid);} // nur Kopfzeile
[301]239pg_close($con);
[303]240exit(0);
[301]241?>
Note: See TracBrowser for help on using the repository browser.