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

Revision 376, 28.3 KB checked in by frank.jaeger, 7 years ago (diff)

Verbesserungen an der ALKIS-Buchauskunft (Geschwindigkeit, Fehlerkorrekturen, Mandantenfähigkeit) und an der Mapbender2-Navigation.

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