source: trunk/info/info/alkisn/alkisfsnw.php @ 430

Revision 430, 31.7 KB checked in by frank.jaeger, 22 months ago (diff)

ALKIS-Auskunft angepasst an PHP 8

Line 
1<?php
2/*      alkisfsnw.php
3
4        ALKIS-Auskunft
5        Author: Frank JÀger, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo)
6
7        FlurstÃŒcksnachweis fÃŒr ein FlurstÃŒckskennzeichen aus ALKIS PostNAS
8
9        Version:
10        2016-02-24 Version fÃŒr norGIS-ALKIS-Import
11        ...
12        2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
13        2020-12-09 Verschn. mit "Bau-, Raum- oder Bodenordnungsrecht" korrigiert, Entschl. BodenschÀtzung korrigiert
14        2020-12-16 Input-Validation und Strict Comparisation (===)
15        2021-03-09 Link zum GebÀudenachweis auch mit "Bauwerke" betiteln
16        2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÀche)
17        2022-01-13 Functions in Fach-Modul verschoben, die nicht von mehreren verwendet werden. Neue Functions LnkStf(), DsKy()
18        2022-07-05 PHP 8.1: Connection verwenden bei "pg_prepare" und "pg_execute", keine NULL-Werte in String-Functions verwenden
19
20ToDo:
21        - Tabbelle "nutz_21" ist ein Relikt von NorGIS/ALB und könnte in spÀteren Versionen fehlen.
22        - Buchung auf "fiktives Blatt" ist nur mit debug zu sehen: die <tr> in .css grau hinterlegen
23        - "Umschalter" (gleiches Modul) anders darstellen als Links zu ANDEREN Nachweisen
24        - Parameter zum Umschalten mit/ohne BodenschÀtzung?
25        - Bessere Differenzierung bei den Nutzungsarten (Tabelle dafÃŒr aufbauen)
26*/
27
28function werteliste($bez ,$sqlin, $con) {
29// Eine oder mehrere EntschlÃŒsselungen in eine Zeile ausgeben.
30// Dient dazu, SchlÌssel-ARRAYs auflösen ohne die Zeile im JOIN mehrfach aufzulisten
31// Anwendung: FS-Nachweis BodenschÀtzung
32        global $dbg;
33
34        if ($bez === 'e') {$tabelle = 'ax_entstehungsartoderklimastufewasserverhaeltnisse_bodensc';}
35        elseif ($bez === 's') {$tabelle = 'ax_sonstigeangaben_bodenschaetzung';}
36
37        $sql="SELECT wert, beschreibung FROM ".$tabelle." WHERE wert IN (".$sqlin.") ORDER BY wert LIMIT $1 ;";
38        $v = array('9');
39        $res = pg_prepare($con, "", $sql);
40        $res = pg_execute($con, "", $v);
41        if (!$res) {
42                echo "\n<p class='err'>Fehler bei Werteliste.</p>";
43                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
44                return;
45        }
46        $zeianz=pg_num_rows($res);
47        while($row = pg_fetch_assoc($res)) {
48                echo " ".$row["beschreibung"];
49        }
50        pg_free_result($res);
51        if ($zeianz === 0) {
52                echo "(kein Treffer)";
53                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
54        }
55        return;
56}
57
58// Start
59ini_set("session.cookie_httponly", 1);
60session_start();
61
62$eig="n"; $showkey="n"; $nodebug=""; // Var. initalisieren
63$cntget = extract($_GET); // alle Parameter in Variable umwandeln
64
65// strikte Validierung aller Parameter
66if (isset($gmlid)) {
67        if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
68        $fskennz='';
69} else { // Alternativ
70        $gmlid='';
71        if (isset($fskennz)) {
72                if (!preg_match('#^[0-9\-_/]{8,20}$#', $fskennz)) {die ("Eingabefehler fskennz");}
73        } else {
74                die("Fehlender Parameter");
75        }
76}
77if (isset($gkz)) {
78        if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
79} else {
80        die("Fehlender Parameter");
81}
82if (!preg_match('#^[j|n]{0,1}$#', $eig)) {die("Eingabefehler eig");}
83if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
84if ($showkey === "j") {$showkey=true;} else {$showkey=false;} // "j"/"n" als bool, ist praktischer, oft gebraucht
85if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
86
87include "alkis_conf_location.php";
88include "alkisfkt.php";
89?>
90<!doctype html>
91<html lang="de">
92<head>
93        <meta charset="utf-8">
94        <meta name="viewport" content="width=device-width, initial-scale=1.0">
95        <title>ALKIS Flurst&uuml;cksnachweis</title>
96        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
97        <link rel="shortcut icon" type="image/x-icon" href="ico/Flurstueck.ico">
98        <script>
99                function ALKISexport(gmlid) {
100                        window.open('alkisexport.php?gkz=<?php echo $gkz;?>&tabtyp=flurstueck&gmlid=' + gmlid);
101                }
102        </script>
103</head>
104<body>
105<?php
106$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
107$dbg=$debug;
108if ($nodebug === "j") {$dbg=0;}
109
110$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisfsnw.php'");
111if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
112
113// Ein FlurstÃŒcks-Kennzeichen im DB-Format wurde alternativ zur gml_id ÃŒbermittelt
114if ($fskennz != '') {
115        // Spalte "flurstueckskennzeichen" ist in DB indiziert. Format z.B.'052647002001910013__' oder '05264700200012______'
116        $sql ="SELECT gml_id FROM ax_flurstueck WHERE flurstueckskennzeichen= $1 AND endet IS NULL;";
117        $v=array(fskenn_dbformat($fskennz));
118        $res = pg_prepare($con, "", $sql);
119        $res = pg_execute($con, "", $v);
120        if ($row = pg_fetch_assoc($res)) {
121                $gmlid=$row["gml_id"];
122        } else {
123                echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r Flurst&uuml;ckskennzeichen='".$fskennz."' (".$fskzdb.")</p>";
124                echo "<p>Kennzeichen veraltet? <a href='./alkisfshist.php?gkz=".$gkz."&fskennz=".$fskennz.LnkStf()."'>Suche in der Flurst&uuml;cks-Historie</a></p>";
125                echo "\n</body>\n</html>";
126                return;
127        }
128        pg_free_result($res);
129}
130
131// F L U R S T Ü C K  m. Gebiet
132$sql ="SELECT f.zeigtaufexternes_art, f.zeigtaufexternes_name, f.flurnummer, f.zaehler, f.nenner, f.gemeindezugehoerigkeit_regierungsbezirk, f.gemeindezugehoerigkeit_kreis, f.gemeindezugehoerigkeit_gemeinde, f.amtlicheflaeche, st_area(f.wkb_geometry) AS fsgeomflae,
133to_char(cast(f.zeitpunktderentstehung AS date),'DD.MM.YYYY') AS zeitpunktderentstehung, f.istgebucht, g.gemarkungsnummer, g.bezeichnung, r.bezeichnung AS rbez, k.bezeichnung AS kbez, m.bezeichnung AS mbez
134FROM ax_flurstueck f
135LEFT JOIN ax_gemarkung g ON f.gemeindezugehoerigkeit_land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g")
136."LEFT JOIN ax_regierungsbezirk r ON f.gemeindezugehoerigkeit_regierungsbezirk=r.regierungsbezirk ".UnqKatAmt("f","r")
137."LEFT JOIN ax_kreisregion k ON f.gemeindezugehoerigkeit_regierungsbezirk=k.regierungsbezirk AND f.gemeindezugehoerigkeit_kreis=k.kreis ".UnqKatAmt("f","k")
138."LEFT JOIN ax_gemeinde m ON m.regierungsbezirk=f.gemeindezugehoerigkeit_regierungsbezirk AND m.kreis=f.gemeindezugehoerigkeit_kreis AND m.gemeinde=f.gemeindezugehoerigkeit_gemeinde ".UnqKatAmt("f","m")
139."WHERE f.gml_id= $1 AND f.endet IS NULL AND g.endet IS NULL AND m.endet IS NULL AND k.endet IS NULL AND r.endet IS NULL;";
140
141$v = array($gmlid); // mit gml_id suchen
142$res = pg_prepare($con, "", $sql);
143$res = pg_execute($con, "", $v);
144if (!$res) {
145        echo "\n<p class='err'>Fehler bei Flurstuecksdaten</p>";
146        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
147}
148if ($dbg > 0) {
149        $zeianz=pg_num_rows($res);
150        if ($zeianz > 1){
151                echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Flurst&uuml;cks-Objekt!</p>";
152                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
153        }
154}
155if ($row = pg_fetch_assoc($res)) {
156        $gemkname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");
157        $gmkgnr=$row["gemarkungsnummer"];
158        $bezirk=$row["gemeindezugehoerigkeit_regierungsbezirk"];
159        $rbez=htmlentities($row["rbez"], ENT_QUOTES, "UTF-8");
160        $kreis=$row["gemeindezugehoerigkeit_kreis"];
161        $kbez=htmlentities($row["kbez"], ENT_QUOTES, "UTF-8");
162        $gemeinde=$row["gemeindezugehoerigkeit_gemeinde"];
163        $mbez=htmlentities($row["mbez"], ENT_QUOTES, "UTF-8");
164        $flurnummer=$row["flurnummer"];
165        $zaehler=$row["zaehler"];
166        $nenner=$row["nenner"];
167        $flstnummer=$zaehler;
168        if ($nenner == NULL) {
169                $nenner="";
170        } else {
171                $flstnummer.="/".$nenner;
172        } // BruchNr
173        $fsbuchflae=$row["amtlicheflaeche"]; // amtl. Fl. aus DB-Feld
174        $fsgeomflae=$row["fsgeomflae"]; // aus Geometrie ermittelte FlÀche
175        $the_Xfactor = $fsbuchflae / $fsgeomflae; // Multiplikator zur Umrechnung geometrische AbschnittsflÀchen in BuchflÀche
176        $fsbuchflaed=number_format($fsbuchflae,0,",",".") . " m&#178;"; // Display-Format dazu
177        $fsgeomflaed=number_format($fsgeomflae,0,",",".") . " m&#178;";
178        $gml_buchungsstelle=$row["istgebucht"]; // wird erst im GB-Teil benötigt
179        $entsteh=$row["zeitpunktderentstehung"];
180        $zeart=$row["zeigtaufexternes_art"];
181        $zename=$row["zeigtaufexternes_name"];
182        if (is_null($zename)) {$zename="";}
183} else {
184        echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r Flurst&uuml;ck mit gml_id=".$gmlid."</p>";
185        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
186        echo "\n</body>\n</html>";
187        return;
188}
189pg_free_result($res);
190
191if ($eig==="j") { // Balken
192        echo "<p class='balken fsei'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"
193        ."\n\n<h2>Flurst&uuml;ck mit Eigent&uuml;mer</h2>";
194} else {
195        echo "<p class='balken fskennz'>ALKIS Flurst&uuml;ck ".$gmkgnr."-".$flurnummer."-".$flstnummer."&nbsp;</p>"
196        ."\n\n<h2>Flurst&uuml;ck</h2>";
197}
198
199// PrÃŒfung der Gebiets-Berechtigung bei gemeinsam genutzten Datenbanken (Kreis und Gemeinde)
200// FÃŒr das gkz (z.B. aus dem Mapfile-Namen) wird in der Konfiguration ein Filter gesetzt.
201if ( ($filtkreis != '' and $filtkreis != $kreis) or ($filtgem != '' and $filtgem != $gemeinde) ) {
202        // Einer der gesetzten Filter passt nicht
203        if ($dbg > 2) {
204                echo "\n<p class='err'>Filter Kreis='".$filtkreis."', Gemeinde='".$filtgem."'</p>"
205                ."\n<p class='err'>Flstk. Kreis='".$fskrs."', Gemeinde='".$fsgem."'</p>";
206        }
207        echo "\n<br><p class='stop1'>Zugriff nicht erlaubt</p>"
208        ."\n<br><p class='stop2'>Dies Flurst&uuml;ck liegt ausserhalb der zust&auml;ndigen Stadt oder Gemeinde.</p>\n</body>\n</html>";
209        exit;
210}
211
212echo "\n<table class='outer'>"
213        ."\n\t<tr>\n\t\t<td class='ll'><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Kennzeichen:</td>" // Links
214        ."\n\t\t<td>" // Mitte
215        ."\n\t\t\t<table class='kennzfs' title='Flurst&uuml;ckskennzeichen'>\n\t\t\t\t<tr>" // darin Tabelle Kennzeichen
216                ."\n\t\t\t\t\t<td class='head'>Gemarkung</td>\n\t\t\t\t\t<td class='head'>Flur</td>\n\t\t\t\t\t<td class='head'>Flurst-Nr.</td>\n\t\t\t\t</tr>"
217                ."\n\t\t\t\t<tr>\n\t\t\t\t\t<td title='Gemarkung'>".DsKy($gmkgnr, 'Gemarkungsnummer').$gemkname."&nbsp;</td>"
218                ."\n\t\t\t\t\t<td title='Flurnummer'>".$flurnummer."</td>"
219                ."\n\t\t\t\t\t<td title='Flurst&uuml;cksnummer (Z&auml;hler / Nenner)'><span class='wichtig'>".$flstnummer."</span></td>\n\t\t\t\t</tr>"
220        ."\n\t\t\t</table>"
221        ."\n\t\t</td>\n\t\t<td>"; // Rechts
222        fortfuehrungen($entsteh, $zeart, $zename);
223echo "\n\t\t</td>\n\t</tr>\n</table>";
224
225echo "\n<hr>\n<table class='fs'>"; // FS-Teil 6 Spalten
226echo "\n<tr>\n\t<td></td>\n\t<td></td>\n\t<td></td>\n\t<td></td>\n\t<td></td>" // 1-5 in erster Zeile kein "colspan" verwenden
227        ."\n\t<td><p class='nwlink noprint'>weitere Auskunft:</p></td>"
228."\n</tr>";
229
230echo "\n<tr>" // Zeile: Gebietszugehörigkeit - Gemeinde / Kreis / Reg.bez.
231        ."\n\t<td class='ll'><img title='Im Gebiet von' src='ico/Gemeinde.png' width='16' height='16' alt=''> Gebiet:</td>"
232        ."\n\t<td>Gemeinde<br>Kreis<br>Regierungsbezirk</td>"
233        ."\n\t<td class='lr' colspan='3'>".DsKy($gemeinde, 'Gemeinde-Nummer').$mbez."<br>".DsKy($kreis, 'Kreis-Nummer').$kbez."<br>".DsKy($bezirk, 'Regierungsbezirk-Nummer').$rbez."</td>"
234        ."\n\t<td class='nwlink'>";
235        if ($fsHistorie){ // conf
236                echo "\n\t\t<p class='nwlink noprint'>"
237                ."\n\t\t\t<a href='alkisfshist.php?gkz=".$gkz."&amp;gmlid=".$gmlid.LnkStf()
238                ."' title='Vorg&auml;nger-Flurst&uuml;cke'>Historie <img src='ico/Flurstueck_Historisch.png' width='16' height='16' alt=''></a>\n\t\t</p>\n\t";
239        }
240        echo "</td>"
241."\n</tr>";
242
243// L a g e b e z e i c h n u n g
244
245// Lagebezeichnung  M I T  Hausnummer
246// ax_flurstueck  >weistAuf>  AX_LagebezeichnungMitHausnummer
247$sql="SELECT DISTINCT l.gml_id, l.gemeinde, l.lage, l.hausnummer, s.bezeichnung, s.gml_id AS kgml
248FROM ax_flurstueck f JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(f.weistauf) 
249JOIN ax_lagebezeichnungkatalogeintrag s ON l.land=s.land AND l.regierungsbezirk=s.regierungsbezirk AND l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage
250WHERE f.gml_id= $1 AND f.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL   
251ORDER BY l.gemeinde, l.lage, l.hausnummer;";
252
253$v = array($gmlid);
254$res = pg_prepare($con, "", $sql);
255$res = pg_execute($con, "", $v);
256
257if (!$res) {
258        echo "\n<p class='err'>Fehler bei Lagebezeichnung mit Hausnummer</p>";
259        if ($dbg > 1) {
260                echo "\n<p class='dbg'>Fehler:".pg_last_error()."</p>";
261                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sql), ENT_QUOTES, "UTF-8")."</p>";}
262        }
263} else {
264        $j=0;
265        $kgmlalt="";
266        while($row = pg_fetch_assoc($res)) {
267                $sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8"); // Str.-Name
268                if (substr($sname, strlen($sname) -3, 3) === 'weg') { // Versuch fuer korrekten Satzbau
269                        $slink=" am ".$sname;
270                } else {
271                        $slink=" an der ".$sname;
272                }
273                $hsnr=$row["hausnummer"];
274                echo "\n<tr>";
275                        if ($j === 0) {
276                                echo "\n\t<td class='ll'><img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''> Adresse:</td>";
277                        } else {
278                                echo "\n\t<td>&nbsp;</td>";
279                        }
280                        echo "\n\t<td>&nbsp;</td>"
281                        ."\n\t<td class='lr' colspan='3'>".DsKy($row["lage"], 'Straßen-*').$sname."&nbsp;".$hsnr."</td>"
282                        ."\n\t<td>\n\t\t<p class='nwlink noprint'>";
283
284                        // +++ davor auch Link "Straße"
285                        $kgml=$row["kgml"]; // Wiederholung vermeiden
286                        if ($kgml != $kgmlalt) { // NEUE Strasse vor Lage
287                                $kgmlalt=$kgml; // Katalog GML-ID
288                                echo "\n\t\t\t<a title='Flurst&uuml;cke mit oder ohne Hausnummer".$slink."' "
289                                ."href='alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml.LnkStf()."'>Stra&szlig;e "
290                                ."<img src='ico/Strassen.png' width='16' height='16' alt='STRA'></a> ";
291                        }
292
293                        echo "\n\t\t\t<a title='Flurst&uuml;cke und Geb&auml;ude mit Hausnummer ".$hsnr."' href='alkislage.php?gkz=".$gkz."&amp;ltyp=m&amp;gmlid=".$row["gml_id"].LnkStf()
294                                ."'>Lage <img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''></a>"
295                        ."\n\t\t</p>\n\t</td>"  // 6
296                ."\n</tr>";
297                $j++;
298        }
299        $cnt_adressen=$j;
300        pg_free_result($res);
301}
302
303// Lagebezeichnung  O H N E  Hausnummer  (Gewanne oder nur Strasse)
304// ax_flurstueck  >zeigtAuf>  AX_LagebezeichnungOhneHausnummer
305$sql ="SELECT l.gml_id, coalesce(l.unverschluesselt, '') AS gewann, l.gemeinde, l.lage, s.bezeichnung
306FROM ax_flurstueck f JOIN ax_lagebezeichnungohnehausnummer l ON l.gml_id=ANY(f.zeigtauf)
307LEFT JOIN ax_lagebezeichnungkatalogeintrag s ON l.land=s.land AND l.regierungsbezirk=s.regierungsbezirk AND l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage
308WHERE f.gml_id = $1 AND f.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL;";
309
310$v = array($gmlid);
311$res = pg_prepare($con, "", $sql);
312$res = pg_execute($con, "", $v);
313if (!$res) {
314        echo "\n<p class='err'>Fehler bei Lagebezeichnung ohne Hausnummer</p>";
315        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlid."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
316}
317while($row = pg_fetch_assoc($res)) {
318        $skey=$row["lage"]; // Strassenschl.
319        $lgml=$row["gml_id"]; // Key der Lage
320        $gewann = htmlentities($row["gewann"], ENT_QUOTES, "UTF-8");
321        if ($gewann != '') {
322                echo "\n<tr>"
323                        ."\n\t<td class='ll' title='unverschl&uuml;sselte Lagebezeichnung'><img src='ico/Lage_Gewanne.png' width='16' height='16' alt=''> Gewanne:</td>" // 1
324                        ."\n\t<td></td>"
325                        ."\n\t<td class='lr' colspan='3'>".$gewann."</td>"
326                        ."\n\t<td>\n\t\t<p class='nwlink noprint'>"
327                                ."\n\t\t\t<a title='Flurst&uuml;cke mit der Gewanne ".$gewann."' href='alkislage.php?gkz=".$gkz."&amp;ltyp=o&amp;gmlid=".$lgml.LnkStf()
328                                ."'>\n\t\t\tLage <img src='ico/Lage_Gewanne.png' width='16' height='16' alt=''></a>"
329                        ."\n\t\t</p>\n\t</td>"
330                ."\n</tr>";
331        } elseif ($skey > 0) {
332                $sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8"); // Str.-Name
333                if (substr($sname, strlen($sname) -3, 3) === 'weg') { // Versuch fuer korrekten Satzbau
334                        $slink=" am ".$sname;
335                } else {
336                        $slink=" an der ".$sname;
337                }
338                echo "\n<tr>"
339                        ."\n\t<td class='ll'><img src='ico/Lage_an_Strasse.png' width='16' height='16' alt=''> Stra&szlig;e:</td>"
340                        ."\n\t<td></td>\n\t<td class='lr' colspan='3'>".DsKy($skey, 'Straßen-*').$sname."</td>";
341                        echo "\n\t<td>\n\t\t<p class='nwlink noprint'>"
342                                ."\n\t\t\t<a title='FlurstÃŒcke ".$slink."' href='alkislage.php?gkz=".$gkz."&amp;ltyp=o&amp;gmlid=".$lgml.LnkStf()
343                                ."'>\n\t\t\tLage <img src='ico/Lage_an_Strasse.png' width='16' height='16' alt=''>\n\t\t\t</a>"
344                        ."\n\t\t</p>\n\t</td>"
345                ."\n</tr>";
346        }
347}
348pg_free_result($res);
349
350/* Status "N u t z u n g":
351Die Classic-Tabelle "nutzung" ist eine Zusammenfassung aller Tabellen mit Nutzungs-FlÀchen
352Die Classic-Tabelle "nutzung_meta" zeigt die Kategorie und Gruppe des Nutzungs-Abschnitts an.
353
354Aus der norGIS-Struktur wird ersatzweise VORLÄUFIG die Tabelle "nutz_21" verwendet,
355die das alte ALB-Format der Nutzungs-Abschnitte von FlurstÃŒcken simuliert.
356Hier finden sich bereits verschnittene FlÀchen, aber die gml_id fehlt.
357
358Die EntschlÃŒsselung der Nutzungsart in den verschiedenen ALKIS-Varianten ist darin unterentwickelt.
359Diese ist eigentlich fÃŒr jede der getrennten Tabellen der Gruppe Nutzungsart individuell.
360Die Classic-Lösung mit 2 Zusatzfeldern war schon sehr pauschalisiert, aber
361durch die RÃŒck-Konvertierung in ALB-Strukturen in der norGIS-Version ist das zu stark vereinfacht.
362z.B. wird "WohnbauflÀche" mit der Zusatzeigenschaft "Art der Bebauung": 'Offen'
363nun zur Nutzungsart "Offen".
364Durch JOIN auf die "alkis_elemente" mit einem Teil des SchlÌssels wird das zur "WohnbauflÀche, Offen".
365Es sollte eine Tabellen-Struktur bereit gestellt werden, die auch aussagt, dass der Wert "Offen" zur
366Zusatz-Eigenschaft "Art der Bebauung" gehört. Dazu muss das PostProcessing erweitert werden. */
367
368$sql="SELECT e.definition, trim(both FROM n.nutzsl) AS nutzsl, trim(both FROM n.fl) AS fl, trim(both FROM s.nutzung) AS nutzung
369 FROM nutz_21 n JOIN nutz_shl s ON n.nutzsl = s.nutzshl
370 JOIN alkis_elemente e ON e.kennung = substring(n.nutzsl from 1 for 5)
371WHERE n.flsnr = $1 ORDER BY cast(n.fl AS integer) DESC;";
372// Flurstueckskennzeichen mit Trennzeichen im ALB-Format wie 'llgggg-fff-zzzzz/nnn'
373$fskennzalb=$defland.$gmkgnr."-".str_pad($flurnummer,3,"0",STR_PAD_LEFT)."-".str_pad($zaehler,5,"0",STR_PAD_LEFT)."/".str_pad($nenner,3,"0",STR_PAD_LEFT);
374$v = array($fskennzalb);
375$res = pg_prepare($con, "", $sql);
376$res = pg_execute($con, "", $v);
377if (!$res) {
378        echo "\n<p class='err'>Fehler bei Suche tats. Nutzung</p>";
379        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$fskennzalb."'",$sql), ENT_QUOTES, "UTF-8")."'</p>";}
380}
381$j=0;
382while($row = pg_fetch_assoc($res)) {
383        $flae=$row["fl"]; // BuchflÀche
384        $nutzsl=$row["nutzsl"]; // SchlÃŒssel
385        $nutzung=$row["nutzung"]; // Bezeichnung aus ALB-Tabelle, "fein"
386        $defi=$row["definition"]; // Langer Text mit Beschreibung
387        $title=htmlentities($defi, ENT_QUOTES, "UTF-8"); // .. fÃŒr Anzeige aufbereitet
388        echo "\n<tr>\n\t";
389                if ($j === 0) { // 1
390                        echo "<td class='ll' title='Abschnitt der tats&auml;chlichen Nutzung'><img src='ico/Abschnitt.png' width='16' height='16' alt=''> Nutzung:</td>";
391                } else {
392                        echo "<td>&nbsp;</td>";
393                }
394                $absflaebuch = number_format($flae,0,",",".") . " m&#178;"; // Formatierte Abschnitts-Buch-FlÀche
395                echo "\n\t<td></td>"
396                ."\n\t<td class='fla' title='Buchfl&auml;che des Abschnitts'>".$absflaebuch."</td>" // Sp. wie Fl. in BodenschÀtzg.
397                ."\n\t<td></td>"
398                ."\n\t<td class='lr' title='".$title."'>".DsKy($nutzsl, 'Nutzungsarten-*').$nutzung."</td>"
399                ."\n\t<td>";
400/*              // Derzeit ist keine Gruppe zugeordnet
401                        switch ($grupp) { // Icon nach 4 Objektartengruppen
402                                case "Siedlung":   $ico = "Abschnitt.png"; break;
403                                case "Verkehr":    $ico = "Strassen_Klassifikation.png"; break;
404                                case "Vegetation": $ico = "Wald.png"; break;
405                                case "GewÀsser":   $ico = "Wasser.png";        break;
406                                default: $ico = "Abschnitt.png"; break;
407                        }
408                        // Icon ist auch im Druck sichtbar, class='noprint' ?           
409                        echo "<p class='nwlink'><img title='".$title."' src='ico/".$ico."' width='16' height='16' alt='NUA'></p>"; */
410                echo "</td>"
411        ."\n</tr>";
412        $j++;
413}
414pg_free_result($res);
415
416echo "\n<tr>" // FlÀchen-Summenzeile
417        ."\n\t<td class='re' title='amtliche Fl&auml;che (Buchfl&auml;che)'>Fl&auml;che:</td>" // 1
418        ."\n\t<td>&nbsp;</td>" // 2
419        ."\n\t<td class='fla sum'>" // 3 Flaeche
420                ."<span title='geometrisch berechnete Fl&auml;che = ".$fsgeomflaed."' class='flae'>".$fsbuchflaed."</span></td>"
421        ."\n\t<td>&nbsp;</td>" // 4
422        ."\n\t<td>&nbsp;</td>" // 5
423        ."\n\t<td>" // 6 Link auf GebÀude-Auswertung
424                ."\n\t\t<p class='nwlink noprint'>" // Gebaeude-Verschneidung
425                ."\n\t\t\t<a href='alkisgebaeudenw.php?gkz=".$gkz."&amp;gmlid=".$gmlid.LnkStf();
426                if ($cnt_adressen > 0) { // wenn Adresse vorgekommen ist
427                        echo "' title='Geb&auml;ude oder Bauwerke auf oder an dem Flurst&uuml;ck'>Geb&auml;ude/Bauw.";
428                } else { // GebÀude mit Adresse gibt es NICHT, das ist klar
429                        echo "' title='Suche Geb&auml;ude (ohne Adresse) oder Bauwerke auf dem Flurst&uuml;ck'>Geb&auml;ude/Bauw.";
430                }
431                echo "<img src='ico/Haus.png' width='16' height='16' alt=''></a>"
432                ."\n\t\t</p>"
433        ."\n\t</td>" // 6
434        ."\n</tr>";
435
436// B o d e n s c h À t z u n g
437// ---------------------------
438// Tabelle "klas_3x" (norbit-ALB): Dort fehlen Bodenart und Zustandsstufe, es ist aber bereits auf BuchflÀche umgerechnet.
439
440// BodenschÀtzungs-Abschnitte mit FlurstÌcken verschneiden, Spalten entschlÌsseln
441$sql="SELECT b.kulturart AS kulturartk, kulturart.beschreibung AS kulturartv,
442 b.bodenart AS bodenartk, bodenart.beschreibung AS bodenartv, zustbod.beschreibung AS zustbodv,
443 b.entstehungsartoderklimastufewasserverhaeltnisse AS entsteh, b.sonstigeangaben,
444 coalesce(b.bodenzahlodergruenlandgrundzahl, '') as bodenzahl, b.ackerzahlodergruenlandzahl AS ackerzahl,
445 b.jahreszahl, st_area(st_intersection(b.wkb_geometry, f.wkb_geometry)) AS schnittflae
446FROM ax_flurstueck f
447JOIN ax_bodenschaetzung b ON st_intersects(b.wkb_geometry, f.wkb_geometry) AND st_area(st_intersection(b.wkb_geometry, f.wkb_geometry)) > 0.05
448LEFT JOIN ax_bodenart_bodenschaetzung bodenart ON b.bodenart = bodenart.wert
449LEFT JOIN ax_kulturart_bodenschaetzung kulturart ON b.kulturart = kulturart.wert
450LEFT JOIN ax_zustandsstufeoderbodenstufe_bodenschaetzung zustbod ON b.zustandsstufeoderbodenstufe = zustbod.wert
451WHERE f.gml_id = $1 AND f.endet IS NULL AND b.endet IS NULL ORDER BY schnittflae DESC";
452
453$v = array($gmlid);
454$res = pg_prepare($con, "", $sql);
455$res = pg_execute($con, "", $v);
456if (!$res) {echo "\n<p class='err'>Fehler bei DB-Abfrage zur Klassifizierung Boden</p>\n";}
457$gesertragsmz = 0; // Gesamt-ErtragsMesszahl
458$klasflae = 0; // Summe klassifizierte FlÀche
459$j=0;
460if(!empty($res) && pg_num_rows($res) > 0) {
461        while ($row = pg_fetch_assoc($res)) {
462                $kulturartk=$row['kulturartk']; // Key  -
463                $kulturartv=$row['kulturartv']; // - Value             
464                if (substr($kulturartv, 0, 3) === 'Ack') { // A
465                        $kbez1="Bodenzahl";
466                        $kbez2="Ackerzahl";
467                } else { // Gr
468                        $kbez1="Gr&uuml;nlandgrundzahl";
469                        $kbez2="Gr&uuml;nlandzahl";
470                }
471                $absflae = $row['schnittflae'];
472                $absbuchflae = $absflae * $the_Xfactor;
473                $klasflae+=$absbuchflae;
474
475                $boedenzahl=ltrim($row['bodenzahl'], '0');
476                if (is_null($row['ackerzahl'])) {
477                        $ackerzahl="";
478                        $ertragszahl = 0;       
479                } else {
480                        $ackerzahl=ltrim($row['ackerzahl'], '0');
481                        $ertragszahl = intval($absbuchflae * $row['ackerzahl'] / 100);
482                }
483                $gesertragsmz+=$ertragszahl;
484        //      $absflaedis = number_format($absflae,0,",",".")." m&#178;"; // als Tool-Tip ?
485                $absbuchflaedis = number_format($absbuchflae,0,",",".")." m&#178;";
486
487                $jahr=$row['jahreszahl'];
488                $entsteh=$row['entsteh'];
489                $sonst=$row['sonstigeangaben'];
490                if ($j === 0) { // 1
491                        echo "\n<tr>\n\t<td class='ll' title='Abschnitt Bodensch&auml;tzung'><img src='ico/Landwirt.png' width='16' height='16' alt=''> Bodensch&auml;tzung:</td>";
492                } else {
493                        echo "\n<tr>\n\t<td>&nbsp;</td>";
494                }
495                echo "\n\t<td class='fla' title='Ertragsmesszahl: Produkt von ".$kbez2."/100 und Fl&auml;che.'>EMZ ".$ertragszahl."</td>"
496                ."\n\t<td class='re' title='Fl&auml;che des Sch&auml;tzungsabschnitts'>".$absbuchflaedis."</td>"
497                ."\n\t<td class='lr'><span title='".$kbez1."'>".$boedenzahl."</span>/<span title='".$kbez2."'>".$ackerzahl."</span></td>"
498                ."\n\t<td class='lr'>";
499                echo "\n\t\t".DsKy($kulturartk, 'Kulturart')." <span title='Kulturart-*'>".$kulturartv."</span>";
500                echo "\n\t\t<br>".DsKy($row['bodenartk'], 'Bodenart-*')." <span title='Bodenart'>".$row['bodenartv']."</span>";
501                echo "\n\t\t<br><span title='Zustandsstufe'>".$row['zustbodv']."</span>";
502
503                        // 2 ARRAYs auflösen
504                        if (isset($entsteh)) {
505                                $ent=trim($entsteh, "{}");
506                                echo "\n\t\t<br><span title='Enststehungsart oder Klimastufe, Wasserverh&auml;ltnisse'>".DsKy($ent, '*');
507                                werteliste('e', $ent, $con); // ++ Zeilenweise mit <br> ?
508                                echo "</span>";
509                        }
510                        if (isset($sonst)) {
511                                $son=trim($sonst, "{}");
512                                echo "\n\t\t<br><span title='Sonstige Angaben'>".werteliste('s', $son, $con)."</span>"; // ++ Zeilenweise mit <br> ?
513                        }
514                        if (isset($jahr)) {
515                                echo "\n\t\t<br><span title='Jahreszahl'>".$jahr."</span>";
516                        }
517                echo "\n\t</td>"
518                ."\n\t<td>&nbsp;</td>\n</tr>";
519                $j++;
520        }
521        // Summenzeile
522        $klasflaedis = number_format($klasflae,0,",",".")." m&#178;";
523        echo "\n<tr>\n\t<td class='re'>Ertragsmesszahl:</td>" // 1
524        ."\n\t<td class='fla sum' title='Summe der Ertragsmesszahlen f&uuml;r dies Flurst&uuml;ck'>".$gesertragsmz."</td>" // 2
525        ."\n\t<td class='re'>".$klasflaedis."</td>" // 3
526        ."\n\t<td colspan='3'>&nbsp;</td>\n</tr>"; // 4-6
527}
528
529// H i n w e i s
530// auf  "Bau-, Raum- oder Bodenordnungsrecht" (Baulast, Flurbereinigung) oder eine "strittige Grenze"
531
532// Gemeinsame FlÀche suchen: entweder (ST_Intersects and not ST_Touches) oder (2xST_Within OR ST_Overlaps), ST_Intersects liefert auch angrenzende
533$sql_boden ="SELECT b.artderfestlegung AS wert, a.beschreibung AS art_verf, b.gml_id AS verf_gml, b.bezeichnung AS verf_bez,
534b.name AS verf_name, d.bezeichnung AS stelle_bez, d.stelle AS stelle_key
535FROM ax_flurstueck f
536JOIN ax_bauraumoderbodenordnungsrecht b ON ST_Within(b.wkb_geometry, f.wkb_geometry) OR ST_Within(f.wkb_geometry, b.wkb_geometry) OR ST_Overlaps(b.wkb_geometry, f.wkb_geometry)
537LEFT JOIN ax_artderfestlegung_bauraumoderbodenordnungsrecht a ON b.artderfestlegung=a.wert
538LEFT JOIN ax_dienststelle d ON b.stelle=d.stelle ".UnqKatAmt("b","d")
539."WHERE f.gml_id = $1 AND f.endet IS NULL AND b.endet IS NULL AND d.endet IS NULL";
540
541pg_prepare($con, "bodeneuordnung", $sql_boden);
542$res_bodeneuordnung = pg_execute($con, "bodeneuordnung", array($gmlid));
543if (!$res_bodeneuordnung) {
544        echo "\n<p class='err'>Fehler bei Bau-, Raum- oder Bodenordnungsrecht</p>";
545        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_boden)."</p>";}
546}
547$sql_str="SELECT gml_id FROM ax_besondereflurstuecksgrenze WHERE endet IS NULL AND 1000 = ANY(artderflurstuecksgrenze)
548AND ST_touches((SELECT wkb_geometry FROM ax_flurstueck WHERE gml_id = $1 AND endet IS NULL),wkb_geometry);";
549
550pg_prepare($con, "strittigeGrenze", $sql_str);
551$res_strittigeGrenze = pg_execute($con, "strittigeGrenze", array($gmlid));
552if (!$res_strittigeGrenze) {
553        echo "\n<p class='err'>Fehler bei strittige Grenze</p>";
554        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sql_str)."</p>";}
555}
556if (pg_num_rows($res_bodeneuordnung) > 0 OR pg_num_rows($res_strittigeGrenze) > 0) {
557        echo "\n<tr>"
558        ."\n\t<td title='Hinweise zum Flurst&uuml;ck'><h6><img src='ico/Hinweis.png' width='16' height='16' alt=''> " // 1
559        ."Hinweise:</h6></td>\n\t<td colspan='5'>&nbsp;</td>\n</tr>";// 2-6
560        if (pg_num_rows($res_bodeneuordnung) > 0) {
561                while ($row = pg_fetch_assoc($res_bodeneuordnung)) { // 3 Zeilen je Verfahren
562                        echo "\n<tr title='Bau-, Raum- oder Bodenordnungsrecht'>" // Zeile 1 - kommt immer, darum hier den Link
563                                ."\n\t<td>Bodenrecht</td>" // 1
564                                ."\n\t<td class='re'>Festlegung: </td>" // 2 "Art der Festlegung" zu lang
565                                ."\n\t<td colspan='3'>".DsKy($row['wert'], 'Art des Verfahrens').$row['art_verf']."</td>";
566                                echo "\n\t<td>"
567                                        ."\n\t\t<p class='nwlink noprint'>"
568                                        ."\n\t\t\t<a href='alkisbaurecht.php?gkz=".$gkz."&amp;gmlid=".$row['verf_gml'].LnkStf()
569                                        ."' title='Bau-, Raum- oder Bodenordnungsrecht'>Recht <img src='ico/Gericht.png' width='16' height='16' alt=''></a>"
570                                        ."\n\t\t</p>"           
571                                ."\n\t</td>"
572                        ."\n</tr>";
573                        $dstell=$row['stelle_key']; // Zeile 2
574                        if ($dstell != '') {
575                                echo "\n<tr title='Flurbereinigungsbeh&ouml;rde'>"
576                                        ."\n\t<td>&nbsp;</td>" // 1
577                                        ."\n\t<td class='re'>Dienststelle: </td>" // 2
578                                        ."\n\t<td colspan='3'>".DsKy($dstell, 'Art der Dienststelle').$row['stelle_bez']."</td>"
579                                        ."\n\t<td>&nbsp;</td>"
580                                ."\n</tr>";
581                        }
582                        $vbez=$row['verf_bez']; // Zeile 3, ist nicht immer gefÃŒllt
583                        $vnam=$row['verf_name']; // noch seltener
584                        if ($vbez != '') {
585                                echo "\n<tr title='Verfahrensbezeichnung'>"
586                                        ."\n\t<td>&nbsp;</td>"
587                                        ."\n\t<td class='re'>Verfahren: </td>"
588                                        ."\n\t<td colspan='3'>";
589                                        if ($vnam == "") {
590                                                echo $vbez; // nur die Nummer
591                                        } else { // Name oder beides
592                                                echo DsKy($vbez, 'Nummer des Verfahrens').$vnam;
593                                        }
594                                        echo "</td>"
595                                        ."\n\t<td>&nbsp;</td>"
596                                ."\n</tr>";
597                        }
598                }
599        }
600        if (pg_num_rows($res_strittigeGrenze) > 0) { // 1 Zeile
601                echo "\n<tr>\n<td>Strittige Grenze:</td>"
602                ."<td colspan=4>Mindestens eine Flurst&uuml;cksgrenze ist als <b>strittig</b> zu bezeichnen. Sie kann nicht festgestellt werden, weil die Beteiligten sich nicht &uuml;ber den Verlauf einigen. Nach sachverst&auml;ndigem Ermessen der Katasterbeh&ouml;rde ist anzunehmen, dass das Liegenschaftskataster nicht die rechtm&auml;&szlig;ige Grenze nachweist.</td>"
603                ."\n<td>&nbsp;</td>\n</tr>";
604        }
605}
606echo "\n</table>";
607
608// B U C H U N G S S T E L L E N  zum FS
609$bartgrp="";    // Buchungsart
610$barttypgrp=""; // Buchungsart Typ
611if ($gml_buchungsstelle === '') {
612                echo "\n<p class='err'>Keine Buchungstelle zum Flurst&uuml;ck gefunden.</p>"; // keine Verweis vorhanden?
613} else {
614        echo "\n<table class='outer'>"; // ALLE Buchungen und EigentÃŒmer in 4 Spalten EINER Tabelle ausgeben
615       
616        $stufe=1; // SchleifenzÀhler Tiefe
617        $gezeigt=buchung_anzg($gml_buchungsstelle, $eig, false, $gmlid, 1); // die ("dienende") Buchung anzeigen, wenn nicht fiktiv. Liefert 1/0
618
619        $anzber=ber_bs_zaehl($gml_buchungsstelle);      // Anzahl berechtigte Buchungen (nÀchste Stufe) zu dieser Buchung ermitteln
620        $verf_next = array($gml_buchungsstelle);        // Start Recursion mit einem Element
621        //if ($dbg > 1) {echo "<p class='dbg'>Nach Stufe ".$stufe.", Anzahl: ". $anzber ."</p>";}
622
623        while ($anzber > 0 ) { // Stufe - recursiv in die Tiefe, solange es was zu verfolgen gibt
624                $verf_akt=$verf_next; // die nÀchste Stufe als aktuell ÃŒbernehmen ..
625                $verf_next=array(); // .. und zum AuffÃŒllen leeren
626                $stufe++;
627                foreach($verf_akt as $gml_ber_bs) {
628                        if (ber_bs_zaehl($gml_ber_bs) > 0) {
629                                $verf_neu=ber_bs_anzg($gml_ber_bs, $eig, false, $gmlid, ""); // Anzeige ber. Buchungst., ggf. mit EigentÃŒmer.
630                                $anz_neu=count($verf_neu); // Das Ergebnis zÀhlen
631                                if ($anz_neu > 0) { // wenn neue geliefert
632                                        $verf_next=array_merge($verf_next, $verf_neu); // die neuen an die Sammlung heften
633                                }
634                        }
635                } // Ende Buchungs-Array in der Stufe
636                $anzber=count($verf_next); // Sammlung auf Stufe zÀhlen, Steuert die Schleife.
637        } // Ende Stufe
638
639        echo "\n</table>\n\n";
640
641        // Fehler aus "ModellschwÀche" erkennen.
642        // Wenn der Verweis der Buchungsstelle auf ein Grundbuch ins Leere lÀuft, weil das Grundbuch
643        //  nicht im SekundÀrbestand vorhanden ist, dann könnte das am NBA-Verfahren liegen.
644        if ( $gezeigt === 0 and $stufe === 1 ) {
645                echo "<p class='err'>Das Grundbuch zur Buchung '".$gml_buchungsstelle."' fehlt in der Datenbank.</p>";
646                if ($dbg > 2) { // fehlt die Buchung?
647                        echo "<p class='dbg'>Suchen mit SQL: SELECT * FROM ax_buchungsstelle WHERE gml_id='".$gml_buchungsstelle."'; </p>";
648                }
649        }
650}
651
652pg_close($con);
653echo "<div class='buttonbereich noprint'>\n<hr>"
654        ."\n\t<a title='zur&uuml;ck' href='javascript:history.back()'><img src='ico/zurueck.png' width='16' height='16' alt='zur&uuml;ck'></a>&nbsp;";
655if ($PrntBtn==true){echo "\n\t<a title='Drucken' href='javascript:window.print()'><img src='ico/print.png' width='16' height='16' alt='Drucken'></a>&nbsp;";}
656echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"".$gmlid."\")'><img src='ico/download_fs.png' width='32' height='16' alt='Export'></a>&nbsp;\n</div>";
657
658footer($gmlid, selbstverlinkung()."?", "&amp;eig=".$eig);
659?>
660</body>
661</html>
Note: See TracBrowser for help on using the repository browser.