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

Revision 391, 11.7 KB checked in by frank.jaeger, 6 years ago (diff)

ALKIS-Auskunft: Deutsches Datumsformat tt.mm.jjjj bei Geburtsdatum von Eigentümern und Entstehung des Flurstücks.

RevLine 
[362]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
[377]8        2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermöglichen (Filter Gemeinde)
[387]9        2017-06-06 Validierung Eingabeparameter, Feinkorrekturen
[389]10        2017-10-09 Sauber filtern auf NOT endet IS NULL
[391]11        2017-10-17 Deutsches Datumsformat fÃŒr Zeitpunkt der Entstehung
[362]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='".$_SERVER['PHP_SELF']."?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) {
[377]47//      Schluessel wird ÃŒbergeben, Name dazu in der DB nachschlagen
[362]48        global $con;
[377]49        $sql ="SELECT bezeichnung FROM ax_gemarkung g WHERE g.gemarkungsnummer= $1 AND g.endet IS NULL LIMIT 1;";
[362]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_array($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 der Vorgaenger zum aktuellen Flurst. Ausgabe von Selbst-Links Zeilenweise in <td>.
68// Akt. FS hat keine Verweise auf Vorgaenger. Darum in den Nachfolger-Verweisen von Hist.-FS suchen.
69// Problem: Dies sind Arrays, die nicht performant durchsucht werden koennen.
[377]70        global $gkz, $con, $debug, $showkey, $filtkreis, $filtgem;
[362]71
[389]72        // Bei kleineren Datenbanken keine spÃŒrbare Verzögerung bei Suche mit " = ANY(Array)"
[362]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
[389]79        $sqlv="SELECT  'h' AS ftyp, h.gml_id, h.flurstueckskennzeichen FROM ax_historischesflurstueck h "
80        ."WHERE $1 = ANY (h.nachfolgerflurstueckskennzeichen) AND NOT h.endet IS NULL "
81        ."UNION SELECT 'o' AS ftyp, o.gml_id, o.flurstueckskennzeichen FROM ax_historischesflurstueckohneraumbezug o "
82        ."WHERE $1 = ANY (o.nachfolgerflurstueckskennzeichen) AND NOT o.endet IS NULL "
[362]83        ."ORDER BY flurstueckskennzeichen";
84
85        $v=array($fsk);
86        $resv = pg_prepare("", $sqlv);
87        $resv = pg_execute("", $v);
88        if (!$resv) {
89                echo "\n<p class='err'>Fehler bei Vorg&auml;nger-FS.</p>";
[387]90                if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlv."<br>$1='".$fsk."'</p>";}
[362]91        }
92        $zv=0;
93        while($rowv = pg_fetch_array($resv)) {
94                $ftyp=$rowv["ftyp"];
95                $gmlv=$rowv["gml_id"];
96                $vfsk=$rowv["flurstueckskennzeichen"];
97                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;
[377]98                        if ($showkey) {echo "&amp;showkey=j";}
[362]99                echo "'>".fzerleg($vfsk)."</a><br>";
100                $zv++;
101        }
[389]102        if ($zv == 0) {
103                echo "(keine)";
104        } // else {if ($debug > 2) {echo "\n<p class='dbg'>Treffer=".$zv."</p>";} }
[362]105        return;
106}
107
[387]108// START //
109
[362]110session_start();
[387]111
112$showkey="n"; // Var. aus Parameter initalisieren
113
114$cntget = extract($_GET); // alle Parameter in Variable umwandeln
115
116// strikte Validierung aller Parameter
117if (isset($gmlid)) {
118        if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
119        $fskennz='';
120} else { // Alternativ
121        $gmlid='';
122        if (isset($fskennz)) { // llgggg-fff-11111/222 oder z.B.'052647002001910013__' oder '05264700200012______'
123                if (!preg_match('#^[0-9\-_/]{8,20}$#', $fskennz)) {die ("Eingabefehler fskennz");}
124        } else {
125                $fskennz='';
126        }
127}
128if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
129if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
130if ($showkey == "j") {$showkey=true;} else {$showkey=false;} // "j"/"n" als boolean umwandeln, ist praktischer abzufragen, wird oft gebraucht
131
[362]132require_once("alkis_conf_location.php");
133if ($auth == "mapbender") {require_once($mapbender);}
134include("alkisfkt.php");
[387]135
[362]136?>
[377]137<!doctype html>
138<html lang="de">
[362]139<head>
[377]140        <meta charset="utf-8">
[387]141        <meta name="viewport" content="width=device-width, initial-scale=1.0">
[362]142        <title>ALKIS Flurst&uuml;cks-Historie</title>
143        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
144        <link rel="shortcut icon" type="image/x-icon" href="ico/Flurstueck_Historisch.ico">
145</head>
146<body>
147<?php
[377]148$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisfshist.php'");
[387]149if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
[362]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);
[377]157} elseif ($fskennz != "") { // Alternativ: Flurst.-Kennz. uebergeben
[362]158                $parmtyp="Flurst&uuml;ckskennzeichen";
159                $parmval=$fskennz;
160                $whereclause="WHERE flurstueckskennzeichen= $1 "; // hinten auffuellen mit _ auf 20 Stellen
161                $v = array($fskennz);
[377]162} else { // Pfui!
[362]163                $parmtyp="";
[389]164                die("<p class='err'>Parameter 'gmlid' oder 'fskennz' fehlt.</p>"); // Weitermachen sinnlos
[362]165}
166
167if ($parmtyp != "") { // einer der beiden erlaubten FÀlle
168        // UNION-Abfrage auf 3Àhnliche Tabellen, darin aber immer nur 1 Treffer.
169
[391]170        $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, ";
[362]171
[377]172        if ($filtgem == '') { // Filter Gemeinde ?
173                $wheref='';
174                $whereh='';
175                $whereo='';
176        } else { // ZusÀtze zur WHERE-Clausel
177                $wheref=" AND f.kreis = '".$filtkreis."' AND f.gemeinde = '".$filtgem."' ";
178                $whereh=" AND h.kreis = '".$filtkreis."' AND h.gemeinde = '".$filtgem."' ";
179                $whereo=" AND o.gemeinde = '".$filtgem."' ";
180        }
[362]181
[377]182        $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 "
183        ."UNION SELECT 'h' AS ftyp, ".$felder."nachfolgerflurstueckskennzeichen AS nach, vorgaengerflurstueckskennzeichen AS vor, name FROM ax_historischesflurstueck h ".$whereclause.$whereh." AND h.endet IS NULL "
184        ."UNION SELECT 'o' AS ftyp, ".$felder."nachfolgerflurstueckskennzeichen AS nach, vorgaengerflurstueckskennzeichen AS vor, name FROM ax_historischesflurstueckohneraumbezug o ".$whereclause.$whereo." AND o.endet IS NULL;";
185
[362]186        $resu = pg_prepare("", $sqlu);
187        $resu = pg_execute("", $v);
188        if ($rowu = pg_fetch_array($resu)) {
189                $ftyp=$rowu["ftyp"];
190                $gmkgnr=$rowu["gemarkungsnummer"];
191                $flurnummer=$rowu["flurnummer"];
192                $zaehler=$rowu["zaehler"];
193                $nenner=$rowu["nenner"];
194                $flstnummer=$zaehler;
195                if ($nenner > 0) {$flstnummer.="/".$nenner;} // BruchNr
196                $fskenn=$rowu["flurstueckskennzeichen"];
197                $flae=number_format($rowu["amtlicheflaeche"],0,",",".") . " m&#178;";
198                $name=$rowu["name"]; // in DB ein Array
199                $arrn=explode(",", trim($name, "{}") ); // PHP-Array
200                $gemkname= gemkg_name($gmkgnr);
201                $entsteh=$rowu["zeitpunktderentstehung"];
202                $vor=$rowu["vor"];
203                $nach=$rowu["nach"];
204                if ($gmlid == "") {$gmlid=$rowu["gml_id"];} // fuer selbst-link-Umschalter ueber footer
205        } else {
[377]206                if ($debug > 1) {
207                        echo "<br><p class='err'>Fehler! Kein Treffer f&uuml;r ".$parmtyp." = '".$parmval."'</p><br>";
208                        if ($debug > 2) {
209                                echo "<p class='dbg'>SQL=<br>".$sqlu."<br>$1=".$parmtyp." = '".$parmval."'</p>";
210                        }
211                }
[362]212        }
213}
214
215switch ($ftyp) { // Unterschiede Hist./Aktuell
216        case 'a':
217                $wert = "aktuell";
218                $ico= "Flurstueck.png";
219                $cls= "kennzfs";       
220        break;
221        case 'h':
222                $wert = "historisch<br>(mit Raumbezug)";
223                $ico= "Flurstueck_Historisch.png"; //
224                $cls= "kennzfsh";
225        break;
226        case 'o':
227                $wert = "historisch<br>ohne Raumbezug";
228                $ico= "Flurstueck_Historisch_oR.png";
229                $cls= "kennzfsh";
230        break;
231        default:
232                $wert = "<b>nicht gefunden: ".$parmtyp." = '".$parmval."'</b>";
233                $ico= "Flurstueck_Historisch.png";
234                $cls= "kennzfsh";
235        break;
236}
237
238// Balken
[387]239echo "<p class='fshis'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>";
240echo "\n<h2><img src='ico/".$ico."' width='16' height='16' alt=''> Flurst&uuml;ck Historie</h2>";
[362]241
242echo "\n<table class='outer'>\n<tr>\n\t<td>"; // linke Seite
243        // darin Tabelle Kennzeichen
244        echo "\n\t<table class='".$cls."' title='Flurst&uuml;ckskennzeichen'>\n\t<tr>"
245                ."\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>"
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>"; // rechte Seite
253        // FS-Daten 2 Spalten
254        echo "\n\t<table class='fsd'>"
255                ."\n\t<tr>\n\t\t<td>Entstehung</td>"
256                        ."\n\t\t<td>".$entsteh."</td>"
257                ."\n\t</tr>\n\t<tr>"
258                        ."\n\t\t<td>letz. Fortf</td>"
259                        ."\n\t\t<td title='Jahrgang / Fortf&uuml;hrungsnummer - Fortf&uuml;hrungsart'>";
260                                foreach($arrn AS $val) { // Zeile f. jedes Element
261                                        echo trim($val, '"')."<br>";
262                                }
263                        echo "</td>"
264                ."\n\t</tr>"
265        ."\n\t</table>"
266."\n\t</td>\n</tr>\n</table>";
267
268if ($ftyp == "a") { // Aktuell -> Historie
[377]269        echo "\n<p class='nwlink noprint'>weitere Auskunft: "
270                ."<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$gmlid."&amp;eig=n";
[362]271                        if ($showkey)   {echo "&amp;showkey=j";}
[377]272                        echo "' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck "
273                        ."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>"
274                ."</a>";
[362]275}
[377]276echo "\n<hr>"
277."<table class='outer'>"
[362]278        ."\n<tr>
279                <td class='head'>Flurst&uuml;ck</td>
280                <td class='head'>Vorg&auml;nger</td>
281                <td class='head'>Nachfolger</td>
282        </tr>"; // Head
283       
284        // Spalte 1: F l u r s t ÃŒ c k
285        echo "\n<tr>\n\t<td>"
286                ."<img src='ico/".$ico."' width='16' height='16' alt=''> ".$wert
287                ."<br>Fl&auml;che <span class='flae'>".$flae."</span>"
288        ."</td>";
289
290        // Spalte 2: V o r g À n g e r
291        echo "\n\t<td>";
292        switch ($ftyp) { // Unterschiede Historisch/Aktuell
293                case 'a':
294                        such_vor_arr($fskenn);
295                break;
296                case 'h':
297                        if ($vor == "") {
298                                echo "Geometrische Suche<br>(noch nicht m&ouml;glich)";
299                        } else {
300                                vornach($vor);
301                        }
302                break;
303                case 'o':
304                        vornach($vor);
305                break;
306        }
307        echo"</td>";
308
309        // Spalte 3: N a c h f o l g e r
310        echo "\n\t<td>";
311                vornach($nach);
312        echo "</td>\n</tr>"
313."\n</table>";
314
315if ($debug > 1) {
316        $z=1;
317        while($rowu = pg_fetch_array($resu)) {
318                $ftyp=$rowu["ftyp"];
319                echo "<p class='dbg'>Mehr als EIN Eintrag gefunden: '".$ftyp."' (".$z.")</p>";
320                $z++;
321        }
322}
323?>
324
[377]325<div class='buttonbereich noprint'>
326<hr>
327        <a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
328        <a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
329</div>
[362]330
331<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
332
333</body>
334</html>
Note: See TracBrowser for help on using the repository browser.