source: trunk/info/info/alkisn/alkisgsnw.php @ 422

Revision 422, 11.2 KB checked in by frank.jaeger, 3 years ago (diff)

Aktualisierungen der ALKIS-Buchauskunft, neues Modul für Bauwerke, Härtung

Line 
1<?php
2/*      Modul: alkisgsnw.php
3
4        ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
5        GrundstÃŒcksnachweis fuer ein GrundstÃŒck aus ALKIS PostNAS
6
7        Version:
8        2018-05-03 Neues Modul "gsnw" abgeleitet aus "fsnw"
9        2018-11-09 Umstellung Full-Schema
10        2020-02-20 Authentifizierung ausgelagert in Function darf_ich()
11        2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
12        2020-12-15 Input-Validation und Strict Comparisation (===)
13
14++ ToDo: Den Fall berÌcksichtigen, dass die Buchung vorhanden ist, aber das GB nicht (ModellschwÀche). Meldungen ausgeben.
15*/
16
17function get_GS_Daten($gmlid, $gskennz) {
18// Daten zur Buchungsstelle (GS = GrundstÃŒck) aus der DB lesen.
19// Suche wahlweise ÃŒber die GML-ID oder ÃŒber das GrundstÃŒcks-Kennzeichen (Bezirk-Blatt-LfdNr) aus der URL.
20        global $gkz, $showkey, $debug, $defland, $gsbez, $gsblatt, $gslfdnr, $gsbart;
21
22        $sqlgs="SELECT s.gml_id, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, s.laufendenummer, s.buchungsart "
23                ."FROM ax_buchungsstelle s JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id ";
24        // Falls das Buchungsblatt fehlt (ModellschwÀche) wÀre ein LEFT JOIN hier nÃŒtzlich. Das Fehlen aber kontrollieren! ++
25
26        if ($gskennz == '') { // normaler Link ÃŒber gmlid
27                $sqlgs.="WHERE s.gml_id= $1 ";
28                $v=array($gmlid);
29        } else { // Kennzeichen "Bezirk-Blatt-BVNR" alternativ zur gml_id
30                $arr=explode("-", $gskennz, 4); // zerlegen
31                $zbez=trim($arr[0]); // Bezirk
32                if (strlen($zbez) === 6) {
33                        $land=substr($zbez, 0, 2);
34                        $zbez=substr($zbez, 2, 4);
35                } else { // kein schöner Land ..
36                        $land=$defland; // Default aus config
37                }
38                $zblatt=$arr[1];
39                if (preg_match('#^[0-9]{1,6}$#', $zblatt)) { // Nur numerisch
40                        $zblatt=str_pad($zblatt, 6, "0", STR_PAD_LEFT)." "; // 6 Nr + 1 blank
41                } elseif (preg_match('#^[0-9A-Z]{1,7}$#', $zblatt)) { // +++ A nur in LETZTER Stelle prÃŒfen
42                        $zblatt=str_pad($zblatt, 7, "0", STR_PAD_LEFT); // 6 Nr + 1 "A", gesamt 7
43                } else {
44                        die("Fehler in Buchungsblatt im Parameter 'gskennz'.");
45                }
46                $zlfdnr=str_pad($arr[2], 4, "0", STR_PAD_LEFT); // Lfd.-Nr./BVNR
47                $sqlgs.="WHERE b.land= $1 AND b.bezirk= $2 AND b.buchungsblattnummermitbuchstabenerweiterung= $3 AND s.laufendenummer= $4 ";
48                $v=array($land, $zbez, $zblatt, $zlfdnr);
49        }
50        // egal ob Suche mit gmlid ODER Kennzeichen
51        $sqlgs.="AND b.endet IS NULL AND s.endet IS NULL;";
52        $resgs=pg_prepare("", $sqlgs);
53        $resgs=pg_execute("", $v);
54        if ($rowgs=pg_fetch_assoc($resgs)) {
55                $gmlid=$rowgs["gml_id"];
56                $gsbez=$rowgs["bezirk"];
57                $gsblatt=$rowgs["blatt"];
58                $gslfdnr=$rowgs["laufendenummer"];
59                $gsbart=$rowgs["buchungsart"];
60        } else {
61                echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r Grundst&uuml;ckskennzeichen='".$gskennz."'</p>\n</body>\n</html>";
62                return "";
63        }
64        pg_free_result($resgs);
65        return $gmlid;
66}
67
68function bs_dienend($gmlid_h) {
69// Eine ggf. vorhandene dienende Buchungsstelle suchen und dessen GML_ID liefern.
70        global $debug, $gerooted;
71        // BS-herrschend (bekannt)  >an[]>  BS-dienend (gesucht)
72        $sqld="SELECT d.gml_id FROM ax_buchungsstelle d JOIN ax_buchungsstelle h ON d.gml_id=any(h.an) "
73                ."WHERE h.gml_id = $1 and d.endet IS NULL AND h.endet IS NULL";
74        $v=array($gmlid_h);
75        $resd=pg_prepare("", $sqld);
76        $resd=pg_execute("", $v);
77        $cntd=0;
78        while($rowd=pg_fetch_assoc($resd)) {
79                $cntd++;
80                $gmlid_d=$rowd["gml_id"];
81        }
82        if ($cntd === 0) { // KEINE dienende BS
83                $gmlid_d="";
84        } elseif ($cntd > 1) { // Problem: mehrere dienende BS
85                $gmlid_d=""; // wennn mehrere (.an=Array[]), dann nicht eindeutig rÃŒckfÃŒhrbar.
86                $gerooted=false; // Root nicht erreicht
87                if ($debug > 2 ) { // Meldung? Auswahl?
88                        echo "\n<p class='err'>Mehrere 'diendende' Buchungen zur Buchung '".$gmlid_h."'</p>";
89                }
90        }
91        pg_free_result($resd);
92        return $gmlid_d;
93}
94
95function Back2theRoots($gmlid_h) {
96// Eine Buchungsstelle (aus dem Aufruf-Parameter) zurÃŒck fÃŒhren auf die Basis-Buchungsstelle
97// Suchen bis Buchungsart="GrundstÃŒck" oder ggf. Blattart="fiktives Blatt"
98        global $debug;
99        $gh=$gmlid_h; // herrschend
100        $gd=$gh; // dienend
101        $gr=$gd; // root
102        while($gd != "") {
103                $gr=$gd; // sichern
104                $gd=bs_dienend($gh); // an?
105                $gh=$gd; // fuer weitere Loop
106        }
107        return $gr;
108}
109
110// H i e r   S t a r t
111ini_set("session.cookie_httponly", 1);
112session_start();
113$showkey="n"; $nodebug="";
114$cntget=extract($_GET); // Parameter in Variable
115
116// Validierung
117if (isset($gmlid)) { // gml der Buchungsstelle (Aufruf)
118        if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
119        $gskennz='';
120} else { // Alternativ
121        $gmlid='';
122        if (isset($gskennz)) { // llgggg-bbbbbz-nnnn
123                if (!preg_match('#^[0-9\-_/]{8,18}$#', $gskennz)) {die ("Eingabefehler gskennz");}
124        } else {
125                $gskennz='';
126                die("Fehlender Parameter");
127        }
128}
129if (isset($gkz)) {
130        if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
131} else {
132        die("Fehlender Parameter");
133}
134if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
135if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
136if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
137
138include "alkis_conf_location.php";
139include "alkisfkt.php";
140?>
141<!doctype html>
142<html lang="de">
143<head>
144        <meta charset="utf-8">
145        <meta name="viewport" content="width=device-width, initial-scale=1.0">
146        <title>ALKIS Grundst&uuml;cksnachweis</title>
147        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
148        <link rel="shortcut icon" type="image/x-icon" href="ico/Grundstueck.ico">
149        <script>
150                function ALKISexport(gmlid) {
151                        window.open('alkisexport.php?gkz=<?php echo $gkz;?>&tabtyp=buchung&gmlid=' + gmlid);
152                }
153        </script>
154</head>
155<body>
156<?php
157$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
158
159if ($nodebug === "j") {$debug=0;}
160$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisgsnw.php'");
161if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
162
163$gmlid_p=$gmlid; // Wert aus Parameter merken
164$gerooted=true; // Auskunft beginnt mit dienendem GrundstÃŒck
165$gmlid=get_GS_Daten($gmlid, $gskennz); // nachschauen
166$gml_anfrd=$gmlid; // ursprÃŒngliche Anforderung aus URL merken
167if ($gmlid == "") { // nix gefunden
168        die("Kein Treffer");
169} else { // Treffer
170        if ($gsbart != "1100") { // Buchungsart "GrundstÃŒck"
171                $gmlid_r=Back2theRoots($gmlid);
172                if ($gmlid_r != $gmlid) { // wurde hoch gerÃŒckt
173                        $gmlid=get_GS_Daten($gmlid_r, ""); // damit weiter arbeiten
174                }
175        }
176}
177echo "<p class='balken gskennz'>ALKIS Grundst&uuml;ck ".$gsbez."-".rtrim($gsblatt)."-".$gslfdnr."&nbsp;</p>\n\n<h2>Grundst&uuml;ck</h2>"; // Balken
178
179if ($gerooted) {
180        // F l u r s t u e c k e
181        echo "\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurst&uuml;cke</h3>"
182                ."\n<table class='fs'>";
183        echo "\n<tr>" // Kopfzeile
184                ."\n\t<td class='heads'>Gemarkung</td>"
185                ."\n\t<td class='heads'>Flur</td>"
186                ."\n\t<td class='heads fsnr' title='Flurst&uuml;cksnummer (Z&auml;hler / Nenner)'><span class='wichtig'>Flurst.</span></td>"
187                ."\n\t<td class='head flag'>Fl&auml;che</td>"
188                ."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>"
189        ."\n</tr>";
190        //++ Lage oder Nutzung zum FS in eine zus. Spalte oder Zeile?
191        //++ Tabelle hat noch Platz, SQL in der Loop oder Subquery wÀre möglich, weil i.d.R. nur wenige FS je GS gebucht sind.
192
193        $sqlfs="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche
194        FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer
195        WHERE f.istgebucht = $1 AND f.endet IS NULL AND g.endet IS NULL ";
196        if ($filtgem === '' ) { // ungefiltert
197                $v=array($gmlid);
198        } else {
199                $sqlfs.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÀndiges Gebiet
200                $v=array($gmlid, $filtkreis, $filtgem);
201        }
202        $sqlfs.="ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
203        $resfs = pg_prepare("", $sqlfs);
204        $resfs = pg_execute("", $v);
205        if (!$resfs) {echo "\n<p class='err'>Fehler bei Flurst&uuml;ck</p>";}
206
207        $j=0;
208        $zpaar=false;
209        while($rowfs = pg_fetch_assoc($resfs)) {
210                $flur= $rowfs["flurnummer"];
211                $fskenn=$rowfs["zaehler"];
212                if ($rowfs["nenner"] != "") {$fskenn.="/".$rowfs["nenner"];}
213                $flae=number_format($rowfs["amtlicheflaeche"],0,",",".") . " m&#178;";
214
215                if ($zpaar) {$trclass='paa';} else {$trclass='unp';} // Farbwechsel
216                $zpaar=!$zpaar;
217                echo "\n<tr class='".$trclass."'>"; // eine Zeile je Flurstueck
218                        echo "\n\t<td>";
219                                if ($showkey) {echo "<span class='key'>".$rowfs["gemarkungsnummer"]."</span> ";}
220                                echo $rowfs["bezeichnung"]
221                        ."</td>"
222                        ."\n\t<td>".$flur."</td>"
223                        ."\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>"
224                        ."\n\t<td class='fla'>".$flae."</td>"
225                        ."\n\t<td>\n\t\t<p class='nwlink noprint'>"
226                                ."\n\t\t\t<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$rowfs["gml_id"]."&amp;eig=n";
227                                        if ($showkey) {echo "&amp;showkey=j";}
228                                        echo "' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
229                                        ."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>"
230                                ."</a>\n\t\t</p>"
231                        ."\n\t</td>"
232                ."\n</tr>";
233                $j++;
234        }
235        pg_free_result($resfs);
236        if ($j === 0) {echo "\n<tr class='unp'>\n\t<td colspan='5'><p class='warn'>Keine Flurst&uuml;cke im berechtigten Bereich.</p></td>\n</tr>";}
237        echo "\n</table>";
238} else { // konnte nicht bis zur Basis aufsteigen
239        echo "<p>Die angeforderte Buchung hat Rechte an mehreren anderen Buchungen."
240        ."<br>F&uuml;r die Anzeige der Flurst&uuml;cke muss eine dieser Buchungen (Grundst&uuml;ck) gew&auml;hlt werden.</p>";
241        // Auswahl anbieten? Sonst ÃŒber den Link "Bestand" recherchieren.
242}
243
244// Rechte anderer GS an diesem GS
245// Dieser Teil ist fast identisch mit "FlurstÃŒcksnachweis", Kommentare siehe dort.
246$bartgrp="";
247$barttypgrp="";
248echo "\n<table class='outer'>";
249        $stufe=1;
250        $gezeigt = buchung_anzg($gmlid, "j", false, "", 2);
251        $anzber=ber_bs_zaehl($gmlid);
252        $verf_next = array($gmlid);
253        while ($anzber > 0 ) {
254                $verf_akt=$verf_next;
255                $verf_next=array();
256                $stufe++;
257                $i=0;
258                foreach($verf_akt as $gml_ber_bs) {
259                        $i++;
260                        if (ber_bs_zaehl($gml_ber_bs) > 0) {
261                                $verf_neu=ber_bs_anzg($gml_ber_bs, "j", false, "", $gml_anfrd);
262                                $anz_neu=count($verf_neu);
263                                if ($anz_neu > 0) {
264                                        $verf_next=array_merge($verf_next, $verf_neu);
265                                }
266                        }
267                }
268                $anzber=count($verf_next);
269        }
270echo "\n</table>\n\n";
271//if ($debug > 1) {echo "<p class='dbg'>Buchung gezeigt = ".$gezeigt."</p>";}
272
273pg_close($con);
274echo <<<END
275<div class='buttonbereich noprint'>
276<hr>
277        <a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
278        <a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
279END;
280if ($stufe < 3) {
281        echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"".$gmlid."\")'><img src='ico/download_gs.png' width='32' height='16' alt='Export'></a>";
282} else { // Export CSV wÀre unvollstÀndig bei Buchungen auf mehr als 2 Ebenen. 2 Ebenen werden im View Ìber UNION und einem Zweig mit 2x "an"-Relation abgefangen.
283        echo "\n\t<img src='ico/download_gs_no.png' width='32' height='16' alt='Export' title='Komplexe Buchungen ÃŒber ".$stufe." Ebenen sind nicht als lineare CSV-Datei exportierbar'>";
284}
285echo "&nbsp;\n</div>";
286
287footer($gmlid, selbstverlinkung()."?", "");
288?>
289</body>
290</html>
Note: See TracBrowser for help on using the repository browser.