source: trunk/mapbender/http/nav/alkisnav_fls.php @ 399

Revision 399, 29.8 KB checked in by frank.jaeger, 6 years ago (diff)

ALKIS-Navigation für Mapbender 2: Input Validation für alle Parameter. Kleine Korrekturen.

Line 
1<?php
2/*      Navigation mit ALKIS-Daten im Mapbender 2 - Teil FlurstÃŒck-Suche
3        Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
4Version vom
5        2016-02-11 Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
6        2016-03-02 $gemeinde auf feste LÀnge korrigieren
7        2016-11-28 Gemeinsam genutzte Datenbanken ermöglichen
8        2017-03-06 Korrektur: Gemeinde-Suche bei Kreis-DB in norGIS-Struktur
9        2018-02-15 Strikte Input-Validation der Parameter
10*/
11
12$cntget = extract($_GET);
13
14// Input-Validation
15// Parameter aus Konfiguration oder Links sollten keine "Eingabefehler" enthalten.
16// Entweder falsche Konfiguration oder Hack. Programm sofort abbrechen.
17if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} // Mandant, muss!
18
19if(isset($epsg)) { // SRS, kann. Wenn als Parameter ...
20        if (preg_match('#^EPSG:[0-9]{4,5}$#', $epsg)) { // Prefix aus MB-Mapframe
21                $epsg = str_replace("EPSG:", "" , $epsg);
22        } elseif (!preg_match('#^[0-9]{4,5}$#', $epsg)) { // nur die Nummer
23                die("Eingabefehler epsg");
24        }
25} else { // Nichts ÃŒbergeben
26        $epsg=$gui_epsg; // dann default aus Conf
27}
28
29// Filter-Parameter fÃŒr Gemeindenummer in Kreis-Datenbank aus der Mapbender GUI-Konfiguration
30if (isset($gemeinde) AND trim($gemeinde, '0') != "") {
31        if (!preg_match('#^[0-9]{1,3}$#', $gemeinde)) {die("Eingabefehler Gemeinde");}
32        $gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT);
33        if(strpos($gemeinde, ",") === false) {
34                $gfilter = 1; // Einzelwert
35        } else {
36                $gfilter = 2; // Liste
37        }
38} else { // Kein Filter
39        $gemeinde = "";
40        $gfilter = 0;
41}
42
43// Suche nach historischen FS
44if(isset($hist)) { // Wenn ÃŒbergeben
45        if (!preg_match('#^[jn]{1}$#', $hist)) {die("Eingabefehler hist");} // Ja/Nein
46        if ($hist == "j") {
47                $phist = true; // als Boolean
48        } else {
49                $phist = false;
50        }
51} else { // Nichts ÃŒbergeben
52        $phist = false; // default = aktuelle FS
53}
54
55// Gemeinde-Nummer als Link aus der Baumstruktur
56if (isset($gm) ) {
57        if (!preg_match('#^[0-9]{8}$#', $gm)) {die("Eingabefehler gm");}
58} else {
59        $gm=""; // Var. init.
60}
61
62include("../../conf/alkisnav_conf.php");
63include("alkisnav_fkt.php"); // Funktionen
64$con = pg_connect ($dbconn) or die ("Fehler bei der Verbindung zur Datenbank ".$dbpre.$dbgkz);
65
66echo <<<END
67<!doctype html>
68<html lang="de">
69<head>
70        <meta http-equiv="cache-control" content="no-cache">
71        <meta http-equiv="pragma" content="no-cache">
72        <meta http-equiv="expires" content="0">
73        <meta charset="utf-8">
74        <title>ALKIS-Suche Flurst&uuml;ck</title>
75        <link rel="stylesheet" type="text/css" href="alkisnav.css">
76        <script type="text/javascript">
77                function imFenster(dieURL) {
78                        var link = encodeURI(dieURL);
79                        window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
80                }
81                function transtitle(trans) {
82                        document.getElementById('transaktiontitle').innerHTML = trans;
83                }
84        </script>
85</head>
86<body>
87<a href='javascript:history.back()'>
88        <img src="ico/zurueck.png" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
89</a>&nbsp;
90<span title='zuletzt ausgef&uuml;hrte Aktion'>
91        <dfn class='title' id='transaktiontitle'></dfn>
92</span>
93
94END;
95
96function h_hinten($zahl) {
97        // Testen: Wurde an eine Zahl ein "h" angehÀngt?
98        // Wenn ja, dann Schalter setzen und nur den numerischen Teil zurÃŒck geben.
99        global $phist, $debug;
100        $zahl=trim($zahl);
101        $zlen=strlen($zahl) - 1;
102        if ($zlen > 0) {
103                $hinten = ucfirst(substr($zahl, $zlen, 1));
104                if ($hinten == "H" ) {
105                        $vorn=trim(substr($zahl, 0, $zlen));
106                        if (is_ne_zahl($vorn)) { // Zahl *und* "H"
107                                $zahl = $vorn;
108                                $phist = true;
109                        }
110                }
111        }
112        return $zahl;
113}
114
115function ZerlegungFsKennz($fskennz) {
116        // Das eingegebene FlurstÃŒcks-Kennzeichen auseinander nehmen. Erwartet wird (ll)gggg-fff-zzzz/nnn
117        // Die Teile der *Z*erlegung werden ÃŒber die Global-Variablen "$z..." allen Functions bereit gestellt.
118        // Der Returncode dieser Function steuert die weitere Verarbeitung.
119        global $debug, $land, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner; 
120        $arr = explode("-", $fskennz, 4); // an den Trenn-Strichen aufteilen
121
122        // Gemarkung mit oder ohne Land davor? In der Eingabe soll beides zulÀssig sein.
123        // Bei den SQL-Abfragen in der norGIS-ALKIS-Importer Datenbankstruktur werden abwechselnd beide
124        // Formate benötigt: z.B. ax_gemarkungsteilflur.gemarkung -> 4stellig, gema_shl.gemashl -> 6stellig
125        // Also gleich beide Formate vorhalten.
126        $gemkg=trim($arr[0]);
127
128        if (count($arr) > 1) {
129                $zflur=h_hinten($arr[1]);
130                if (count($arr) > 2) {
131                        $zfsnr=trim($arr[2]);
132                } else {
133                        $zfsnr="";
134                }
135        } else {
136                $zflur="";
137                $zfsnr="";
138        }
139        if ($debug > 1) {echo "<p class='dbg'>Gemkg: '".$gemkg."' Flur: '".$zflur."' NR: '".$zfsnr."'</p>";}
140
141        if ($gemkg == "") {
142                return 0; // Gemeinden oder Gemarkungen listen
143        } elseif ( ! is_ne_zahl($gemkg)) {
144                return 1; // Such Name
145        }
146
147        // Gemarkungs-NUMMER wurde eingegeben. Mit oder ohne Land davor?
148        if (strlen($gemkg) == 4 ) { // Eingabe ohne Land
149                $zgemkg4=$gemkg;                // 4stellige Version ohne Land
150                $zgemkg6=$land.$gemkg;  // 6stellige Version mit  Land
151        } elseif (strlen($gemkg) == 6 ) { // Eingabe mit Land
152                $zgemkg4=substr($gemkg, 2);
153                $zgemkg6=$gemkg;
154                if (substr($gemkg, 0, 2) != $land) { // Passt Eingabe zu Conf?
155                        echo "<p class='err'>Die 6-stellige Gemarkungsnummer '".$zgemkg6."' sollte mit Land '".$land."' beginnen.</p>";
156                }
157        } else { // weder noch
158                $zgemkg4=$gemkg; // kann eigentlich nicht funktionieren
159                $zgemkg6=$gemkg; // Nullen davor setzen?
160                echo "<p class='err'>Die Gemarkungsnummer kann 4- oder 6-stellig (mit Land '".$land."') eingegeben werden.</p>";
161        }
162
163        if ($zflur == "") { // keine Eingabe Flur-Nummer
164                return 2; // also nur Gemarkungs-Nr eingegeben
165        } elseif ( ! is_ne_zahl($zflur)) {
166                echo "<p class='err'>Die Flurnummer '".$zflur."' ist nicht numerisch</p>";
167                return 9;
168        } elseif ($zfsnr == "") { // Flur eingegeben, aber keine FlurstÃŒcksnummer mehr
169                return 3; // Flur                               
170        } else {
171                $zn=explode("/", $zfsnr, 2); // Bruchnummer?
172                $zzaehler=h_hinten(trim($zn[0]));
173                if (count($zn) > 1) {$znenner=h_hinten(trim($zn[1]));} else {$znenner="";}
174                if ( ! is_ne_zahl($zzaehler)) {
175                        echo "<p class='err'>FlurstÃŒcksnummer '".$zzaehler."' ist nicht numerisch</p>";
176                        return 9;
177                } elseif ($znenner == "") {
178                        return 4;
179                } elseif (is_ne_zahl($znenner)) {
180                        return 5;                                                               
181                } else {
182                        echo "<p class='err'>FlurstÃŒcks-Nenner '".$znenner."' ist nicht numerisch</p>";
183                        return 9;
184                }
185        }
186}
187
188function flurstueckskoordinaten($gml) {
189        // Die Koordinaten zu einem FlurstÃŒck aus der Datenbank liefern
190        // Parameter: gml_id des FlurstÃŒcke
191        // Return: Array(x,y)
192        global $epsg;
193        $sqlk ="SELECT ";
194        if($epsg == "25832") { // Transform nicht notwendig
195                $sqlk.="st_x(st_Centroid(wkb_geometry)) AS x, ";
196                $sqlk.="st_y(st_Centroid(wkb_geometry)) AS y ";
197        } else { 
198                $sqlk.="st_x(st_transform(st_Centroid(wkb_geometry), ".$epsg.")) AS x, ";
199                $sqlk.="st_y(st_transform(st_Centroid(wkb_geometry), ".$epsg.")) AS y ";                       
200        }
201        $sqlk.="FROM ax_flurstueck WHERE gml_id= $1 AND endet IS NULL;";
202        $v=array($gml);
203        $resk=pg_prepare("", $sqlk);
204        $resk=pg_execute("", $v);
205        if (!$resk) {echo "\n<p class='err'>Fehler bei Koordinate.</p>";}
206        $rowk = pg_fetch_array($resk);
207        $koor=array("x" => $rowk["x"], "y" => $rowk["y"]);
208        return $koor;
209}
210
211function zeile_flur($gkgnr, $flurnr, $histlnk, $aktuell) {
212        // Eine Kopf-Zeile zur Flur ausgeben
213        global $gkz, $gemeinde, $epsg;
214
215        if ($aktuell) {$cls=" aktuell";} else {$cls="";}
216        echo "\n<div class='fl".$cls."' title='Flur'>";
217        echo "\n\t\t<img class='nwlink' src='ico/Flur.png' width='16' height='16' alt='FL' title='Flur'> ";
218        $url=$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$gkgnr."-".$flurnr;
219        echo "<a title='Aktuelle Flurst&uuml;cke suchen' href='".$url."'>Flur ".$flurnr." </a>";
220
221        if ($histlnk) { // Link zur Historie-Suche anbieten
222                echo " <a class='hislnk' title='Historische Flurst&uuml;cke der Flur suchen' href='".$url."&amp;hist=j'>Hist.</a>";
223        }
224        echo "\n</div>";       
225        return;
226}
227
228function zeile_hist_fs($fs_gml, $fskenn, $ftyp, $gknr, $flur, $aktuell) {
229        // Eine Zeile fÃŒr ein historisches FlurstÃŒck ausgeben
230        global $gkz, $gemeinde, $epsg, $auskpath;
231        if ($ftyp == "h") {
232                $ico="Flurstueck_Historisch_Lnk.png";
233                $titl="Historisches Flurst&uuml;ck";
234        } else {
235                $ico="Flurstueck_Historisch_oR_Lnk.png";
236                $titl="Historisches Flurst&uuml;ck ohne Raumbezug";
237        }
238        if ($aktuell) {$cls=" aktuell";} else {$cls="";}
239        echo "\n<div class='hi".$cls."' title='".$titl."'>";
240
241        // Icon -> Buchnachweis
242        echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisfshist.php?gkz=".$gkz."&amp;gmlid=".$fs_gml."\")'>";
243                echo "\n\t\t<img class='nwlink' src='ico/".$ico."' width='16' height='16' alt='Hist' title='".$titl."'>";
244        echo "\n\t</a>";
245
246        // Zeile -> tiefer in die Historie
247        $flurl =$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;hist=j";
248        $flurl.="&amp;fskennz=".$gknr."-".$flur."-";
249        echo "\n\thist. Flst. <a href='".$flurl.$fskenn."'>".$fskenn."</a>";           
250
251        echo "\n</div>";
252        return;
253}
254
255function zeile_nachf_fs($gml, $gknr, $flur, $fskenn, $ftyp) {
256        // Eine Zeile fÃŒr ein Nachfolger-FlurstÃŒck eines hist. Fs. ausgeben
257        global $gkz, $gemeinde, $epsg, $auskpath;
258
259        $fs=$gknr."-".$flur."-".$fskenn;
260        switch ($ftyp) {
261        case "a": // eine FS-Zeile mit Link ausgeben (EinrÃŒckung css passt nicht)
262                $koor=flurstueckskoordinaten($gml);
263                zeile_flurstueck($gml, $fskenn, $koor["x"], $koor["y"], "", "", false);
264                return;
265                break;
266        case "h":
267                $ico="Flurstueck_Historisch_Lnk.png";
268                $titl="Historisches Flurst&uuml;ck";
269                $hisparm="&amp;hist=j";
270                $auskprog="alkisfshist";
271                break;
272        case "o":
273                $ico="Flurstueck_Historisch_oR_Lnk.png";
274                $titl="Historisches Flurst&uuml;ck ohne Raumbezug";
275                $hisparm="&amp;hist=j";
276                $auskprog="alkisfshist";
277                break;
278        }
279        // fÃŒr die Hist.-FÀlle:
280        echo "\n<div class='hn' title='Nachfolger: ".$titl."'>";                       
281                echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath.$auskprog.".php?gkz=".$gkz."&amp;gmlid=".$gml."\")'>";
282                        echo "\n\t\t<img class='nwlink' src='ico/".$ico."' width='16' height='16' alt='FS' title='Nachweis'>";
283                echo "\n\t</a> ";               
284                echo "Flst. <a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$fs.$hisparm."'>".$fskenn."</a>";                                     
285        echo "\n</div>";
286        return;
287}
288
289function ListGemeinden() {
290        // Bei Leereingabe im Formular die berechtigte(n) Gemeinde(n) auflisten
291        global $con, $gkz, $gemeinde, $epsg, $debug, $gfilter;
292        $linelimit=60;
293
294        $sql ="SELECT trim(trailing from gemshl) as gemshl, gemname FROM gem_shl ";
295        switch ($gfilter) {
296                case 1: // Einzelwert
297                        $sql.="WHERE substring(gemshl from 6 for 3) = '".$gemeinde."' ";
298                        break;
299                case 2: // Liste
300                        $sql.="WHERE substring(gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') ";
301                        break;
302                default: break;
303        }
304        $sql.="ORDER BY gemname LIMIT $1 ;";
305        $res=pg_prepare("", $sql);
306        $res=pg_execute("", array($linelimit));
307        if (!$res) {
308                echo "\n<p class='err'>Fehler bei Gemeinde</p>";
309                if ($debug >= 3) {echo "\n<p class='dbg'>".$sql."</p>";} // ++Nur Entw.
310                return 0;
311        }
312        $cnt = 0;
313        while($row = pg_fetch_array($res)) {
314                $gnr=$row["gemshl"];
315                $gemeindename=$row["gemname"];
316                zeile_gemeinde($gnr, $gemeindename, false);
317                $cnt++;
318        }
319        // Foot
320        if($cnt == 0) {
321                echo "\n<p class='anz'>Keine Gemeinde.</p>";
322        } elseif($cnt >= $linelimit) {
323                echo "\n<p class='anz' title='Bitte eindeutiger qualifizieren'>".$cnt." Gemeinden ... und weitere</p>";
324        } elseif($cnt == 1) { // Eindeutig!
325                return $gnr;
326        } else {
327                echo "\n<p class='anz'>".$cnt." Gemeinden</p>";
328        }
329        return;
330}
331
332function ListGmkgInGemeinde($gkey, $bez) {
333        // Die Gemarkungen zu einem Gemeinde-Key (aus Link) listen
334        global $con, $gkz, $gemeinde, $epsg, $debug, $gfilter;
335        $linelimit=70;
336
337        // Head
338        zeile_gemeinde($gkey, $bez, true);
339
340        // Body
341        $sql ="SELECT gemashl, trim(trailing from gemarkung) AS gemarkung FROM gema_shl WHERE substring(gemshl from 1 for 8) = $1 ORDER BY gemarkung LIMIT $2 ;";
342        $res=pg_prepare("", $sql);
343        $res=pg_execute("", array($gkey, $linelimit));
344        if (!$res) {
345                echo "\n<p class='err'>Fehler bei Gemarkungen</p>";
346                return 1;
347        }
348        $cnt = 0;
349        while($row = pg_fetch_array($res)) {
350                $gnr=$row["gemashl"]; // 6stellig
351                $gnam=$row["gemarkung"];
352                zeile_gemarkung($gnr, $gnam, false);
353                $cnt++;
354        }
355        // Foot
356        if($cnt == 0){
357                echo "\n<p class='anz'>Keine Gemarkung.</p>";
358        } elseif($cnt >= $linelimit) {
359                echo "\n<p class='anz' title='Bitte eindeutiger qualifizieren'>".$cnt." Gemarkungen ... und weitere</p>";
360        } elseif($cnt == 1) { // Eindeutig!
361                return $gnr;
362        } else {
363                echo "\n<p class='anz'>".$cnt." Gemarkungen</p>";
364        }
365        return;
366}
367
368function SuchGmkgName() {
369        // Gemarkung suchen nach Name(-nsanfang)
370        global $con, $gkz, $gemeinde, $epsg, $debug, $fskennz, $gfilter;
371        $linelimit=120;
372        if(preg_match("/\*/",$fskennz)){
373                $match = trim(preg_replace("/\*/i","%", strtoupper($fskennz)));
374                // Durchsuchte Namenspalte ist rechts mit Leerstellen aufgefÃŒllt. Darum Wildcard am Ende erzwingen.
375                if (substr($match, strlen($match), 1) != "%") {$match.="%";}
376        } else {
377                $match = trim($fskennz)."%";
378        }
379
380        // Pass auf! GemeindeschlÃŒssel ist in den beiden SchlÃŒsseltabellen linksbÃŒndig gefÃŒllt,
381        // aber unterschiedlich lang hinten mit Leerstellen aufgefÃŒllt.
382        $sql ="SELECT substring(g.gemshl from 1 for 8) AS gemshl, g.gemashl, trim(trailing from g.gemarkung) AS gemarkung, trim(trailing from s.gemname) AS gemname "
383        ."FROM gema_shl g JOIN gem_shl s ON substring(g.gemshl from 1 for 8) = substring(s.gemshl from 1 for 8) WHERE g.gemarkung ILIKE $1 ";
384
385        switch ($gfilter) {
386                case 1: // Einzelwert
387                        $sql.="AND substring(g.gemshl from 6 for 3)='".$gemeinde."'"; break;
388                case 2: // Liste
389                        $sql.="AND substring(g.gemshl from 6 for 3) in ("."'".str_replace(",", "','", $gemeinde)."'".") "; break;
390        }
391        $sql.=" ORDER BY s.gemname, g.gemarkung LIMIT $2 ;";
392
393        $v=array($match, $linelimit);
394        $res=pg_prepare("", $sql);
395        $res=pg_execute("", $v);
396        if (!$res) {
397                echo "\n<p class='err'>Fehler bei Gemarkung</p>";
398                return;
399        }
400        $cnt = 0;
401        $gwgem="";
402        while($row = pg_fetch_array($res)) {
403                $gemeindename=$row["gemname"];
404                if ($gwgem != $gemeindename) { // Gruppierung Gemeinde
405                        $gwgem = $gemeindename;
406                        $skey=$row["gemshl"];
407                        zeile_gemeinde($skey, $gemeindename, false);
408                }
409                $gnam=$row["gemarkung"];
410                $gnr=$row["gemashl"]; // 6stellig
411                zeile_gemarkung($gnr, $gnam, false); // wenn am Ende nur ein Treffer, dann aktuell=true
412                $cnt++;
413        }
414        // Foot
415        if($cnt == 0){
416                echo "\n<p class='anz'>Keine Gemarkung.</p>";
417                if ($debug > 1) {
418/*
419                        // Nach Umstellung auf NorGIS-Struktur muss im Mapbender die Gemeinde 3stellig konfiguriert werden
420                        if (strlen($gemeinde) < 3) {
421                                echo "<p class='err'>URL-Parameter &gemeinde=nnn im Mapbender gazetteer_alkis.SRC muss 3stellig sein!<br>Ist aber '".$gemeinde."'.</p>";
422                        }
423*/
424                        if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1 = ".$match."</p>";}
425                }
426        } elseif($cnt >= $linelimit) {
427                echo "\n<p class='anz' title='Bitte eindeutiger qualifizieren'>".$cnt." Gemarkungen ... und weitere</p>";
428        } elseif($cnt == 1) { // Eindeutig!
429                return $gnr; // 6stellige Gemarkungsnummer!
430        } else {
431                echo "\n<p class='anz'>".$cnt." Gemarkungen</p>";
432        }
433        return;
434}
435
436function gg_head($gkgnr6, $gkgaktuell) {
437        // Gemeinde und Gemarkung (G+G) Kopf-Zeilen ausgeben
438        // Parameter: Gemarkungsnummer (6stellig), aktuell hervorzuhebende Zeile
439        // Return: true/false ob gefunden
440
441        $sqlh ="SELECT g.gemarkung, substring(s.gemshl from 1 for 8) AS gemshl, trim(trailing from s.gemname) AS gemname
442        FROM gema_shl g JOIN gem_shl s ON g.gemshl=s.gemshl WHERE g.gemashl = $1 ;";
443
444        $v=array($gkgnr6);
445        $resh=pg_prepare("", $sqlh);
446        $resh=pg_execute("", $v);
447
448        if (!$resh) {echo "\n<p class='err'>Fehler bei Gemeinde und Gemarkung.</p>";}
449
450        if ($rowh = pg_fetch_array($resh)) {
451                $gmkg=$rowh["gemarkung"];
452                $skey=$rowh["gemshl"];
453                $snam=$rowh["gemname"];
454                zeile_gemeinde($skey, $snam, false);
455                zeile_gemarkung($gkgnr6, $gmkg, $gkgaktuell);
456                return true;
457    } else {
458                echo "\n<div class='gk' title='Gemarkung'>";
459                echo "\n\t\t<img class='nwlink' src='ico/Gemarkung.png' width='16' height='16' alt='GKG' title='Gemarkung'>";
460                echo " Gemarkung ".$gkgnr6." nicht gefunden!\n</div>";
461                return false;
462        }
463}
464
465function EineGemarkung($AuchGemkZeile) {
466        // Kennzeichen bestehend nur aus Gemarkung-SchlÃŒssel wurde eingegeben
467        global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg4, $zgemkg6;
468        $linelimit=120; // max.Fluren/Gemkg
469
470        // Head
471        if ($AuchGemkZeile) { // Kopf davor ausgeben
472                if (! gg_head($zgemkg6, true)) {
473                        if ($debug >= 1) {echo "\n<p class='dbg'>Gem.-Gemkg.-Kopf abgebrochen</p>";}   
474                        return false;
475                }
476        }
477
478        // Body
479        $sql ="SELECT gemarkungsteilflur AS flur FROM ax_gemarkungsteilflur f WHERE gemarkung= $1 ORDER BY gemarkungsteilflur LIMIT $2 ;";
480        $v=array($zgemkg4, $linelimit);
481        $res=pg_prepare("", $sql);
482        $res=pg_execute("", $v);
483
484        if (!$res) {echo "\n<p class='err'>Fehler bei Flur.</p>";}
485        $zfl=0;
486        while($row = pg_fetch_array($res)) {   
487                $zflur=$row["flur"];
488                zeile_flur($zgemkg4, $zflur, false, false);
489                $zfl++;
490        }
491
492        // Foot
493        if($zfl == 0) {
494                echo "\n<p class='anz'>Keine Flur.</p>";
495        } elseif($zfl >= $linelimit) {
496                echo "\n<p class='anz'>".$zfl." Fluren ... und weitere</p>";
497        } elseif($zfl > 1) {
498                echo "\n<p class='anz'>".$zfl." Fluren</p>";
499        }
500        return true;
501}
502
503function EineFlur() {
504        // Kennzeichen aus Gemarkung und FlurNr wurde eingegeben, dazu aktuelle FlurstÃŒcke suchen
505        global $con, $gkz, $gemeinde, $epsg, $debug, $zgemkg4, $zgemkg6, $zflur;
506        $linelimit=900; // Wie groß kann eine Flur sein?
507
508        // Head
509        if (gg_head($zgemkg6, false)) {
510                zeile_flur($zgemkg4, $zflur, true, true);
511        } else {
512                return false;
513        }
514
515        // Body
516        $sql ="SELECT f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.gemeinde, ";
517        if($epsg == "25832") { // Transform nicht notwendig
518                $sql.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
519                $sql.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
520        } else { 
521                $sql.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
522                $sql.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";                       
523        }
524
525        $sql.="FROM ax_flurstueck f WHERE f.gemarkungsnummer= $1 AND f.flurnummer= $2 AND endet IS NULL
526        ORDER BY f.zaehler, f.nenner LIMIT $3 ;";
527        $v=array($zgemkg4, $zflur, $linelimit);
528        $res=pg_prepare("", $sql);
529        $res=pg_execute("", $v);
530        if (!$res) {echo "\n<p class='err'>Fehler bei Flur.</p>";}
531        $zfs=0;
532        while($row = pg_fetch_array($res)) {   
533                $fs_gml=$row["gml_id"];
534                $flur=$row["flurnummer"];
535                $fskenn=$row["zaehler"];
536                if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
537                zeile_flurstueck($fs_gml, $fskenn, $row["x"], $row["y"], "", "", false);
538                $zfs++;
539        }
540
541        // Flur-Foot
542        if($zfs == 0) {
543                echo "\n<p class='anz'>Kein Flurst&uuml;ck.</p>";
544        } elseif($zfs >= $linelimit) {
545                echo "\n<p class='anz'>".$zfs." Flurst&uuml;cke... und weitere</p>";
546        } elseif($zfs > 1) {
547                echo "\n<p class='anz'>".$zfs." Flurst&uuml;cke</p>";
548        }
549        return true;
550}
551
552function HistFlur() {
553        // Kennzeichen aus Gemarkung und FlurNr wurde eingegeben, "h" dahinter.
554        // Die Flur nach historischen FlurstÃŒcken durchsuchen
555        global $con, $gkz, $gemeinde, $epsg, $debug, $scalefs, $auskpath, $land, $zgemkg4, $zgemkg6, $zflur;
556        $linelimit=500;
557
558        // Head
559        if (gg_head($zgemkg6, false)) {
560                zeile_flur($zgemkg4, $zflur, true, true);
561        } else {
562                return false;
563        }
564
565        // Body
566        $whcl="WHERE flurstueckskennzeichen like $1 AND endet IS NULL ";
567
568        $sql ="SELECT 'h' AS ftyp, gml_id, cast(zaehler AS integer) AS zaehler, cast(nenner AS integer) AS nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueck ".$whcl;
569        $sql.="UNION SELECT 'o' AS ftyp, gml_id, cast(zaehler AS integer) AS zaehler, cast(nenner AS integer) AS nenner, nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueckohneraumbezug ".$whcl;
570        $sql.="ORDER BY zaehler, nenner LIMIT $2 ;";
571        // "zaehler" und "nenner" sind in der Classic-Datenbank Integer-Werte aber in der Struktur
572        // des norGIS-ALKIS-Importers sind das Character-Strings, die linksbÃŒndig ohne fÃŒhrende Nullen gefÃŒllt sind.
573        // Der Anwender erwartet aber eine "numerische" Sortierung.
574
575        $fskzwhere=$zgemkg6.str_pad($zflur, 3, "0", STR_PAD_LEFT)."%";
576        $v=array($fskzwhere, $linelimit);
577        $res=pg_prepare("", $sql);
578        $res=pg_execute("", $v);
579        if (!$res) {echo "\n<p class='err'>Fehler bei Historie Flur.</p>";}
580        $zfs=0;
581        while($row = pg_fetch_array($res)) {   
582                $ftyp=$row["ftyp"];
583                $fs_gml=$row["gml_id"]; // fuer Buchausk.
584                $fskenn=$row["zaehler"];
585                if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // Bruchnummer
586                zeile_hist_fs($fs_gml, $fskenn, $ftyp, $zgemkg4, $zflur, false);
587                $zfs++;
588        }
589
590        // Foot
591        if($zfs == 0) {
592                echo "\n<p class='anz'>Kein historisches Flurst&uuml;ck.</p>";
593                #if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1 = ".$fskzwhere."</p>";}
594        } elseif ($zfs >= $linelimit) {
595                echo "\n<p class='anz'>".$zfs." historische Flurst. ... und weitere</p>";
596        } elseif($zfs > 1) {
597                echo "\n<p class='anz'>".$zfs." historische Flurst&uuml;cke</p>";
598        }
599        return true;
600}
601
602function EinFlurstueck() {
603        // FlurstÃŒckskennzeichen wurde komplett bis zum Zaehler (oder Nenner) eingegeben
604        // Sonderfall: bei Bruchnummer, mehrere Nenner zum Zaehler suchen wenn kein Nenner eingegeben wurde.
605        global $con, $gkz, $debug, $epsg, $gemeinde, $fskennz, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;
606
607        // Head
608        if (gg_head($zgemkg6, false)) { // Kopfzeilen: Gemeinde, Gemerkung, ..
609                zeile_flur($zgemkg4, $zflur, true, false); // .., Flur
610        } else {
611                return false;
612        }
613
614        // Body
615        $sql ="SELECT f.gml_id, f.flurnummer, f.zaehler, f.nenner, ";
616        if($epsg == "25832") { // Transform nicht notwendig
617                $sql.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
618                $sql.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
619        } else { 
620                $sql.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
621                $sql.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";                       
622        }
623        $sql.="FROM ax_flurstueck f WHERE f.gemarkungsnummer= $1 AND f.flurnummer= $2 AND f.zaehler= $3 ";
624
625//      If ($znenner != "") {$sql.="AND f.nenner=".$znenner." ";}
626
627        // norGIS: "zaehler" ist integer in der DB, aber "nenner" ist character, linksbÃŒndig ohne fÃŒhrende '0'
628        If ($znenner != "") {
629                $suchnenn = ltrim($znenner, '0');
630                If ($suchnenn != "") {
631                        $sql.="AND f.nenner='".$suchnenn."' ";
632                }
633        }
634        $sql.="AND endet IS NULL ORDER BY f.zaehler, cast(f.nenner AS integer);";
635        $v=array($zgemkg4, $zflur, $zzaehler);
636        $res=pg_prepare("", $sql);
637        $res=pg_execute("", $v);
638        if (!$res) {
639                echo "\n<p class='err'>Fehler bei Flurst&uuml;ck.</p>";
640                if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<br>Parameter $1='".$zgemkg4."' $2='".$zflur."' $3='".$zzaehler."'<p>";}
641        }
642
643
644        $zfs=0;
645        while($row = pg_fetch_array($res)) {   
646                $fs_gml=$row["gml_id"];
647                $flur=$row["flurnummer"];
648                $fskenn=$row["zaehler"];
649                if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
650                zeile_flurstueck($fs_gml, $fskenn, $row["x"], $row["y"], "", "", true);
651                $zfs++;
652        }
653        // Foot
654        if($zfs == 0) {
655                echo "\n<p class='anz'>Kein aktuelles Flurst&uuml;ck.</p>";
656                echo "\n<div class='hi' title='in Historie suchen'>";
657                        echo "\n\t\t<img class='nwlink' src='ico/Flurstueck_Historisch.png' width='16' height='16' alt='Historisches Flurst&uuml;ck'>&nbsp;";
658                        echo "<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;fskennz=".$fskennz."&amp;hist=j'>";
659                        echo $zgemkg4."-".$zflur."-".$zzaehler;
660                        if ($znenner != "") {echo "/".$znenner;}
661                        echo " h - suchen</a>";
662                echo "\n</div>";               
663        }
664        return true;
665}
666
667function HistFlurstueck() {
668        // Die Nachfolger-FS-Kennzeichen zu einem Historischen FS sollen recherchiert werden.
669        global $debug, $land, $zgemkg4, $zgemkg6, $zflur, $zzaehler, $znenner;
670
671        // Head
672        if (gg_head($zgemkg6, false)) {
673                zeile_flur($zgemkg4, $zflur, true, false);
674        } else {
675                return false;
676        }
677        echo "\n<hr>";
678
679        // Body
680        // Suche ueber das Flurstueckskennzeichen, gml unbekannt
681        $fskzwhere=$zgemkg6; // Flurst-Kennz. f. Where
682        $fskzwhere.=str_pad($zflur, 3, "0", STR_PAD_LEFT);
683        $fskzwhere.=str_pad($zzaehler, 5, "0", STR_PAD_LEFT);
684        if ($znenner == "") {   // Wenn kein Nenner angegeben wurde,
685                //wird mit Wildcard und like nach allen Nennern gesucht.
686                $fskzwhere.="____\_\_"; // fÃŒr like
687                $whereop=" like ";
688                // Das Wildcard-Zeichen "_" ist mit Zeichen im Feldinhalt identisch
689                // "___" = hier kann auch ein Nenner stehen, "\_\_" hier mÃŒssen tatsÀchlich __ stehen.
690                // WARNUNG:  nicht standardkonforme Verwendung von Escape in Zeichenkettenkonstante
691                // z.B.: like '05265600400145____\_\_'
692        } else { // Ein Nenner wurde angegeben
693                $fskzwhere.=str_pad($znenner, 4, "0", STR_PAD_LEFT)."__";
694                $whereop=" = ";
695        }
696        $whcl="WHERE flurstueckskennzeichen ".$whereop." $1 AND endet IS NULL ";
697        $fldlist=" AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner, ";
698
699        // NICHT in aktuell suchen wenn explizit historisch gesucht wird
700        $sql ="SELECT 'h'".$fldlist."nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueck ".$whcl;
701        $sql.="UNION SELECT 'o'".$fldlist."nachfolgerflurstueckskennzeichen as nachf FROM ax_historischesflurstueckohneraumbezug ".$whcl;
702
703        $v=array($fskzwhere);
704        $res=pg_prepare("", $sql);
705        $res=pg_execute("", $v);
706        if (!$res) {
707                echo "\n<p class='err'>Fehler bei historischem Flurst&uuml;ck.</p>";
708                if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<br>Parameter: ".$fskzwhere."<p>";}
709                return true;
710        }
711
712        $zfs=0;
713        while($row = pg_fetch_array($res)) { // Schleife Hist-FS
714                $ftyp=$row["ftyp"];
715                $fs_gml=$row["gml_id"];
716                $gknr=$land.$row["gemarkungsnummer"]; // Land davor
717                $flur=$row["flurnummer"];
718                $fskenn=$row["zaehler"];
719                $nachf=$row["nachf"];
720                if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
721
722                zeile_hist_fs($fs_gml, $fskenn, $ftyp, $gknr, $flur, true);
723
724                if ($nachf == "") {
725                        echo "\n<p class='anz'>keine Nachfolger</p>";   
726                } else {
727                        echo "\n<p class='hn'>Nachfolger-Flurst&uuml;cke:</p>";
728                        // Direkte Nachfolger ermitteln. In $nachf steht ein Array von FS-Kennzeichen.
729                        // Von den einzelnen Kennz. ist unbekannt, ob diese noch aktuell sind
730                        // oder auch schon wieder historisch.
731                        // Nachfolger in DB suchen um den Status aktuell/historisch zu ermitteln
732                        $stri=trim($nachf, "{}");
733                        $stri="'".str_replace(",", "','", $stri)."'";
734
735                        $nawhcl="WHERE flurstueckskennzeichen IN ( ".$stri." ) AND endet IS NULL ";
736
737                        // Pass auf! Spalte zaehler hat unterschiedliches Format in den 3 Tabellen
738                        $nasql ="SELECT 'a' AS ftyp, gml_id, gemarkungsnummer, flurnummer, cast(zaehler AS character varying), nenner FROM ax_flurstueck ".$nawhcl;
739                        $nasql.="UNION SELECT 'h' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueck ".$nawhcl;
740                        $nasql.="UNION SELECT 'o' AS ftyp, gml_id, gemarkungsnummer, flurnummer, zaehler, nenner FROM ax_historischesflurstueckohneraumbezug ".$nawhcl;
741
742                        $v=array();
743                        $nares=pg_prepare("", $nasql);
744                        $nares=pg_execute("", $v);
745                        if (!$nares) {
746                                echo "\n<p class='err'>Fehler bei Nachfolger.</p>";
747                                if ($debug > 2) {echo "<p class='dbg'>SQL = '".$nasql."'<p>";}
748                                return;
749                        }
750
751                        $zfsn=0;
752                        // inner Body
753                        while($narow = pg_fetch_array($nares)) {
754                                $naftyp=$narow["ftyp"];
755                                $nagml=$narow["gml_id"];
756                                $nagknr=$land.$narow["gemarkungsnummer"]; // Land davor, 4 auf 6 Stellen
757                                $naflur=$narow["flurnummer"];
758                                $nafskenn=$narow["zaehler"];
759                                if ($narow["nenner"] != "") {$nafskenn.="/".$narow["nenner"];}
760                                zeile_nachf_fs ($nagml, $nagknr, $naflur, $nafskenn, $naftyp);
761                                $zfsn++;
762                        }
763                        // inner Footer
764                        if ($zfsn == 0) {
765                                echo "\n<p class='anz'>keine Nachfolger</p>";
766                        } elseif ($zfsn > 1) {
767                                echo "\n<p class='anz'>".$zfsn." Nachfolger-Flst.</p>";
768                        }
769                        echo "\n<hr>";
770                }
771                $zfs++;
772        }
773        // Foot
774        if($zfs == 0) {
775                echo "\n<p class='anz'>Kein historisches Flurst&uuml;ck.</p>";
776                #if ($debug > 2) {echo  "\n<p class='dbg'> SQL= ".$sql."\n<br> $1 = FS-Kennz = '".$fskzwhere."'</p>";}
777        }
778        return;
779}
780
781// ===========
782// Start hier!
783// ===========
784if ($debug >= 1) {echo "\n<p class='dbg'>gemeinde='".$gemeinde."'. gfilter='".$gfilter."'</p>";}
785
786// Validation: Eingabefeld aus Formular.
787// Suchbegriff (Gemarkungsname) oder FlurstÃŒcks-Kennzeichen (ll)gggg-fff-zzzz/nnn (11).
788// Hier formatierte Meldung und html-Foot.
789if (isset($fskennz) and $fskennz != "" ) {
790        if (!preg_match('#^[0-9a-zA-ZÀöÌÄÖÜß* -]{1,25}$#', $fskennz)) {
791                echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
792                $fskennz="";
793        }
794} else {
795        $fskennz="";
796}
797       
798if($gm != "") { // Self-Link aus Gemeinde-Liste
799        $trans="Gemarkungen zur Gemeinde";
800        $gnr=ListGmkgInGemeinde($gm, $bez);
801        if ($gnr > 0) {
802                $zgemkg4=$gnr;
803                $zgemkg6=$land.$zgemkg4;
804                EineGemarkung(false);
805        }
806} else { // Die Formular-Eingabe interpretieren (kann auch ein Link sein)
807        $retzer=ZerlegungFsKennz($fskennz);
808        if ($debug >= 1) {echo "\n<p class='dbg'>Return Zerlegung: ".$retzer."</p>";}   
809        switch ($retzer) { // Returnwert der Zerlegung des FS-Kennz.
810        case 0: // leere Eingabe
811                if ($gfilter == 1) { // Die GUI ist bereits auf EINE Gemeinde gefiltert
812                        $trans="Liste der Gemarkungen";
813                        SuchGmkgName();
814                } else {
815                        $trans="Liste der Gemeinden";
816                        ListGemeinden();
817                }
818                break;
819        case 1:
820                $trans="Suche Gemarkungsname";
821                $gnr=SuchGmkgName();
822                if ($gnr > 0) {
823                        $trans="1 Gemarkung, Fluren dazu";
824                        $zgemkg6=$gnr;
825                        $zgemkg4=substr($zgemkg6, 2);
826                        EineGemarkung(false);
827                }
828                break;
829        case 2:
830                $trans="Fluren in Gemarkung";
831                EineGemarkung(true);
832                break;
833        case 3:
834                if ($phist)     {
835                        $trans="historische Flurst. in Flur";
836                        HistFlur();
837                } else {
838                        $trans="Flurst&uuml;cke in Flur";
839                        EineFlur();
840                }
841                break;
842        case 4:
843                if ($phist)     {
844                        $trans="historisches Flurst&uuml;ck";
845                        HistFlurstueck();
846                } else {
847                        $trans="Flurst&uuml;ck";
848                        EinFlurstueck();
849                }
850                break;
851        case 5:
852                if ($phist) {
853                        $trans="historisches Flurst&uuml;ck";
854                        HistFlurstueck();
855                } else {
856                        $trans="Flurst&uuml;ck";
857                        EinFlurstueck();
858                }       
859                break;
860        case 9:
861                $trans="falsche Eingabe";
862                echo "\n<p class='err'>Bitte ein Flurst&uuml;ckskennzeichen eingegeben, Format 'gggg-fff-zzzz/nnn</p>";
863                break;
864        }
865}
866
867// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion im Kopf des Ergebnisrahmens anzeigen.
868// Dazu die im HTML-Header definierte Javascript-Function benutzen.
869// Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
870echo "
871<script type='text/javascript'>
872        transtitle('".$trans."');
873</script>";
874?>
875
876</body>
877</html>
Note: See TracBrowser for help on using the repository browser.