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

Revision 420, 29.5 KB checked in by frank.jaeger, 5 years ago (diff)

In der ALKIS-Navigation für Mapbender2 die Sortierung für Flurstücksnummer korrigiert. Mit Umstellung auf Full-Schema sind Zähler und Nenner Textfelder geworden. Sie wurden also nicht mehr "numerisch" sortiert.

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