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

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