source: trunk/info/info/alkisn/alkishaus.php @ 387

Revision 387, 15.4 KB checked in by frank.jaeger, 7 years ago (diff)

Überarbeitung der Buchauskunft: FS-Nachweis enthält optional die berechtigten Buchungen, Input-Validation, Styling, kleinere Korrekturen, HTML-Profilierung

Line 
1<?php
2/*      alkishaus.php - viele Daten zu EINEM ALKIS-GebÀude-Objekt
3        ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
4
5        Version:
6        2016-02-24 Version fuer norGIS-ALKIS-Import
7        2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermöglichen
8        2016-12-05 Array-Behandlung ax_gebaeude.name
9        2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
10
11        ToDo:
12        - sinnvolle Sortierung und Gruppierung der Felder
13        - geometrische Suche nach FS, auf denen das Haus steht
14        - Template im WMS auf Ebene GebÀude hierhin verknÃŒpfen.
15        - Relationen abbilden:
16                ax_gebaeude >gehoertZu> ax_gebaeude  (ringförmige Verbindung GebÀudekomplex)
17                ax_gebaeude (umschliesst) ax_bauteil
18                ax_gebaeude >gehoert> ax_person (Ausnahme)
19*/
20session_start();
21
22$allfld = "n"; $showkey="n"; // Var. aus Parameter initalisieren
23$cntget = extract($_GET); // Parameter in Variable umwandeln
24
25// strikte Validierung aller Parameter
26if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
27if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
28if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
29if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
30
31if (!preg_match('#^[j|n]{0,1}$#', $allfld)) {die ("Eingabefehler allfld");}
32if ($allfld == "j") {$allefelder=true;} else {$allefelder=false;}
33
34require_once("alkis_conf_location.php");
35if ($auth == "mapbender") {require_once($mapbender);}
36include("alkisfkt.php");
37?>
38<!doctype html>
39<html lang="de">
40<head>
41        <meta charset="utf-8">
42        <meta name="viewport" content="width=device-width, initial-scale=1.0">
43        <title>ALKIS Daten zum Haus</title>
44        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
45        <link rel="shortcut icon" type="image/x-icon" href="ico/Haus.ico">
46        <style type='text/css' media='print'> td.mittelspalte {width: 190px;} </style>
47</head>
48<body>
49<?php
50
51$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkishaus.php'");
52if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>";
53
54// G e b a e u d e
55
56$sqlg ="SELECT g.gml_id, g.name, g.bauweise, g.gebaeudefunktion, g.anzahlderoberirdischengeschosse AS aog, g.anzahlderunterirdischengeschosse AS aug,
57g.lagezurerdoberflaeche, g.dachgeschossausbau, g.zustand, array_to_string(g.weiteregebaeudefunktion, ',') AS wgf, g.dachform, g.hochhaus, g.objekthoehe, g.geschossflaeche, g.grundflaeche, g.umbauterraum, g.baujahr, g.dachart, g.qualitaetsangaben,
58h.v AS bbauw, h.d AS dbauw, u.v AS bfunk, u.d AS dfunk, z.v AS zustandv, z.d AS zustandd, d.v AS bdach, a.v AS dgaus, o.v AS oflv, o.d AS ofld,
59round(st_area(g.wkb_geometry)::numeric,2) AS gebflae
60FROM ax_gebaeude g
61LEFT JOIN alkis_wertearten h ON cast(g.bauweise AS character varying)=h.k AND h.element='ax_gebaeude' AND h.bezeichnung='bauweise'
62LEFT JOIN alkis_wertearten u ON cast(g.gebaeudefunktion AS character varying)=u.k AND u.element='ax_gebaeude' AND u.bezeichnung='gebaeudefunktion'
63LEFT JOIN alkis_wertearten z ON cast(g.zustand AS character varying)=z.k AND z.element='ax_gebaeude' AND z.bezeichnung='zustand'
64LEFT JOIN alkis_wertearten d ON cast(g.dachform AS character varying)=d.k AND d.element='ax_gebaeude' AND d.bezeichnung='dachform'
65LEFT JOIN alkis_wertearten a ON cast(g.dachgeschossausbau AS character varying)=a.k AND a.element='ax_gebaeude' AND a.bezeichnung='dachgeschossausbau'
66LEFT JOIN alkis_wertearten o ON cast(g.lagezurerdoberflaeche AS character varying)=o.k AND o.element='ax_gebaeude' AND o.bezeichnung='lagezurerdoberflaeche'
67WHERE g.gml_id= $1 AND g.endet IS NULL;";
68
69$v = array($gmlid);
70$resg = pg_prepare("", $sqlg);
71$resg = pg_execute("", $v);
72if (!$resg) {
73        echo "\n<p class='err'>Fehler bei Geb&auml;ude.<br>".pg_last_error()."</p>";
74        if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlg."<br>$1 = gml_id = '".$gmlid."'</p>";}
75}
76
77// Balken
78echo "\n<p class='geb'>ALKIS Haus ".$gmlid."&nbsp;</p>"; // ++ Kennzeichen?
79echo "\n<h2><img src='ico/Haus.png' width='16' height='16' alt=''> Haus (Geb&auml;ude)</h2>";
80
81// Kennzeichen in Rahmen
82// - Welches Kennzeichen zum Haus ?
83echo "\n<hr>";
84// Umschalter: auch leere Felder ausgeben?
85echo "<p class='nwlink noprint'>";
86echo "Umschalten: <a class='nwlink' href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;gmlid=".$gmlid;
87        if ($showkey) {echo "&amp;showkey=j";} else {echo "&amp;showkey=n";}
88        if ($allefelder) {
89                echo "&amp;allfld=n'>nur Felder mit Inhalt";
90        } else {
91                echo "&amp;allfld=j'>auch leere Felder";
92        }
93echo "</a></p>";
94
95$gebnr = 0;
96
97while($rowg = pg_fetch_array($resg)) { // Schleife, kann aber nur EIN Haus sein.
98        $gebnr++;
99        echo "\n<table class='geb'>"
100        ."\n<tr>\n"
101                ."\n\t<td class='head' title=''>Attribut</td>"
102                ."\n\t<td class='head mittelspalte' title=''>Wert</td>"
103                ."\n\t<td class='head' title=''>Erkl&auml;rung</td>"
104        ."\n</tr>";
105
106        $aog=$rowg["aog"];
107        $aug=$rowg["aug"];
108        $hoh=$rowg["hochhaus"];
109        $nam=trim(trim($rowg["name"], "{}"), '"'); // Gebaeude-Name ist ein Array in der DB: '{"A","B"}'
110        // Mehrfachbelegung nur theoretisch. Entklammern reicht. Mal mit und mal ohne "" drum !?
111        /* SELECT name FROM ax_gebaeude WHERE NOT name IS NULL AND array_length(name, 1) > 1; */
112        $kfunk=$rowg["gebaeudefunktion"];
113        $bfunk=$rowg["bfunk"];
114        $dfunk=$rowg["dfunk"];
115
116        $baw=$rowg["bauweise"];
117        $bbauw=$rowg["bbauw"];
118        $dbauw=$rowg["dbauw"];
119
120        $ofl=$rowg["lagezurerdoberflaeche"];
121        $oflv=$rowg["oflv"];
122        $ofld=$rowg["ofld"];
123
124        $dga=$rowg["dachgeschossausbau"]; // Key
125        $dgav=$rowg["dgaus"]; // Value
126
127        $zus=$rowg["zustand"]; // Key
128        $zusv=$rowg["zustandv"]; // Value
129        $zusd=$rowg["zustandd"]; // Description
130
131        $wgf=$rowg["wgf"]; // Array-> kommagetrennte Liste
132
133        $daf=$rowg["dachform"]; // Key
134        $dach=$rowg["bdach"]; // Value
135
136        $hho=$rowg["objekthoehe"];
137        $gfl=$rowg["geschossflaeche"];
138        $grf=$rowg["grundflaeche"];
139        $ura=$rowg["umbauterraum"];
140        $bja=$rowg["baujahr"];
141        $daa=$rowg["dachart"];
142        $qag=$rowg["qualitaetsangaben"];
143
144        if (($nam != "") OR $allefelder) {
145                echo "\n<tr>"
146                        ."\n\t<td class='li'>Name</td>"
147                        ."\n\t<td>".$nam."</td>"
148                        ."\n\t<td class='erkl'>'Name' ist der Eigenname oder die Bezeichnung des Geb&auml;udes.</td>"
149                ."\n</tr>";
150        }
151
152        // 0 bis N   L a g e bezeichnungen mit Haus- oder Pseudo-Nummer
153
154        // HAUPTgebÀude
155        $sqll ="SELECT 'm' AS ltyp, l.gml_id AS gmllag, s.lage, s.bezeichnung, l.hausnummer, '' AS laufendenummer FROM ax_gebaeude g
156        JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(g.zeigtauf)
157        JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage
158        WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL";
159        // oder NEBENgebÀude
160        $sqll.=" UNION
161        SELECT 'p' AS ltyp, l.gml_id AS gmllag, s.lage, s.bezeichnung, l.pseudonummer AS hausnummer, l.laufendenummer
162        FROM ax_gebaeude g
163        JOIN ax_lagebezeichnungmitpseudonummer l ON l.gml_id=g.hat
164        JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage
165        WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL ";
166
167        $sqll.="ORDER BY bezeichnung, hausnummer ;";
168
169        $v = array($gmlid);
170        $resl = pg_prepare("", $sqll);
171        $resl = pg_execute("", $v);
172        if (!$resl) {
173                echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
174                if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
175        }
176        $zhsnr=0;
177        while($rowl = pg_fetch_array($resl)) { // LOOP: Lagezeilen
178                $zhsnr++;
179                $ltyp=$rowl["ltyp"]; // Lagezeilen-Typ
180                $skey=$rowl["lage"]; // Str.-Schluessel
181                $snam=htmlentities($rowl["bezeichnung"], ENT_QUOTES, "UTF-8"); // -Name
182                $hsnr=$rowl["hausnummer"];
183                $hlfd=$rowl["laufendenummer"];
184                $gmllag=$rowl["gmllag"];
185
186                if ($zhsnr == 1) {
187                        echo "\n<tr>"
188                                ."\n\t<td class='li' title='Lage mit Hausnummer oder Pseudonummer'>Adresse</td>"
189                                ."\n\t<td class='fett'>";
190                }
191                echo "\n\t\t<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''>&nbsp;";
192                if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}                     
193                echo "\n\t\t<a title='Hausnummer' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
194                        if ($showkey) {echo "&amp;showkey=j";}
195                        echo "'>".$snam."&nbsp;".$hsnr;
196                        if ($ltyp == "p") {echo ", lfd.Nr ".$hlfd;}
197                echo "</a><br>";
198        } // Ende Loop Lagezeilen m.H.
199        if ($zhsnr > 0) {echo "\n\t</td>\n\t<td>&nbsp;</td>\n</tr>";}
200
201        // GebÀudefunktion
202        echo "\n<tr>"
203                ."\n\t<td class='li'>Geb&auml;udefunktion</td>"
204                ."\n\t<td class='fett'>";
205                if ($showkey) {echo "<span class='key'>".$kfunk."</span>&nbsp;";}
206                echo $bfunk."</td>"
207                ."\n\t<td class='erkl'>'Geb&auml;udefunktion' ist die zum Zeitpunkt der Erhebung vorherrschend funktionale Bedeutung des Geb&auml;udes'<br>".$dfunk."</td>"
208        ."\n</tr>";
209
210        // Bauweise
211        if ($baw != "" OR $allefelder) {
212                echo "\n<tr>"
213                        ."\n\t<td class='li'>Bauweise</td>"
214                        ."\n\t<td class='fett'>";
215                        if ($showkey) {echo "<span class='key'>".$baw."</span>&nbsp;";}
216                        echo $bbauw."</td>"
217                        ."\n\t<td class='erkl'>'Bauweise' ist die Beschreibung der Art der Bauweise.<br>".$dbauw."</td>"
218                ."\n</tr>";
219        }
220
221        // Geschosse
222        if ($aog != "" OR $allefelder) {
223                echo "\n<tr>"
224                        ."\n\t<td class='li'>Geschosse</td>"
225                        ."\n\t<td class='fett'>".$aog."</td>"
226                        ."\n\t<td class='erkl'>Anzahl oberirdischer Geschosse</td>"
227                ."\n</tr>";
228        }
229
230        // U-Geschosse
231        if ($aug != "" OR $allefelder) {
232                echo "\n<tr>"
233                        ."\n\t<td class='li'>U-Geschosse</td>"
234                        . "\n\t<td class='fett'>".$aug."</td>"
235                        ."\n\t<td class='erkl'>Anzahl unterirdischer Geschosse</td>"
236                ."\n</tr>";
237        }
238
239        // Hochhaus
240        if ($hoh != "" OR $allefelder) {
241                echo "\n<tr>"
242                        ."\n\t<td class='li'>Hochhaus</td>"
243                        ."\n\t<td class='fett'>".$hoh."</td>"
244                        ."\n\t<td class='erkl'>'Hochhaus' ist ein Geb&auml;ude, das nach Geb&auml;udeh&ouml;he und Auspr&auml;gung als Hochhaus zu bezeichnen ist. F&uuml;r Geb&auml;ude im Geschossbau gilt dieses i.d.R. ab 8 oberirdischen Geschossen, f&uuml;r andere Geb&auml;ude ab einer Geb&auml;udeh&ouml;he von 22 m.</td>"
245                ."\n</tr>";
246        }
247
248        // Lage zur ErdoberflÀche
249        if ($ofl != "" OR $allefelder) {
250                echo "\n<tr>"
251                        ."\n\t<td class='li'>Lage zur Erdoberfl&auml;che</td>"
252                        ."\n\t<td class='fett'>";
253                        if ($showkey) {echo "<span class='key'>".$ofl."</span>&nbsp;";}
254                        echo $oflv."</td>"
255                        ."\n\t<td class='erkl'>'Lage zur Erdoberfl&auml;che' ist die Angabe der relativen Lage des Geb&auml;udes zur Erdoberfl&auml;che. Diese Attributart wird nur bei nicht ebenerdigen Geb&auml;uden gef&uuml;hrt.<br>".$ofld."</td>"
256                ."\n</tr>";
257        }
258
259        // Dachgeschossausbau
260        // nichts dazu in alkis_wertearten.d
261        if ($dga != "" OR $allefelder) {
262                echo "\n<tr>"
263                        ."\n\t<td class='li'>Dachgeschossausbau</td>"
264                        ."\n\t<td class='fett'>";
265                        if ($showkey) {echo "<span class='key'>".$dga."</span>&nbsp;";}
266                        echo $dgav."</td>"
267                        ."\n\t<td class='erkl'>'Dachgeschossausbau' ist ein Hinweis auf den Ausbau bzw. die Ausbauf&auml;higkeit des Dachgeschosses.</td>"
268                ."\n</tr>";
269        }
270
271        // Zustand
272        if ($zus != "" OR $allefelder) {
273                echo "\n<tr>"
274                        ."\n\t<td class='li'>Zustand</td>"
275                        ."\n\t<td class='fett'>";
276                        if ($showkey) {echo "<span class='key'>".$zus."</span>&nbsp;";}
277                        echo $zusv."</td>"
278                        ."\n\t<td class='erkl'>'Zustand' beschreibt die Beschaffenheit oder die Betriebsbereitschaft von 'Geb&auml;ude'. Diese Attributart wird nur dann optional gef&uuml;hrt, wenn der Zustand des Geb&auml;udes vom nutzungsf&auml;higen Zustand abweicht.<br>".$zusd."</td>"
279                ."\n</tr>";
280        }
281
282        // Weitere GebÀudefunktionen
283        // Suche Testfall: SELECT * FROM ax_gebaeude WHERE NOT weiteregebaeudefunktion IS NULL;
284        // Keiner zu finden. Das folgende ungetestet:
285        if ($wgf != "" OR $allefelder) { // "weiteregebaeudefunktion" ist ein Array
286                echo "\n<tr>"
287                        ."\n\t<td class='li'>Weitere Geb&auml;udefunktionen</td>"
288                        ."\n\t<td>";
289                        if ($wgf != "") { // Kommagetrennte Liste aus Array
290                                $sqlw="SELECT k, v, d FROM alkis_wertearten WHERE k IN ( $1 ) AND element='ax_gebaeude' AND bezeichnung='weiteregebaeudefunktion' ORDER BY k;";
291                                $v = array($wgf);
292                                $resw = pg_prepare("", $sqlw);
293                                $resw = pg_execute("", $v);
294                                if (!$resw) {
295                                        echo "\n<p class='err'>Fehler bei Geb&auml;ude - weitere Funktion.</p>";
296                                        if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlw."<br>$1 = Werteliste = '".$wgf."'</p>";}
297                                }
298                                $zw=0;
299                                while($roww = pg_fetch_array($resw)) { // LOOP: w.Funktion
300                                        if ($zw > 0) {echo "<br>";}
301                                        if ($showkey) {echo "<span class='key'>".$roww["k"]."</span>&nbsp;";}
302                                        echo "<span title='".$roww["d"]."'>".$roww["v"]."</span>";
303                                        $zw++;
304                           }
305                        }
306                        echo "</td>"
307                        ."\n\t<td class='erkl'>'Weitere Geb&auml;udefunktion' ist die Funktion, die ein Geb&auml;ude neben der dominierenden Geb&auml;udefunktion hat.</td>"
308                ."\n</tr>";
309        }
310
311        // Dachform
312        // nichts dazu in alkis_wertearten.d
313        if ($daf != "" OR $allefelder) {
314                echo "\n<tr>"
315                        ."\n\t<td class='li'>Dachform</td>"
316                        ."\n\t<td class='fett'>";
317                        if ($showkey) {echo "<span class='key'>".$daf."</span>&nbsp;";}
318                        echo $dach."</td>"
319                        ."\n\t<td class='erkl'>'Dachform' beschreibt die charakteristische Form des Daches.</td>"
320                ."\n</tr>";
321        }
322
323        // Objekthöhe
324        if ($hho != "" OR $allefelder) {
325                echo "\n<tr>"
326                        ."\n\t<td class='li'>Objekth&ouml;he</td>"
327                        ."\n\t<td class='fett'>".$hho."</td>"
328                        ."\n\t<td class='erkl'>'Objekth&ouml;he' ist die H&ouml;hendifferenz in [m] zwischen dem h&ouml;chsten Punkt der Dachkonstruktion und der festgelegten Gel&auml;ndeoberfl&auml;che des Geb&auml;udes.</td>"
329                ."\n</tr>";
330        }
331
332        // GeschossflÀche
333        if ($gfl != "" OR $allefelder) {
334                echo "\n<tr>"
335                        ."\n\t<td class='li'>Geschossfl&auml;che</td>"
336                        ."\n\t<td class='fett'>";
337                        if ($gfl != "") {echo $gfl." m&#178;";}
338                        echo "</td>"
339                        ."\n\t<td class='erkl'>'Geschossfl&auml;che' ist die Geb&auml;udegeschossfl&auml;che in [qm].</td>"
340                ."\n</tr>";
341        }
342
343        // GrundflÀche
344        if ($grf != "" OR $allefelder) {
345                echo "\n<tr>"
346                        ."\n\t<td class='li'>Grundfl&auml;che</td>"
347                        ."\n\t<td class='fett'>";
348                        if ($grf != "") {echo $grf." m&#178;";}
349                        echo "\n\t<td class='erkl'>'Grundfl&auml;che' ist die Geb&auml;udegrundfl&auml;che in [qm].</td>"
350                ."\n</tr>";
351        }
352
353        // Umbauter Raum
354        if ($ura != "" OR $allefelder) {
355                echo "\n<tr>"
356                        ."\n\t<td class='li'>Umbauter Raum</td>"
357                        ."\n\t<td class='fett'>".$ura."</td>"
358                        ."\n\t<td class='erkl'>'Umbauter Raum' ist der umbaute Raum [Kubikmeter] des Geb&auml;udes.</td>"
359                ."\n</tr>";
360        }
361
362        // Baujahr
363        if ($bja != "" OR $allefelder) {
364                echo "\n<tr>"
365                        ."\n\t<td class='li'>Baujahr</td>"
366                        ."\n\t<td class='fett'>".$bja."</td>"
367                        ."\n\t<td class='erkl'>'Baujahr' ist das Jahr der Fertigstellung oder der baulichen Ver&auml;nderung des Geb&auml;udes.</td>"
368                ."\n</tr>";
369        }
370
371        // Dachart
372        if ($daa != "" OR $allefelder) {
373                echo "\n<tr>"
374                        ."\n\t<td class='li'>Dachart</td>"
375                        ."\n\t<td class='fett'>".$daa."</td>"
376                        ."\n\t<td class='erkl'>'Dachart' gibt die Art der Dacheindeckung (z.B. Reetdach) an.</td>"
377                ."\n</tr>";
378        }
379
380        // QualitÀtsangaben
381        if ($qag != "" OR $allefelder) {
382                echo "\n<tr>"
383                        ."\n\t<td class='li'>Qualit&auml;tsangaben</td>"
384                        ."\n\t<td class='fett'>".$qag."</td>"
385                        ."\n\t<td class='erkl'>Angaben zur Herkunft der Informationen (Erhebungsstelle). Die Information ist konform zu den Vorgaben aus ISO 19115 zu repr&auml;sentieren.</td>"
386                ."\n</tr>";
387        }
388        echo "\n</table>";
389}
390if ($gebnr == 0) {echo "\n<p class='err'><br>Kein Geb&auml;ude gefunden<br>&nbsp;</p>";}
391
392// ++ ToDo: Verschnitt mit FS?
393
394?>
395
396<div class='buttonbereich noprint'>
397<hr>
398        <a title="zur&uuml;ck" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zur&uuml;ck"></a>&nbsp;
399        <a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a>&nbsp;
400</div>
401
402<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
403
404</body>
405</html>
Note: See TracBrowser for help on using the repository browser.