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

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