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

Revision 425, 12.3 KB checked in by frank.jaeger, 2 years ago (diff)

Web-GIS-Auskunft und Mapbender2-Navigation: neue Konfigurations-Parameter und verbessertes Grundbuch-Modul

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