source: trunk/mapbender/http/navn/alkisnav_fls.php @ 360

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