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

Revision 389, 11.6 KB checked in by frank.jaeger, 2 years ago (diff)

ALKIS Buchauskunft überarbeitet: Bodenschätzung im FS-Nachweis. Filter auf "endet IS NULL".

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