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

Revision 412, 13.3 KB checked in by frank.jaeger, 5 years ago (diff)

Anpassung der ALKIS-Auskunft (PHP) an die Full-Schema-Version des ALKIS-Importers 3.0

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