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

Revision 425, 11.8 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: alkisfshist.php
3
4        ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
5        Flurstuecks-Historie fuer ein Flurstueckskennzeichen aus ALKIS PostNAS
6        Version:
7        2016-02-24 Version fÃŒr norGIS-ALKIS-Import
8        ....
9        2020-02-20 Authentifizierung ausgelegert in Function darf_ich()
10        2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
11        2020-12-15 Input-Validation und Strict Comparisation (===)
12        2021-12-09 Neuer Parameter $PrntBtn (Drucken-SchaltflÀche)
13*/
14
15function fzerleg($fs) {
16/*      Flurstueckskennzeichen (20) zerlegen als lesbares Format (wie im Balken):
17        Dies FS-Kennz-Format wird auch als Eingabe in der Navigation akzeptiert
18   ....*....1....*....2
19   ll    fff     nnnn
20     gggg   zzzzz    __
21*/
22        $fst=rtrim($fs,"_");   
23        $zer=substr ($fst, 2, 4)."-".ltrim(substr($fst, 6, 3), "0")."-<b>".ltrim(substr($fst, 9, 5),"0");
24        $nenn=ltrim(substr($fst, 14), "0");
25        if ($nenn != "") {$zer.="/".$nenn;}
26        $zer.="</b>";
27        return $zer;
28}
29
30function vornach($dbarr) {
31// Datenbank-Array-Feld zeilenweise ausgeben als Selbst-Link
32        global $gkz, $showkey;
33        if ($dbarr == "") {
34                echo "(keine)";
35        } else {
36                $stri=trim($dbarr, "{}");
37                $arr = explode(",",$stri);
38                foreach($arr AS $val){
39                        echo "Flurst&uuml;ck <a title=' zur Flurst&uuml;ck Historie' href='".selbstverlinkung()."?gkz=".$gkz."&amp;fskennz=".$val;
40                        if ($showkey)   {echo "&amp;showkey=j";}
41                        echo "'>".fzerleg($val)."</a><br>";
42                }
43        }
44        return 0;
45}
46
47function gemkg_name($gkey) {
48//      SchlÃŒssel wird ÃŒbergeben, Name dazu in der DB nachschlagen
49        global $con;
50        $sql ="SELECT bezeichnung FROM ax_gemarkung g WHERE g.gemarkungsnummer= $1 AND g.endet IS NULL LIMIT 1;";
51        $v=array($gkey);
52        $res=pg_prepare("", $sql);
53        $res=pg_execute("", $v);
54        if (!$res) {echo "\n<p class='err'>Fehler bei Gemarkung.</p>";}
55        $gmkg="";
56        $zeianz=pg_num_rows($res);
57        if ($zeianz > 1){
58                echo "\n<p class='err'>Die Abfrage liefert mehr als eine (".$zeianz.") Gemarkung!</p>";
59                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gkey."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
60        } elseif ($zeianz === 0) {
61                echo "\n<p class='err'>Gemarkung ".$gkey." ist unbekannt.</p>";
62                return;
63        }
64        if ($row = pg_fetch_assoc($res)) {
65                $gmkg=$row["bezeichnung"];
66        }
67        return $gmkg;
68}
69
70function such_vor_arr($fsk) {
71// Suchen VorgÀnger zum aktuellen Flurst. Ausgabe von Selbst-Links Zeilenweise in <td>.
72// Akt. FS und hist.FS hat keine Verweise auf VorgÀnger. Darum in den Nachfolger-Verweisen von Hist.-FS suchen.
73        global $gkz, $con, $dbg, $showkey, $filtkreis, $filtgem;
74
75        $sqlv="SELECT 'h' AS ftyp, h.gml_id, h.flurstueckskennzeichen FROM ax_historischesflurstueck h "
76        ."WHERE $1 = ANY (h.nachfolgerflurstueckskennzeichen) AND h.endet IS NULL "
77        ."UNION SELECT 'o' AS ftyp, o.gml_id, o.flurstueckskennzeichen FROM ax_historischesflurstueckohneraumbezug o "
78        ."WHERE $1 = ANY (o.nachfolgerflurstueckskennzeichen) AND o.endet IS NULL ORDER BY flurstueckskennzeichen";
79
80        $v=array($fsk);
81        $resv = pg_prepare("", $sqlv);
82        $resv = pg_execute("", $v);
83        if (!$resv) {
84                echo "\n<p class='err'>Fehler bei Vorg&auml;nger-FS.</p>";
85                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$fsk."'", $sqlv)."</p>";}
86        }
87        $zv=0;
88        while($rowv = pg_fetch_assoc($resv)) {
89                $ftyp=$rowv["ftyp"];
90                $gmlv=$rowv["gml_id"];
91                $vfsk=$rowv["flurstueckskennzeichen"];
92                echo "Flurst&uuml;ck <a title='Historie des Vorg&auml;ngerflurst&uuml;cks' href='".selbstverlinkung()."?gkz=".$gkz."&amp;fskennz=".$vfsk."&amp;gmlid=".$gmlv;
93                        if ($showkey) {echo "&amp;showkey=j";}
94                echo "'>".fzerleg($vfsk)."</a><br>";
95                $zv++;
96        }
97        if ($zv === 0) {
98                echo "(keine)";
99        }
100        return;
101}
102
103// Start
104
105ini_set("session.cookie_httponly", 1);
106session_start();
107$showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
108$cntget = extract($_GET); // alle Parameter in Variable umwandeln
109
110// strikte Validierung aller Parameter
111if (isset($gmlid)) {
112        if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
113        $fskennz='';
114} else { // Alternativ
115        $gmlid='';
116        if (isset($fskennz)) { // llgggg-fff-11111/222 oder z.B.'052647002001910013__' oder '05264700200012______'
117                if (!preg_match('#^[0-9\-_/]{8,20}$#', $fskennz)) {die ("Eingabefehler fskennz");}
118        } else {
119                $fskennz='';
120                die("Fehlender Parameter");
121        }
122}
123if (isset($gkz)) {
124        if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
125} else {
126        die("Fehlender Parameter");
127}
128if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
129if ($showkey === "j") {$showkey=true;} else {$showkey=false;} // "j"/"n" als boolean umwandeln, ist praktischer abzufragen, wird oft gebraucht
130if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
131
132include "alkis_conf_location.php";
133include "alkisfkt.php";
134
135echo <<<END
136<!doctype html>
137<html lang="de">
138<head>
139        <meta charset="utf-8">
140        <meta name="viewport" content="width=device-width, initial-scale=1.0">
141        <title>ALKIS Flurst&uuml;cks-Historie</title>
142        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
143        <link rel="shortcut icon" type="image/x-icon" href="ico/Flurstueck_Historisch.ico">
144</head>
145<body>
146END;
147
148$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
149$dbg=$debug; // CONF in Arbeits-Variable
150
151// Mit URL-Parameter "&nodebug=j" kann man die Entwicklungsumgebung (in Conf definiert) ausschalten.
152// Wirkt temporÀr und wird nicht in Links weiter gereicht.
153if ($nodebug === "j") {$dbg=0;}
154
155$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisfshist.php'");
156if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
157
158// Such-Parameter bekommen? Welche?
159if ($gmlid != "") { // Ja, die GML wurde uebergeben
160        $parmtyp="GML";
161        $parmval=$gmlid;
162        $whereclause="WHERE gml_id= $1 ";
163        $v = array($gmlid);
164} elseif ($fskennz != "") { // Alternativ: Flurst.-Kennz. ÃŒbergeben
165                $parmtyp="Flurst&uuml;ckskennzeichen";
166                $parmval=$fskennz;
167                $whereclause="WHERE flurstueckskennzeichen= $1 ";
168                $v=array(fskenn_dbformat($fskennz));
169} else { // Pfui!
170                $parmtyp="";
171                die("Fehlender Parameter");
172}
173
174if ($parmtyp != "") { // einer der beiden erlaubten FÀlle
175        // UNION-Abfrage auf 3 Àhnliche Tabellen, darin aber immer nur 1 Treffer.
176        $felder="gml_id, flurnummer, cast(zaehler AS character varying), cast(nenner AS character varying), flurstueckskennzeichen, amtlicheflaeche, to_char(cast(zeitpunktderentstehung AS date),'DD.MM.YYYY') AS zeitpunktderentstehung, gemarkungsnummer, ";
177
178        if ($filtgem === '') { // Filter Gemeinde ?
179                $wheref='';
180                $whereh='';
181                $whereo='';
182        } else { // ZusÀtze zur WHERE-Clausel
183                $wheref=" AND f.gemeindezugehoerigkeit_kreis = '".$filtkreis."' AND f.gemeindezugehoerigkeit_gemeinde = '".$filtgem."' ";
184                $whereh=" AND (h.gemeindezugehoerigkeit_kreis IS NULL OR h.gemeindezugehoerigkeit_kreis = '".$filtkreis."' ) AND (h.gemeindezugehoerigkeit_gemeinde IS NULL OR h.gemeindezugehoerigkeit_gemeinde = '".$filtgem."') ";
185                $whereo=" AND (o.gemeindezugehoerigkeit_gemeinde IS NULL OR o.gemeindezugehoerigkeit_gemeinde = '".$filtgem."') ";
186        }
187
188        $sqlu ="SELECT 'a' AS ftyp, ".$felder."null::character varying[] AS nach, null::character varying[] AS vor, zeigtaufexternes_art AS zart, zeigtaufexternes_name AS zname FROM ax_flurstueck f ".$whereclause.$wheref." AND f.endet IS NULL "
189        ."UNION SELECT 'h' AS ftyp, ".$felder."nachfolgerflurstueckskennzeichen AS nach, null AS vor, zeigtaufexternes_art AS zart, zeigtaufexternes_name AS zname FROM ax_historischesflurstueck h ".$whereclause.$whereh." AND h.endet IS NULL "
190        ."UNION SELECT 'o' AS ftyp, ".$felder."nachfolgerflurstueckskennzeichen AS nach, vorgaengerflurstueckskennzeichen AS vor, zeigtaufexternes_art AS zart, zeigtaufexternes_name AS zname FROM ax_historischesflurstueckohneraumbezug o ".$whereclause.$whereo." AND o.endet IS NULL;";
191
192        $resu = pg_prepare("", $sqlu);
193        $resu = pg_execute("", $v);
194        if ($rowu = pg_fetch_assoc($resu)) {
195                $ftyp=$rowu["ftyp"];
196                $gmkgnr=$rowu["gemarkungsnummer"];
197                $flurnummer=$rowu["flurnummer"];
198                $zaehler=$rowu["zaehler"];
199                $nenner=$rowu["nenner"];
200                $flstnummer=$zaehler;
201                if ($nenner > 0) {$flstnummer.="/".$nenner;} // BruchNr
202                $fskenn=$rowu["flurstueckskennzeichen"];
203                $flae=number_format($rowu["amtlicheflaeche"],0,",",".") . " m&#178;";
204                $gemkname= gemkg_name($gmkgnr);
205                $vor=$rowu["vor"];
206                $nach=$rowu["nach"];
207                $entsteh=$rowu["zeitpunktderentstehung"];
208                $zeart=$rowu["zart"];
209                $zename=$rowu["zname"];
210                if ($gmlid == "") {$gmlid=$rowu["gml_id"];} // fÃŒr selbst-link-Umschalter ÃŒber footer
211
212                switch ($ftyp) { // Diff. Hist./Akt.
213                        case 'a':
214                                $wert = "aktuell";
215                                $ico= "Flurstueck.png";
216                                $cls= "kennzfs";       
217                        break;
218                        case 'h':
219                                $wert = "historisch<br>(mit Raumbezug)";
220                                $ico= "Flurstueck_Historisch.png"; //
221                                $cls= "kennzfsh";
222                        break;
223                        case 'o':
224                                $wert = "historisch<br>ohne Raumbezug";
225                                $ico= "Flurstueck_Historisch_oR.png";
226                                $cls= "kennzfsh";
227                        break;
228                        default:
229                                $wert = "<b>nicht gefunden: ".$parmtyp." = '".$parmval."'</b>";
230                                $ico= "Flurstueck_Historisch.png";
231                                $cls= "kennzfsh";
232                        break;
233                }
234        } else {
235                if ($dbg > 1) {
236                        echo "<br><p class='err'>Fehler! Kein Treffer f&uuml;r ".$parmtyp." = '".$parmval."'</p><br>";
237                        if ($dbg > 2) {
238                                echo "<p class='dbg'>SQL=<br>".str_replace("$1", "'".$v[0]."'", $sqlu)."</p>";
239                        }
240                }
241        }
242}
243
244// Balken
245echo "<p class='balken fshis'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>";
246echo "\n<h2>Flurst&uuml;ck Historie</h2>";
247
248echo "\n<table class='outer'>\n<tr>\n\t<td>"
249        ."\n\t<tr>\n\t\t<td class='ll'><img src='ico/".$ico."' width='16' height='16' alt=''> Kennzeichen:</td>" // Links
250        ."\n\t\t<td>" // Mitte
251        ."\n\t<table class='".$cls."' title='Flurst&uuml;ckskennzeichen'>\n\t<tr>" // innere Tabelle Kennzeichen
252                ."\n\t\t<td class='head'>Gemarkung</td>\n\t\t<td class='head'>Flur</td>\n\t\t<td class='head'>Flurst-Nr.</td>\n\t</tr>"
253                ."\n\t<tr>\n\t\t<td title='Gemarkung'>";
254                if ($showkey) {echo "<span class='key'>".$gmkgnr."</span><br>";}
255                echo $gemkname."&nbsp;</td>"
256                ."\n\t\t<td title='Flurnummer'>".$flurnummer."</td>"
257                ."\n\t\t<td title='Flurst&uuml;cksnummer (Z&auml;hler / Nenner)'><span class='wichtig'>".$flstnummer."</span></td>\n\t</tr>"
258        ."\n\t</table>"
259."\n\t</td>\n\t<td>";
260fortfuehrungen($entsteh, $zeart, $zename);
261echo "\n\t</td>\n</tr>\n</table>";
262
263if ($ftyp === "a") { // Aktuell -> Historie
264        echo "\n<p class='nwlink noprint'>weitere Auskunft: "
265                ."<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$gmlid."&amp;eig=n";
266                        if ($showkey)   {echo "&amp;showkey=j";}
267                        echo "' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
268                        ."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>"
269                ."</a>";
270}
271echo "\n<hr>"
272."<table class='outer'>"
273        ."\n<tr>
274                <td class='head'>Flurst&uuml;ck</td>
275                <td class='head'>Vorg&auml;nger</td>
276                <td class='head'>Nachfolger</td>
277        </tr>"; // Head
278       
279        // Spalte 1: F l u r s t ÃŒ c k
280        echo "\n<tr>\n\t<td>"
281                ."<img src='ico/".$ico."' width='16' height='16' alt=''> ".$wert
282                ."<br>Fl&auml;che <span class='flae'>".$flae."</span>"
283        ."</td>";
284
285        // Spalte 2: V o r g À n g e r
286        echo "\n\t<td>";
287        switch ($ftyp) { // Diff. Hist./Akt.
288                case 'a':
289                        such_vor_arr($fskenn);
290                break;
291                case 'h':
292                        such_vor_arr($fskenn);
293                break;
294                case 'o':
295                        vornach($vor);
296                break;
297        }
298        echo"</td>";
299
300        // Spalte 3: N a c h f o l g e r
301        echo "\n\t<td>";
302                vornach($nach);
303        echo "</td>\n</tr>"
304."\n</table>";
305
306if ($dbg > 1) {
307        $z=1;
308        while($rowu = pg_fetch_assoc($resu)) {
309                $ftyp=$rowu["ftyp"];
310                echo "<p class='dbg'>Mehr als EIN Eintrag gefunden: '".$ftyp."' (".$z.")</p>";
311                $z++;
312        }
313}
314echo "<div class='buttonbereich noprint'>\n<hr>"
315        ."\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;";
316if ($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;";}
317echo "\n</div>";
318
319footer($gmlid, selbstverlinkung()."?", "");
320?>
321
322</body>
323</html>
Note: See TracBrowser for help on using the repository browser.