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

Revision 425, 30.0 KB checked in by frank.jaeger, 2 years ago (diff)

Web-GIS-Auskunft und Mapbender2-Navigation: neue Konfigurations-Parameter und verbessertes Grundbuch-Modul

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