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

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