source: trunk/info/info/alkisn/alkisexport.php @ 405

Revision 405, 11.9 KB checked in by frank.jaeger, 6 years ago (diff)

Die Buchauskunft bekommt ein neues Modul Grundstücksnachweis (Buchung). Andere Module verlinken darauf.

Line 
1<?php
2/*      Modul alkisexport.php
3        CSV-Export von ALKIS-Daten zu einem Flurstueck, Grundbuch, EigentÃŒmer oder Straße.
4        Es wird eine GML-ID ÃŒbergeben.
5        Es wird ein gespeicherter View verwendet, der nach der gml_id gefiltert wird.
6        Der View verkettet Flurstueck - Buchungsstelle - Grundbuch - Eigentuemer
7        Die Lagebezeichnung des FlurstÃŒcks wird in ein Feld komprimiert.
8        Parameter Beispiele:
9                ?gkz=mandant&tabtyp=flurstueck/grundbuch/buchung/person/strasse&gmlid=DE...  Standard
10                ?gkz=270&tabtyp=gemarkung&gemarkung=2662         Sonderfall ganze Gemarkung
11                ?gkz=270&gemarkung=2662
12                ?gkz=mandant&tabtyp=strasse&haus=m&gmlid=DE...   Filter &haus=m/o = mit oder ohne Hausnummer
13                ?gkz=mandant&tabtyp=strasse&haus=o               bei Strasse auch ohne gmlid zulÀssig - nicht verwenden wenn aus NBA unscharf geladen
14        Beispiele fÃŒr Fehler:
15                ?gkz=270&tabtyp=gemarkung&gmlid=2662
16                ?gkz=270&tabtyp=flurstueck&gemarkung=2662
17                ?gkz=270&tabtyp=flurstueck
18                ?gkz=270&gmlid=2662
19
20        Version:
21        --------
22        2016-02-23      Version fuer norGIS-ALKIS-Import
23        2016-10-18      Export einer ganzen Gemarkung zulassen (Sonderfall bei den Parametern)
24        2016-11-29      Gemeinsam genutzte Datenbanken ermöglichen
25        2017-02-23      Filter mit/ohne Hausnummer zum Typ "strasse".
26                                Dazu muss der View "exp_csv_str" um die spalte "fall" erweitert werden.
27        2017-06-08 Validierung Eingabeparameter
28        2017-10-11 Sauber filtern auf endet IS NULL
29        2017-12-20 Nur eine Adresse zur Person (Siehe Views in "views_exp_csv.sql")
30        2018-05-03 Aufruf aus neuem GrundstÃŒcksnachweis: tabtyp='buchung', angepasster View "exp_csv" notwendig
31
32        ToDo:
33        - Abruf FlurstÃŒck sollte auch mit "fskennz" (ggg-ff-zzz/nn) statt "gml-id" möglich sein
34        - In Dateiname den Straßennamen statt der gmlid verwenden? (Umlaute?)
35        - in alkislage.php fÃŒr den Typ "ohne Haunummer" den Export mit strasse und haus=o verlinken
36*/
37
38function lage_zum_fs($gmlid) {
39        // Zu einem FlurstÃŒck die Lagebezeichnungen (mit Hausnummer) so aufbereiten,
40        // dass ggf. mehrere Lagebezeichnungen in eine Zelle der Tabelle passen.
41        // FS >westAuf> Lage >> Katalog
42        $sql ="SELECT DISTINCT s.bezeichnung, l.hausnummer "
43        ."FROM ax_flurstueck f JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(f.weistauf) "
44        ."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
45        ."WHERE f.gml_id= $1 AND f.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL ORDER BY s.bezeichnung, l.hausnummer;";
46
47        $v=array($gmlid);
48        $res=pg_prepare("", $sql);
49        $res=pg_execute("", $v);
50        if (!$res) {return "** Fehler bei Lagebezeichnung **";}
51        $j=0;
52        $lagehsnr="";
53        $salt="";
54        while($row = pg_fetch_assoc($res)) {
55                if ($j > 0) {$lagehsnr.=", ";}
56                $sneu=$row["bezeichnung"];
57                if ($sneu == $salt) { // gleiche Str.
58                        $lagehsnr.=$row["hausnummer"]; // HsNr dran haengen
59                } else { // Name UND HsNr dranhaengen
60                        $lagehsnr.=$sneu." ".$row["hausnummer"];
61                }
62                $salt=$sneu; // Name f. naechste Runde
63                $j++;
64        }
65        pg_free_result($res);
66        return($lagehsnr);
67}
68
69// HIER START //
70
71$tabtyp='';  $haus=''; // mögliche Parameter initialisieren
72$cntget = extract($_GET); // Parameter in Variable umwandeln
73
74// strikte Validierung aller Parameter
75if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
76if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
77if (isset($gemarkung)) {
78        if (!preg_match('#^[0-9]{4}$#', $gemarkung)) {die("Eingabefehler gemarkung");}
79} else {
80        $gemarkung='';
81}
82if (!preg_match('#^[m|o]{0,1}$#', $haus)) {die("Eingabefehler haus");}
83if (!preg_match('#^[a-z]{0,10}$#', $tabtyp)) {die("Eingabefehler tabtyp");}
84
85require_once("alkis_conf_location.php"); // Konfiguration laden
86include("alkisfkt.php"); // Funktionen der ALKIS-Auskunft laden
87
88if ($tabtyp == '') { // Parameter (-kombinationen) pruefen
89        if ($gemarkung != '') { // Dieser Parameters bestimmt auch eindeutig den $tabtyp
90                $tabtyp = 'gemarkung';
91        } else {  // Bei "gmlid" MUSS man zwingend die Tabelle dazu nennen
92                $err="\nFehler: Art des Suchfilters nicht angeben.";
93                exit ($err);
94        }
95} elseif ($tabtyp == 'gemarkung') {
96        if ($gemarkung == '') {
97                $err="\nFehler: Gemarkungsnummer nicht angeben.";
98                exit ($err);
99        }
100}
101
102if ($gmlid != '') { // Angabe von gmlid ist der Normalfall, das passt fÃŒr fast jeden tabtyp
103        if ($tabtyp == 'strasse' and $haus != '') { // den Zusatzfilter m/o im Dateinamen dokumentieren
104                if ($haus == 'm') {
105                        $filename='alkis_'.$tabtyp.'_'.$gmlid.'_mit_hsnr.csv';
106                } else {  // = o
107                        $filename='alkis_'.$tabtyp.'_'.$gmlid.'_ohne_hsnr.csv.csv';
108                }
109        } else {
110                $filename='alkis_'.$tabtyp.'_'.$gmlid.'.csv';
111        }
112} else { // Oh Oh! Keine gmlid! - Alternativen?
113        if ($gemarkung != '') { // Sonderfall 1 - Gemarkungsnummer statt gmlid als Filter
114                if ($tabtyp != 'gemarkung') {
115                        $err = "Fehler: Falsche Kombination Parameter tabtyp='".$tabtyp."' mit Wert fuer Gemarkungsnummer.";
116                        echo "\n".$err; exit ($err);
117                }
118                $filename='alkis_'.$tabtyp.'_'.$gemarkung.'.csv';
119
120/*      // $gmlid zu strasse noch notwendig solange kein Filter auf "Gemeinde" verwendet wird.
121        } elseif ($haus == 'm' or $haus == 'o') { // Sonderfall 2 - alle mit/ohne Hausnummer, nur ÃŒber View "exp_csv_str" möglich
122                if ($tabtyp != 'strasse') {
123                        $err="\nFehler: Falsche Kombination Parameter tabtyp='".$tabtyp."' mit Wert fuer Haus.";
124                        exit ($err);
125                }
126                if ($haus == 'm') { // den Zusatzfilter m/o im Dateinamen dokumentieren
127                        $filename='alkis_'.$tabtyp.'_mit_hsnr.csv';
128                } else {
129                        $filename='alkis_'.$tabtyp.'_ohne_hsnr.csv';
130                }
131*/
132        } else {
133                $err="\nFehler: Kein passender Wert fuer die Suche angegeben.";
134                exit ($err);
135        }
136}
137
138// DOWNLOAD der CSV-Datei vorbereiten (statt HTML-Ausgabe)
139header('Content-type: application/octet-stream');
140header('Content-Disposition: attachment; filename="'.$filename.'"');
141
142// CSV-Ausgabe: Kopfzeile mit Feldnamen
143echo "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)";
144
145// Datenbank-Verbindung
146$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisexport.php'");
147if (!$con) {
148        $err= "Fehler beim Verbinden der DB";
149        echo "\n".$err; exit($err);
150}
151pg_set_client_encoding($con, 'LATIN1'); // FÃŒr Excel kein UTF8
152
153$viewname="exp_csv"; // Standard-View, in der DB gespeichert
154$v=array($gmlid); // Standard-Filter-Feld
155
156// Der Parameter "Tabellentyp" bestimmt den Namen des Filter-Feldes aus dem View "exp_csv".
157switch ($tabtyp) { // zulaessige Werte fuer &tabtyp=
158        case 'flurstueck': // ax_flurstueck.gml_id
159                $filter = "fsgml";
160                break;
161        case 'grundbuch': // ax_buchungsblatt.gml_id
162                $filter = "gbgml";
163                break;
164        case 'buchung': // ax_buchungsstelle.gml_id
165                $filter = "gsgml";
166                break;
167        case 'person': // ax_person.gml_id
168                $filter = "psgml";
169                break;
170        case 'strasse': // ax_lagebezeichnungkatalogeintrag.gml_id = Straße-GML-ID
171                $filter = "stgml";
172                $viewname="exp_csv_str"; // alternativer View mit "_str", ist in der Datenbank gespeichert 
173                break;
174        case 'gemarkung': // SONDERfall als Parameter wird "Gemarkungsnummer" und nicht "gml_id" geliefert
175                $filter = "gemarkungsnummer";
176                $v=array($gemarkung); // anderes Filter-Feld, anderer Parameter
177                break;
178        default:
179                $err="\nFalscher Parameter '".$tabtyp."'";
180                exit($err);
181                break;
182}
183
184// Daten aus gespeichertem View, zusaetzlich Filter: "feld"='wert' mitgeben
185$sql="SELECT * FROM ".$viewname." WHERE ".$filter." = $1 ";
186
187if ($haus == 'm' or $haus == 'o') { // nur FS mit/ohne verschl. Lagebez.
188        if ($gmlid == '') { // m/o-Filter als einziger Filter
189                $sql="SELECT * FROM ".$viewname." WHERE fall='".$haus."' "; // Ersetzen
190                $v=array(); // kein Filter-Feld
191                // ToDo: Filter auf Gemeinde notwendig, wenn nicht auf strasse gefiltert wird.
192                // - Sonst Ausgabe von Rand-FlurstÃŒcken (bei geometrischer Filterung des NBA-Verfahrens)
193                // - Sonst ggf. Ausgabe Kreisgebiet
194        } else { // als zusÀtzlicher Filter AND
195                $sql.="AND fall='".$haus."' "; // m/o-Filter AnhÀngen
196        }
197}
198
199$res=pg_prepare("", $sql);
200$res=pg_execute("", $v);
201if (!$res) {
202        $err="\nFehler bei Datenbankabfrage";
203        exit($err);
204}
205$i=1; // Kopfzeile zÀhlt mit
206$fsalt='';
207
208// Datenfelder auslesen
209while($row = pg_fetch_assoc($res)) {
210        $i++; // Zeile der Tabelle
211        $rechnen=true; // Formel in letzte Spalte?
212
213        // Flurstueck
214        $fsgml=$row["fsgml"];
215        $fs_kennz=$row["fs_kennz"]; // Rechts Trim "_" ?
216        $gmkgnr=$row["gemarkungsnummer"];
217        $gemkname=$row["gemarkung"];
218        $flurnummer=$row["flurnummer"];
219        $flstnummer=$row["zaehler"];
220        $nenner=$row["nenner"];
221        // Bruchnummer kann in Excel als Datum interpretiert werden. In '' setzen.
222        if ($nenner > 0) {$flstnummer="'".$flstnummer."/".$nenner."'";} // BruchNr
223        $fs_flae=$row["fs_flae"]; // amtliche Fl. aus DB-Feld
224
225        // Grundbuch (Blatt)
226        $gb_bezirk=$row["gb_bezirk"]; // Nummer des Bezirks
227    $gb_beznam=$row["beznam"];    // Name des Bezirks
228        $gb_blatt=$row["gb_blatt"];
229
230        // Buchungsstelle (Grundstueck)
231        $bu_lfd=$row["bu_lfd"]; // BVNR
232        $bu_ant=$row["bu_ant"]; // '=zaehler/nenner' oder NULL
233        $bu_key=$row["buchungsart"]; // SchlÃŒssel
234        $bu_art=$row["bu_art"]; // entschlÃŒsselt (Umlaute in ANSI!)
235        if($bu_ant == '') { // Keine Bruch-Zahl
236                $bu_ant = '1'; // "voller Anteil" (Faktor 1)
237        } else {
238                $bu_ant=str_replace(".", ",", $bu_ant); // Dezimalkomma statt -punkt.           
239        }
240
241        // Namensnummer
242        $nam_lfd="'".kurz_namnr($row["nam_lfd"])."'"; // In Hochkomma, wird sonst wie Datum dargestellt.
243        $nam_ant=$row["nam_ant"];
244        $nam_adr=$row["nam_adr"]; // Art der Rechtsgemeischaft (SchlÃŒssel)
245
246        if ($nam_adr == '') {     // keine Rechtsgemeinschaft
247                $rechtsg='';
248                if ($nam_ant == '') { // und kein Bruch-Anteil
249                        $nam_ant=1; // dann ganzer Anteil
250                }
251        } else {
252                $rechnen=false; // bei Rechtsgemeinschaft die Anteile manuell interpretieren
253                if ($nam_adr == 9999) { // sonstiges
254                        $rechtsg=$row["nam_bes"]; // Beschrieb der Rechtsgemeinschaft
255                } else {
256                //      $rechtsg=rechtsgemeinschaft($nam_adr); // EntschlÃŒsseln
257                        $rechtsg=$row["nam_adrv"]; // Art der Rechtsgemeischaft (Value zum Key)
258                }
259        }
260
261        // Person
262        $vnam=$row["vorname"];
263        $nana=$row["nachnameoderfirma"];
264        $namteil=$row["namensbestandteil"];
265        //$name=anrede($row["anrede"]); 
266        $name=$row["anrv"]; // Anrede (Value zum Key)
267        if ($name != "") {$name.=" ";} // Trenner
268        if ($namteil != "") {$name.=$namteil." ";} // von und zu
269        $name.=$nana;
270        if ($vnam != "") {$name.=", ".$vnam;} // Vorname nach hinten
271        $gebdat=$row["geburtsdatum"];
272        // Koennte man im View in deutsches Format umwandeln: "to_char(cast(geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum"
273
274        // Adresse der Person (Eigentuemer)
275        // Im View ist per subquery geregelt, dass nur die "juengste" Adresse verwendet wird.
276        $ort=$row["ort"];
277        if ($ort == "") {
278                $adresse="";
279        } else {
280                $adresse=$row["strasse"]." ".$row["hausnummer"].", ".$row["plz"]." ".$ort;
281                $land=$row["land"]; // nur andere Laender anzeigen
282                if (($land != "DEUTSCHLAND") and ($land != "")) {
283                        $adresse.=" (".$land.")";
284                }
285        }
286
287        // Adressen (Lage) zum FS
288        if($fsgml != $fsalt) { // nur bei geÀndertem Kennz.
289                $lage=lage_zum_fs($fsgml); // die Lage neu ermitteln
290                $fsalt=$fsgml;
291        }
292
293        // Den Ausgabe-Satz montieren aus FlurstÃŒcks-, Grundbuch- und Namens-Teil
294        //      A             B           C             D               E               F            G
295        $fsteil=$fs_kennz.";".$gmkgnr.";".$gemkname.";".$flurnummer.";".$flstnummer.";".$fs_flae.";".$lage.";";
296        //      H              I              J             K           L           M
297        $gbteil=$gb_bezirk.";".$gb_beznam.";".$gb_blatt.";".$bu_lfd.";".$bu_ant.";".$bu_art.";";
298        //       N            O            P            Q         R           S
299        $namteil=$nam_lfd.";".$nam_ant.";".$rechtsg.";".$name.";".$gebdat.";".$adresse;
300
301        // Anteile "GB am FS" und "Pers am GB" verrechnen
302        if ($rechnen) { // beide Anteile verwertbar
303                $formelteil=";=L".$i."*O".$i; // Spalte T
304        } else {
305                $formelteil=';';
306        }
307
308        // Ausgabe in die CSV-Datei -> Download -> Tabellenkalkulation
309        echo "\n".$fsteil.$gbteil.$namteil.$formelteil;
310}
311pg_free_result($res);
312if ($i == 1) { // nur Kopf
313        $err="\nKein Treffer fuer gml_id='".$gmlid."'";
314        exit ($err);
315}
316pg_close($con);
317exit(0);
318?>
Note: See TracBrowser for help on using the repository browser.