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

Revision 378, 10.8 KB checked in by frank.jaeger, 7 years ago (diff)

Sortierung und Filter bei CSV-Export zur "Straße"

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