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

Revision 425, 32.2 KB checked in by frank.jaeger, 2 years ago (diff)

Web-GIS-Auskunft und Mapbender2-Navigation: neue Konfigurations-Parameter und verbessertes Grundbuch-Modul

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