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

Revision 387, 11.4 KB checked in by frank.jaeger, 3 years ago (diff)

Überarbeitung der Buchauskunft: FS-Nachweis enthält optional die berechtigten Buchungen, Input-Validation, Styling, kleinere Korrekturen, HTML-Profilierung

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        2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermöglichen (Filter Gemeinde)
9        2017-06-06 Validierung Eingabeparameter, Feinkorrekturen
10*/
11
12function fzerleg($fs) {
13/*      Flurstueckskennzeichen (20) zerlegen als lesbares Format (wie im Balken):
14        Dies FS-Kennz-Format wird auch als Eingabe in der Navigation akzeptiert
15   ....*....1....*....2
16   ll    fff     nnnn
17     gggg   zzzzz    __
18*/
19        $fst=rtrim($fs,"_");   
20        $zer=substr ($fst, 2, 4)."-".ltrim(substr($fst, 6, 3), "0")."-<b>".ltrim(substr($fst, 9, 5),"0");
21        $nenn=ltrim(substr($fst, 14), "0");
22        if ($nenn != "") {$zer.="/".$nenn;}
23        $zer.="</b>";
24        return $zer;
25}
26
27function vornach($dbarr) {
28// Datenbank-Array-Feld zeilenweise ausgeben als Selbst-Link
29        global $gkz, $showkey;
30        if ($dbarr == "") {
31                echo "(keine)";
32        } else {
33                $stri=trim($dbarr, "{}");
34                $arr = explode(",",$stri);
35                foreach($arr AS $val){
36                        echo "Flurst&uuml;ck <a title=' zur Flurst&uuml;ck Historie' href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;fskennz=".$val;
37                        if ($showkey)   {echo "&amp;showkey=j";}
38                        echo "'>".fzerleg($val)."</a><br>";
39                }
40        }
41        return 0;
42}
43
44function gemkg_name($gkey) {
45//      Schluessel wird ÃŒbergeben, Name dazu in der DB nachschlagen
46        global $con;
47        $sql ="SELECT bezeichnung FROM ax_gemarkung g WHERE g.gemarkungsnummer= $1 AND g.endet IS NULL LIMIT 1;";
48        $v=array($gkey);
49        $res=pg_prepare("", $sql);
50        $res=pg_execute("", $v);
51        if (!$res) {echo "\n<p class='err'>Fehler bei Gemarkung.</p>";}
52        $zgmk=0;
53        while($row = pg_fetch_array($res)) { // eigentlich nur EINE
54                $gmkg=$row["bezeichnung"];
55                $zgmk++;
56        }
57        if ($zgmk == 0) {
58                echo "\n<p class='err'>Gemarkung ".$gkey." ist unbekannt.</p>";
59                return;
60        }
61        return $gmkg;
62}
63
64function such_vor_arr($fsk) {
65// Suchen der Vorgaenger zum aktuellen Flurst. Ausgabe von Selbst-Links Zeilenweise in <td>.
66// Akt. FS hat keine Verweise auf Vorgaenger. Darum in den Nachfolger-Verweisen von Hist.-FS suchen.
67// Problem: Dies sind Arrays, die nicht performant durchsucht werden koennen.
68        global $gkz, $con, $debug, $showkey, $filtkreis, $filtgem;
69
70        $wherecl="WHERE $1 = ANY (nachfolgerflurstueckskennzeichen) ";
71
72        // Bei kleinere Datenbanken keine spÃŒrbare Verzögerung bei Suche mit " = ANY(Array)"
73        // FÃŒr grosse BestÀnde zusÀtzlich filtern ÃŒber indizierte Felder Gemarkung + Flur?
74        // Dazu die nÀchsten 2 Zeilen aktivieren.     
75//      $wherecl.="AND gemarkungsnummer=".substr($fsk, 2, 4)." ";
76//      $wherecl.="AND flurnummer=".ltrim(substr($fsk, 6, 3), "0")." ";
77        // Frage: kann das bei Historisierung wechseln? (Umflurung, Umgemarkung). Dann ggf. Fehler (nicht gefunden)
78
79        $sqlv="SELECT 'h' AS ftyp, gml_id, flurstueckskennzeichen FROM ax_historischesflurstueck h ".$wherecl
80        ."UNION SELECT 'o' AS ftyp, gml_id, flurstueckskennzeichen FROM ax_historischesflurstueckohneraumbezug o ".$wherecl
81        ."ORDER BY flurstueckskennzeichen";
82
83        $v=array($fsk);
84        $resv = pg_prepare("", $sqlv);
85        $resv = pg_execute("", $v);
86        if (!$resv) {
87                echo "\n<p class='err'>Fehler bei Vorg&auml;nger-FS.</p>";
88                if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlv."<br>$1='".$fsk."'</p>";}
89        }
90        $zv=0;
91        while($rowv = pg_fetch_array($resv)) {
92                $ftyp=$rowv["ftyp"];
93                $gmlv=$rowv["gml_id"];
94                $vfsk=$rowv["flurstueckskennzeichen"];
95                echo "Flurst&uuml;ck <a title='Historie des Vorg&auml;ngerflurst&uuml;cks' href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;fskennz=".$vfsk."&amp;gmlid=".$gmlv;
96                        if ($showkey) {echo "&amp;showkey=j";}
97                echo "'>".fzerleg($vfsk)."</a><br>";
98                $zv++;
99        }
100        if ($zv == 0) {echo "(keine)";}
101        return;
102}
103
104// START //
105
106session_start();
107
108$showkey="n"; // Var. aus Parameter initalisieren
109
110$cntget = extract($_GET); // alle Parameter in Variable umwandeln
111
112// strikte Validierung aller Parameter
113if (isset($gmlid)) {
114        if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
115        $fskennz='';
116} else { // Alternativ
117        $gmlid='';
118        if (isset($fskennz)) { // llgggg-fff-11111/222 oder z.B.'052647002001910013__' oder '05264700200012______'
119                if (!preg_match('#^[0-9\-_/]{8,20}$#', $fskennz)) {die ("Eingabefehler fskennz");}
120        } else {
121                $fskennz='';
122        }
123}
124if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
125if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
126if ($showkey == "j") {$showkey=true;} else {$showkey=false;} // "j"/"n" als boolean umwandeln, ist praktischer abzufragen, wird oft gebraucht
127
128require_once("alkis_conf_location.php");
129if ($auth == "mapbender") {require_once($mapbender);}
130include("alkisfkt.php");
131
132?>
133<!doctype html>
134<html lang="de">
135<head>
136        <meta charset="utf-8">
137        <meta name="viewport" content="width=device-width, initial-scale=1.0">
138        <title>ALKIS Flurst&uuml;cks-Historie</title>
139        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
140        <link rel="shortcut icon" type="image/x-icon" href="ico/Flurstueck_Historisch.ico">
141</head>
142<body>
143<?php
144$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisfshist.php'");
145if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
146
147// Such-Parameter bekommen? Welche?
148if ($gmlid != "") { // Ja, die GML wurde uebergeben
149        $parmtyp="GML";
150        $parmval=$gmlid;
151        $whereclause="WHERE gml_id= $1 ";
152        $v = array($gmlid);
153} elseif ($fskennz != "") { // Alternativ: Flurst.-Kennz. uebergeben
154                $parmtyp="Flurst&uuml;ckskennzeichen";
155                $parmval=$fskennz;
156                $whereclause="WHERE flurstueckskennzeichen= $1 "; // hinten auffuellen mit _ auf 20 Stellen
157                $v = array($fskennz);
158} else { // Pfui!
159                $parmtyp="";
160                echo "<p class='err'>Parameter 'gmlid' oder 'fskennz' fehlt.</p>";
161}
162
163if ($parmtyp != "") { // einer der beiden erlaubten FÀlle
164        // UNION-Abfrage auf 3Àhnliche Tabellen, darin aber immer nur 1 Treffer.
165        // norGIS: unterschiedliche Formate der gleichen Spalten, Typumwandlung "cast" verwenden.
166
167        $felder="gml_id, flurnummer, cast(zaehler AS character varying), cast(nenner AS character varying), flurstueckskennzeichen, amtlicheflaeche, zeitpunktderentstehung, gemarkungsnummer, ";
168
169        if ($filtgem == '') { // Filter Gemeinde ?
170                $wheref='';
171                $whereh='';
172                $whereo='';
173        } else { // ZusÀtze zur WHERE-Clausel
174                $wheref=" AND f.kreis = '".$filtkreis."' AND f.gemeinde = '".$filtgem."' ";
175                $whereh=" AND h.kreis = '".$filtkreis."' AND h.gemeinde = '".$filtgem."' ";
176                $whereo=" AND o.gemeinde = '".$filtgem."' ";
177        }
178
179        $sqlu ="SELECT 'a' AS ftyp, ".$felder."null AS nach, null AS vor, null AS \"name\" FROM ax_flurstueck f ".$whereclause.$wheref." AND f.endet IS NULL "
180        ."UNION SELECT 'h' AS ftyp, ".$felder."nachfolgerflurstueckskennzeichen AS nach, vorgaengerflurstueckskennzeichen AS vor, name FROM ax_historischesflurstueck h ".$whereclause.$whereh." AND h.endet IS NULL "
181        ."UNION SELECT 'o' AS ftyp, ".$felder."nachfolgerflurstueckskennzeichen AS nach, vorgaengerflurstueckskennzeichen AS vor, name FROM ax_historischesflurstueckohneraumbezug o ".$whereclause.$whereo." AND o.endet IS NULL;";
182
183        $resu = pg_prepare("", $sqlu);
184        $resu = pg_execute("", $v);
185        if ($rowu = pg_fetch_array($resu)) {
186                $ftyp=$rowu["ftyp"];
187                $gmkgnr=$rowu["gemarkungsnummer"];
188                $flurnummer=$rowu["flurnummer"];
189                $zaehler=$rowu["zaehler"];
190                $nenner=$rowu["nenner"];
191                $flstnummer=$zaehler;
192                if ($nenner > 0) {$flstnummer.="/".$nenner;} // BruchNr
193                $fskenn=$rowu["flurstueckskennzeichen"];
194                $flae=number_format($rowu["amtlicheflaeche"],0,",",".") . " m&#178;";
195                $name=$rowu["name"]; // in DB ein Array
196                $arrn=explode(",", trim($name, "{}") ); // PHP-Array
197                $gemkname= gemkg_name($gmkgnr);
198                $entsteh=$rowu["zeitpunktderentstehung"];
199                $vor=$rowu["vor"];
200                $nach=$rowu["nach"];
201                if ($gmlid == "") {$gmlid=$rowu["gml_id"];} // fuer selbst-link-Umschalter ueber footer
202        } else {
203                if ($debug > 1) {
204                        echo "<br><p class='err'>Fehler! Kein Treffer f&uuml;r ".$parmtyp." = '".$parmval."'</p><br>";
205                        if ($debug > 2) {
206                                echo "<p class='dbg'>SQL=<br>".$sqlu."<br>$1=".$parmtyp." = '".$parmval."'</p>";
207                        }
208                }
209        }
210}
211
212switch ($ftyp) { // Unterschiede Hist./Aktuell
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
235// Balken
236echo "<p class='fshis'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>";
237echo "\n<h2><img src='ico/".$ico."' width='16' height='16' alt=''> Flurst&uuml;ck Historie</h2>";
238
239echo "\n<table class='outer'>\n<tr>\n\t<td>"; // linke Seite
240        // darin Tabelle Kennzeichen
241        echo "\n\t<table class='".$cls."' title='Flurst&uuml;ckskennzeichen'>\n\t<tr>"
242                ."\n\t\t<td class='head'>Gmkg</td>\n\t\t<td class='head'>Flur</td>\n\t\t<td class='head'>Flurst-Nr.</td>\n\t</tr>"
243                ."\n\t<tr>\n\t\t<td title='Gemarkung'>";
244                if ($showkey) {echo "<span class='key'>".$gmkgnr."</span><br>";}
245                echo $gemkname."&nbsp;</td>"
246                ."\n\t\t<td title='Flurnummer'>".$flurnummer."</td>"
247                ."\n\t\t<td title='Flurst&uuml;cksnummer (Z&auml;hler / Nenner)'><span class='wichtig'>".$flstnummer."</span></td>\n\t</tr>"
248        ."\n\t</table>"
249."\n\t</td>\n\t<td>"; // rechte Seite
250        // FS-Daten 2 Spalten
251        echo "\n\t<table class='fsd'>"
252                ."\n\t<tr>\n\t\t<td>Entstehung</td>"
253                        ."\n\t\t<td>".$entsteh."</td>"
254                ."\n\t</tr>\n\t<tr>"
255                        ."\n\t\t<td>letz. Fortf</td>"
256                        ."\n\t\t<td title='Jahrgang / Fortf&uuml;hrungsnummer - Fortf&uuml;hrungsart'>";
257                                foreach($arrn AS $val) { // Zeile f. jedes Element
258                                        echo trim($val, '"')."<br>";
259                                }
260                        echo "</td>"
261                ."\n\t</tr>"
262        ."\n\t</table>"
263."\n\t</td>\n</tr>\n</table>";
264
265if ($ftyp == "a") { // Aktuell -> Historie
266        echo "\n<p class='nwlink noprint'>weitere Auskunft: "
267                ."<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$gmlid."&amp;eig=n";
268                        if ($showkey)   {echo "&amp;showkey=j";}
269                        echo "' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
270                        ."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>"
271                ."</a>";
272}
273echo "\n<hr>"
274."<table class='outer'>"
275        ."\n<tr>
276                <td class='head'>Flurst&uuml;ck</td>
277                <td class='head'>Vorg&auml;nger</td>
278                <td class='head'>Nachfolger</td>
279        </tr>"; // Head
280       
281        // Spalte 1: F l u r s t ÃŒ c k
282        echo "\n<tr>\n\t<td>"
283                ."<img src='ico/".$ico."' width='16' height='16' alt=''> ".$wert
284                ."<br>Fl&auml;che <span class='flae'>".$flae."</span>"
285        ."</td>";
286
287        // Spalte 2: V o r g À n g e r
288        echo "\n\t<td>";
289        switch ($ftyp) { // Unterschiede Historisch/Aktuell
290                case 'a':
291                        such_vor_arr($fskenn);
292                break;
293                case 'h':
294                        if ($vor == "") {
295                                echo "Geometrische Suche<br>(noch nicht m&ouml;glich)";
296                        } else {
297                                vornach($vor);
298                        }
299                break;
300                case 'o':
301                        vornach($vor);
302                break;
303        }
304        echo"</td>";
305
306        // Spalte 3: N a c h f o l g e r
307        echo "\n\t<td>";
308                vornach($nach);
309        echo "</td>\n</tr>"
310."\n</table>";
311
312if ($debug > 1) {
313        $z=1;
314        while($rowu = pg_fetch_array($resu)) {
315                $ftyp=$rowu["ftyp"];
316                echo "<p class='dbg'>Mehr als EIN Eintrag gefunden: '".$ftyp."' (".$z.")</p>";
317                $z++;
318        }
319}
320?>
321
322<div class='buttonbereich noprint'>
323<hr>
324        <a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
325        <a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
326</div>
327
328<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
329
330</body>
331</html>
Note: See TracBrowser for help on using the repository browser.