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

Revision 427, 31.3 KB checked in by frank.jaeger, 2 years ago (diff)

Überarbeitung der Auskunft: Durch Functions den Code verdichtet. Drei neue Arten von Bauwerken.

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