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

Revision 422, 31.7 KB checked in by frank.jaeger, 3 years ago (diff)

Aktualisierungen der ALKIS-Buchauskunft, neues Modul für Bauwerke, Härtung

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