source: trunk/info/info/alkisn/alkisbauwerk.php @ 431

Revision 431, 29.5 KB checked in by frank.jaeger, 18 months ago (diff)

kleine Fehlerkorrekturen an der Auskunft

Line 
1<?php
2/*      alkisbauwerk.php
3
4        ALKIS-Buchauskunft
5        Author: Frank JÀger, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo)
6 
7        Bauwerksdaten
8
9        Typen von Bauwerken (jeweils eigene Tabellen mit unterschiedlicher Struktur):
10         1 Bauwerk im Verkehrsbereich
11         2 Bauwerk im GewÀsserbereich
12         3 Sonstiges Bauwerk oder sonstige Einrichtung 51009
13         4 Bauwerk oder Anlage fÃŒr Industrie und Gewerbe 51002
14         5 Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung 51006
15         6 Leitung 51005
16         7 Transportanlage 51004
17         8 Turm 51001
18         9 VorratsbehÀlter, Speicherbauwerk 51003
19        10 Historisches Bauwerk oder historische Einrichtung 51007
20        11 Heilquelle, Gasquelle 51008
21        12 Einrichtung in öffentlichen Bereichen 51010
22        (13 Besonderer Bauwerkspunkt 51011) fehlt noch
23
24        Version:
25        2021-03-11 Neues Modul
26        2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÀche). Debugging verbessert.
27        2022-01-13 Neue Functions LnkStf(), DsKy()
28        2022-02-23 Neue Bauwerks-Typen 10-12
29        2022-07-05 PHP 8.1: Connection verwenden bei "pg_prepare" und "pg_execute", keine NULL-Werte in String-Functions verwenden
30        2022-11-02 Fehlerkorrektur: break in switch
31
32ToDo:
33        - Vom Bauwerk ÃŒberlagerte FlurstÃŒcke ÃŒber geom. Verschneidung ermitteln und verlinken.
34        - Icon fÃŒr "Bauwerk" machen! Ggf. einzeln fÃŒr jede Art?
35*/
36
37// Ein Bauwerk (bw_) "gehört zu" (_gz_) (Relation) einem GebÀude. Zu diesem GebÀude die Lage-Zeilen als Tabellen ausgeben
38function bw_gz_lage($gmlgz) {
39        global $gkz, $dbg, $con;
40        // HAUPTgebÀude  Geb >zeigtAuf> lage (mehrere)
41        $sqlgz ="SELECT 'm' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.hausnummer, '' AS laufendenummer, p.bezeichnung as gemeinde "
42        ."FROM ax_gebaeude g JOIN ax_lagebezeichnungmithausnummer l ON l.gml_id=ANY(g.zeigtauf) "
43        ."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "     
44        ."JOIN ax_gemeinde p ON s.land=p.land AND s.regierungsbezirk=p.regierungsbezirk AND s.kreis=p.kreis AND s.gemeinde=p.gemeinde ".UnqKatAmt("s","p")
45        ."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL ";
46        // UNION - oder NEBENgebÀude  Geb >hat> Pseudo
47        $sqlgz.="UNION SELECT 'p' AS ltyp, l.gml_id AS lgml, s.lage, s.bezeichnung, l.pseudonummer AS hausnummer, l.laufendenummer, p.bezeichnung as gemeinde "
48        ."FROM ax_gebaeude g JOIN ax_lagebezeichnungmitpseudonummer l ON l.gml_id=g.hat "
49        ."JOIN ax_lagebezeichnungkatalogeintrag s ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=s.lage "
50        ."JOIN ax_gemeinde p ON s.land=p.land AND s.regierungsbezirk=p.regierungsbezirk AND s.kreis=p.kreis AND s.gemeinde=p.gemeinde ".UnqKatAmt("s","p")     
51        ."WHERE g.gml_id= $1 AND g.endet IS NULL AND l.endet IS NULL AND s.endet IS NULL ";
52
53        $sqlgz.="ORDER BY bezeichnung, hausnummer, laufendenummer;";
54        $v = array($gmlgz);
55        $resgz = pg_prepare($con, "", $sqlgz);
56        $resgz = pg_execute($con, "", $v);
57        if (!$resgz) {
58                echo "\n<p class='err'>Fehler bei Lage mit HsNr. zum Bauwerk</p>";
59                if ($dbg > 1) {
60                        echo "<p class='dbg'>Fehler:".pg_result_error($resgz)."</p>";
61                        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlgz."'", $sqlgz)."</p>";}
62                }
63        } else {
64                $erst=true;
65                while($rowgz = pg_fetch_assoc($resgz)) { // LOOP: Lagezeilen
66                        if ($erst) {
67                                echo "\n<tr>\n\t<td class='li'>Lage</td>";
68                                $erst=false;
69                        } else {
70                                echo "\n<tr>\n\t<td class='li'>&nbsp;</td>";
71                        }
72                        $ltyp=$rowgz["ltyp"];
73                        $skey=$rowgz["lage"];
74                        $snam=htmlentities($rowgz["bezeichnung"], ENT_QUOTES, "UTF-8");
75                        $hsnr=$rowgz["hausnummer"];
76                        $hlfd=$rowgz["laufendenummer"];
77                        $gmllag=$rowgz["lgml"];
78                        $gemeinde=htmlentities($rowgz["gemeinde"], ENT_QUOTES, "UTF-8");
79                        if ($ltyp === "p") {
80                                $lagetitl="Nebengeb&auml;ude Nr. ".$hlfd;
81                                $lagetxt=$snam." ".$hsnr." (".$hlfd."), ".$gemeinde;
82                        } else {
83                                $lagetitl="HauptgebÀude - HsNr. ".$hsnr;
84                                $lagetxt=$snam." ".$hsnr.", ".$gemeinde;
85                        }
86                        echo "\n\t<td class='adrlink'><a title='".$lagetitl."' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp.LnkStf()."'>"
87                        .DsKy($skey, 'Stra&szlig;en-*').$lagetxt."&nbsp;<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''></a>&nbsp;";
88                        echo "</td>\n\t<td><p class='erkli'>Adresse: ".$lagetitl."</p></td>\n</tr>";
89                }
90                pg_free_result($resgz);
91        }
92}
93
94// Eine Zeile der HTML-Tabelle ausgeben
95function tab_zeile($titel, $key, $inhalt, $ea, $ei) {
96        global $showkey, $allefelder, $dbg;
97        if ($inhalt != "" OR $allefelder) {
98                echo "\n<tr>\n\t<td class='li'>".$titel."</td>\n\t<td class='fett'>";
99                if ($showkey and $key != '') {echo "<span class='key'>(".$key.")</span> ";}
100                echo $inhalt."</td>\n\t<td>";
101                if ($ea != '') {echo "\n\t\t<p class='erklk'>".$ea."</p>";}     // Erkl. Attribut (allgemein)
102                if ($ei != '') {echo "\n\t\t<p class='erkli'>".$ei."</p>";}     // Erkl. Inhalt (speziell)
103                echo "\n\t</td>\n</tr>";
104        }
105}
106
107// Eine zusÀtzliche Daten-Spalte der Datenbank-Tabelle in eine Zeile der HTML-Tabelle ausgeben (Key|Value|ErklÀrung)
108// Anwendung fÃŒr die DB-Spalten, die nicht bei jeder Bauwerks-Tabelle vorkommen
109function zusatz_spalte($col, $inhalt) { // Spalten-Name, Value
110        global $dbg;
111        $einh='';
112        switch ($col) {
113                case 'objekthoehe':
114                        $titel='Objekth&ouml;he';
115                        $einh=' m';
116                break;
117                case 'breitedesobjekts':
118                        $titel='Breite des Objekts';
119                        $einh=' m';
120                break;
121                case 'bezeichnung':
122                        $titel='Bezeichnung';
123                break; 
124                case 'durchfahrtshoehe': // 1
125                        $titel='Durchfahrtsh&ouml;he';
126                        $einh=' m';
127                break; 
128                case 'spannungsebene': // 6
129                        $titel='Spannungsebene';
130                        $einh=' KV';
131                break;
132                case 'produkt': // 7
133                        $titel='Produkt';
134                break;
135                case 'kilometerangabe': // 12
136                        $titel='Kilometerangabe';
137                        $einh=' KM';
138                break;
139                default: // noch nicht berÃŒcksichtigt
140                        if ($dbg > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function zusatz_spalte noch nicht ber&uuml;cksichtigt.</p>";}
141                        $titel=$col;
142        }
143        if ($inhalt != '') {$inhalt.=$einh;}
144        tab_zeile($titel, '', $inhalt, '', '');
145}
146
147// Eine Zeile der HTML-Tabelle ausgeben, die einen Objektverweis (Relation) enthÀlt
148function verweis_zeile($zieltyp, $link, $info) {
149        echo "\n<tr>\n\t<td class='li'>".$zieltyp."</td>\n\t<td class='fett'>".$link."</td>\n\t<td>";
150        echo "\n\t\t<p class='erkli'>".$info."</p>\n\t</td>\n</tr>";
151}
152
153// Ein Relationen-Feld anzeigen
154// col = Name der DB-Spalte
155// inhalt = gml_id oder Array mit gml_id's
156function objektverweis($col, $inhalt) {
157        global $gkz, $showkey, $dbg;
158//      if ($dbg > 1) {echo "<p>Verweis Typ '".$col."' auf Objekt(e): '".$inhalt."'.</p>";}
159        switch ($col) {
160                case 'hatdirektunten': // [] In welcher Tabelle kann man dies Objekt finden?
161                        if (isset($inhalt)) {
162                                $olist='';
163                                $arrhdu=explode(",", trim($inhalt, "{}"));
164                                foreach($arrhdu AS $hdugml) {$olist.=$hdugml."<br>";}
165                                tab_zeile('Hat direkt Unten', '', $olist, '', 'Verweis auf Objekte unter diesem Bauwerk, Typ unbekannt.');
166                        }
167                break;
168
169                case 'gehoertzu': // Assoziation zu: FeatureType AX_Gebaeude (ax_gebaeude) 0..1'
170                        if ($inhalt == '') {
171                                verweis_zeile('Haus', '', 'Das Bauwerk geh&ouml;rt zum Haus');
172                        } else {
173                                $link="\n\t\t<a title='geh&ouml;rt zu' href='alkishaus.php?gkz=".$gkz."&amp;gmlid=".$inhalt.LnkStf()
174                                ."'>Haus&nbsp;<img src='ico/Haus.png' width='16' height='16' alt=''></a>";
175                                verweis_zeile('Haus', $link, 'Das Bauwerk geh&ouml;rt zum Haus');
176                                bw_gz_lage($inhalt);                           
177                        }
178                break;
179
180        // 'istabgeleitetaus';  'traegtbeizu': 'istteilvon': // -> Keine FÀlle vorhanden
181                default:
182                        if ($dbg > 1) {echo "<p class='dbg'>Der Feldname ".$col." ist in function 'objektverweis' noch nicht ber&uuml;cksichtigt.</p>";}
183        }
184}
185
186// S T A R T
187ini_set("session.cookie_httponly", 1);
188session_start();
189$allfld = "n"; $showkey="n"; $nodebug=""; // Var. initalisieren
190$cntget = extract($_GET);       // Parameter in Variable umwandeln
191
192// strikte Validierung aller Parameter
193if (isset($gmlid)) {
194        if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
195} else {
196        die("Fehlender Parameter");
197}
198if (isset($gkz)) {
199        if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
200} else {
201        die("Fehlender Parameter");
202}
203if (!preg_match('#^[0-9]{1,2}$#', $btyp)) {die("Eingabefehler btyp");} // Bauwerks-Typ = Tabelle
204if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
205if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
206if (!preg_match('#^[j|n]{0,1}$#', $allfld)) {die ("Eingabefehler allfld");}
207if ($allfld === "j") {$allefelder=true;} else {$allefelder=false;}
208if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
209
210include "alkis_conf_location.php";
211include "alkisfkt.php";
212
213echo <<<END
214<!doctype html>
215<html lang="de">
216<head>
217        <meta charset="utf-8">
218        <meta name="viewport" content="width=device-width, initial-scale=1.0">
219        <title>ALKIS Bauwerksdaten</title>
220        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
221        <link rel="shortcut icon" type="image/x-icon" href="ico/Haus.ico">
222</head>
223<body>
224
225END;
226
227$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
228$dbg=$debug;
229if ($nodebug === "j") {$dbg=0;}
230
231$con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisbauwerk.php'");
232if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>\n";
233
234// Konstanten fÃŒr Sortierung und Gruppierung nach Bauwerks-Typen
235$btyp_verkehr=1; $btyp_gewaesser=2; $btyp_sonst=3; $btyp_indu=4; $btyp_sport=5;
236$btyp_leitg=6; $btyp_trans=7; $btyp_turm=8; $btyp_vorrat=9;
237$btyp_hist=10; $btyp_heil=11; $btyp_oeff=12; $btyp_bpkt=13;
238
239/* in ALLEN Bauwerks-Typen folgende Spalten, bisher NICHT verwendet:
240    herkunft_source_source_ax_datenerhebung[] herkunft_source_source_scaledenominator[] herkunft_source_source_sourcereferencesystem[]
241    herkunft_source_source_sourceextent[]     herkunft_source_source_sourcestep[] */
242
243/* Fallunterscheidung: B a u w e r k s - T y p
244Nacheinander werden folgende Abfragen je Objekt ausgefÃŒhrt:
245        1. sqlb: Standard-Spalten, die bei jedem Typ vorhanden sind
246        2. sqlk: ZusÀtzliche Key-Value-Beziehungen (mit Key und ErklÀrung)
247        3. sqlz: ZusÀtzliche Spalten, individuell je Objektart (einfache Werte-Darstellung)
248        4. sqlr: Relationen zu anderen Objektarten */
249$WH=" WHERE b".$btyp.".gml_id = $1 AND b".$btyp.".endet IS NULL;"; // WHERE-Clause (mehrfach je Typ verwendet)
250switch ($btyp) {
251
252case $btyp_verkehr:     // 1 - V e r k e h r
253        $FR=" FROM ax_bauwerkimverkehrsbereich b1 "; // FROM-Clause (mehrfach je Typ verwendet)
254        $btyptitle='Bauwerk im Verkehrsbereich';
255        $sqlb="SELECT b1.bauwerksfunktion, k1.beschreibung, k1.dokumentation, b1.name, b1.statement, GeometryType(b1.wkb_geometry) as bgeotyp, round(st_area(b1.wkb_geometry)::numeric,2) AS flae"
256        .$FR."LEFT JOIN ax_bauwerksfunktion_bauwerkimverkehrsbereich k1 ON b1.bauwerksfunktion=k1.wert".$WH;
257        $sqlk="SELECT b1.zustand, k1.beschreibung, k1.dokumentation".$FR."LEFT JOIN ax_zustand_bauwerkimverkehrsbereich k1 ON b1.zustand=k1.wert".$WH;
258        $sqlz="SELECT b1.bezeichnung, b1.breitedesobjekts, b1.durchfahrtshoehe".$FR.$WH;
259        $sqlr="SELECT b1.hatdirektunten".$FR.$WH;
260break;
261
262case $btyp_gewaesser:   // 2 - G e w À s s e r
263        $FR=" FROM ax_bauwerkimgewaesserbereich b2 ";
264        $btyptitle='Bauwerk im GewÀsserbereich';
265        $sqlb="SELECT b2.bauwerksfunktion, ug.beschreibung, ug.dokumentation, b2.name, b2.statement, GeometryType(b2.wkb_geometry) as bgeotyp, round(st_area(b2.wkb_geometry)::numeric,2) AS flae"
266        .$FR."LEFT JOIN ax_bauwerksfunktion_bauwerkimgewaesserbereich ug ON b2.bauwerksfunktion=ug.wert".$WH;
267        $sqlk="SELECT b2.zustand, k2.beschreibung, k2.dokumentation".$FR."LEFT JOIN ax_zustand_bauwerkimgewaesserbereich k2 ON b2.zustand=k2.wert".$WH;
268        $sqlz="SELECT b2.bezeichnung".$FR.$WH;
269        $sqlr="SELECT b2.hatdirektunten".$FR.$WH;
270break;
271
272case $btyp_sonst:       // 3 - S o n s t i g e  Bauwerke
273        $FR=" FROM ax_sonstigesbauwerkodersonstigeeinrichtung b3 ";
274        $btyptitle='Sonstiges Bauwerk oder sonstige Einrichtung';
275        $sqlb="SELECT b3.bauwerksfunktion, k3.beschreibung, k3.dokumentation, b3.name, b3.statement, GeometryType(b3.wkb_geometry) as bgeotyp, round(st_area(b3.wkb_geometry)::numeric,2) AS flae"
276        .$FR."LEFT JOIN ax_bauwerksfunktion_sonstigesbauwerkodersonstigeeinrichtun k3 ON b3.bauwerksfunktion=k3.wert".$WH;
277        $sqlk="SELECT b3.funktion, k3.beschreibung, k3.dokumentation, b3.hydrologischesmerkmal, hm.beschreibung AS hmbeschr, hm.dokumentation AS hmdoku"
278        .$FR."LEFT JOIN ax_funktion_bauwerk k3 ON b3.funktion=k3.wert "
279        ." LEFT JOIN ax_hydrologischesmerkmal_sonstigesbauwerkodersonstigeeinri hm ON b3.hydrologischesmerkmal=hm.wert".$WH;
280        $sqlz="SELECT b3.bezeichnung, b3.objekthoehe".$FR.$WH;
281        $sqlr="SELECT b3.hatdirektunten, b3.gehoertzu".$FR.$WH;
282break;
283
284case $btyp_indu:        // 4 - Bauwerk oder Anlage fÃŒr  I n d u s t r i e  und Gewerbe
285        $FR=" FROM ax_bauwerkoderanlagefuerindustrieundgewerbe b4 ";
286        $btyptitle="Bauwerk oder Anlage fÃŒr Industrie und Gewerbe";
287        $sqlb="SELECT b4.bauwerksfunktion, k4.beschreibung, k4.dokumentation, b4.name, b4.statement, GeometryType(b4.wkb_geometry) as bgeotyp, round(st_area(b4.wkb_geometry)::numeric,2) AS flae"
288        .$FR."LEFT JOIN ax_bauwerksfunktion_bauwerkoderanlagefuerindustrieundgewer k4 ON b4.bauwerksfunktion=k4.wert".$WH;
289        $sqlk="SELECT b4.zustand, k4.beschreibung, k4.dokumentation"
290        .$FR."LEFT JOIN ax_zustand_bauwerkoderanlagefuerindustrieundgewerbe k4 ON b4.zustand=k4.wert".$WH;
291        $sqlz="SELECT b4.bezeichnung, b4.objekthoehe".$FR.$WH;
292        $sqlr="SELECT b4.hatdirektunten".$FR.$WH;
293break;
294
295case $btyp_sport:       // 5 - Bauwerk oder Anlage fÃŒr  S p o r t , Freizeit und Erholung
296        $FR=" FROM ax_bauwerkoderanlagefuersportfreizeitunderholung b5 ";
297        $btyptitle="Bauwerk oder Anlage fÃŒr Sport, Freizeit und Erholung";
298        $sqlb="SELECT b5.bauwerksfunktion, k5.beschreibung, k5.dokumentation, b5.name, b5.statement, GeometryType(b5.wkb_geometry) as bgeotyp, round(st_area(b5.wkb_geometry)::numeric,2) AS flae"
299        .$FR."LEFT JOIN ax_bauwerksfunktion_bauwerkoderanlagefuersportfreizeitunde k5 ON b5.bauwerksfunktion=k5.wert".$WH;
300        $sqlk="SELECT b5.sportart, k5.beschreibung, k5.dokumentation"
301        .$FR."LEFT JOIN ax_sportart_bauwerkoderanlagefuersportfreizeitunderholung k5 ON b5.sportart=k5.wert".$WH;
302        $sqlz="SELECT b5.breitedesobjekts".$FR.$WH;
303        $sqlr="SELECT b5.hatdirektunten".$FR.$WH;
304break;
305
306case $btyp_leitg:       // 6 - L e i t u n g
307        $FR=" FROM ax_leitung b6 ";
308        $btyptitle="Leitung";
309        $sqlb="SELECT b6.bauwerksfunktion, k6.beschreibung, k6.dokumentation, b6.name, b6.statement, GeometryType(b6.wkb_geometry) as bgeotyp, round(st_area(b6.wkb_geometry)::numeric,2) AS flae"
310        .$FR."LEFT JOIN ax_bauwerksfunktion_leitung k6 ON b6.bauwerksfunktion=k6.wert".$WH;     
311        $sqlk="";
312        $sqlz="SELECT b6.spannungsebene".$FR.$WH;
313        $sqlr="SELECT b6.hatdirektunten".$FR.$WH;
314break;
315
316case $btyp_trans:       // 7 - T r a n s p o r t a n l a g e
317        $FR=" FROM ax_transportanlage b7 ";
318        $btyptitle="Transportanlage";
319        $sqlb="SELECT b7.bauwerksfunktion, k7.beschreibung, k7.dokumentation, b7.statement, GeometryType(b7.wkb_geometry) as bgeotyp, round(st_area(b7.wkb_geometry)::numeric,2) AS flae"
320        .$FR."LEFT JOIN ax_bauwerksfunktion_transportanlage k7 ON b7.bauwerksfunktion=k7.wert".$WH;
321        $sqlk="SELECT b7.lagezurerdoberflaeche, k7.beschreibung, k7.dokumentation"
322        .$FR."LEFT JOIN ax_lagezurerdoberflaeche_transportanlage k7 ON b7.lagezurerdoberflaeche=k7.wert".$WH;
323        $sqlz="SELECT b7.produkt".$FR.$WH;
324        $sqlr="SELECT b7.hatdirektunten".$FR.$WH;
325break;
326
327case $btyp_turm:        // 8 - T u r m  (Sonderfall Array)
328        $FR=" FROM ax_turm b8 ";
329        $btyptitle="Turm";
330        $sqlb="SELECT k8.wert AS bauwerksfunktion, k8.beschreibung, k8.dokumentation, b8.name, b8.statement, GeometryType(b8.wkb_geometry) as bgeotyp, round(st_area(b8.wkb_geometry)::numeric,2) AS flae"
331        .$FR."LEFT JOIN ax_bauwerksfunktion_turm k8 ON k8.wert =ANY(b8.bauwerksfunktion)".$WH;
332        $sqlk="SELECT b8.zustand, k8.beschreibung, k8.dokumentation"
333        .$FR."LEFT JOIN ax_zustand_turm k8 ON b8.zustand=k8.wert".$WH;
334        $sqlz="SELECT b8.objekthoehe".$FR.$WH;
335        $sqlr="SELECT b8.hatdirektunten, b8.zeigtauf".$FR.$WH;
336break;
337
338case $btyp_vorrat:      // 9 -  V o r r a t s b e h À l t e r ,  S p e i c h e r b a u w e r k
339        $FR=" FROM ax_vorratsbehaelterspeicherbauwerk b9 ";
340        $btyptitle="VorratsbehÀlter, Speicherbauwerk";
341        $sqlb="SELECT b9.bauwerksfunktion, k9.beschreibung, k9.dokumentation, b9.name, b9.statement, GeometryType(b9.wkb_geometry) as bgeotyp, round(st_area(b9.wkb_geometry)::numeric,2) AS flae"
342        .$FR."LEFT JOIN ax_bauwerksfunktion_vorratsbehaelterspeicherbauwerk k9 ON b9.bauwerksfunktion=k9.wert".$WH;
343        $sqlk="SELECT b9.lagezurerdoberflaeche, k9.beschreibung, k9.dokumentation,
344         b9.speicherinhalt, sp9.beschreibung AS spbes, sp9.dokumentation AS spdok"
345        .$FR."LEFT JOIN ax_lagezurerdoberflaeche_vorratsbehaelterspeicherbauwerk k9 ON b9.lagezurerdoberflaeche=k9.wert
346 LEFT JOIN ax_speicherinhalt_vorratsbehaelterspeicherbauwerk sp9 ON b9.speicherinhalt=sp9.wert".$WH;
347        $sqlz="SELECT b9.objekthoehe".$FR.$WH;
348        $sqlr="SELECT b9.hatdirektunten".$FR.$WH;
349break;
350
351case $btyp_hist: // 10 - H i s t o r i s c h e s  Bauwerk oder historische Einrichtung
352        $FR=" FROM ax_historischesbauwerkoderhistorischeeinrichtung b10 ";
353        $btyptitle="Historisches Bauwerk oder historische Einrichtung";
354        $sqlb="SELECT b10.name, b10.statement, GeometryType(b10.wkb_geometry) as bgeotyp, round(st_area(b10.wkb_geometry)::numeric,2) AS flae".$FR.$WH;
355        $sqlk="SELECT b10.archaeologischertyp, k10.beschreibung, k10.dokumentation"
356        .$FR."LEFT JOIN ax_archaeologischertyp_historischesbauwerkoderhistorischee k10 ON b10.archaeologischertyp=k10.wert".$WH;
357        $sqlz="";
358        $sqlr="SELECT b10.hatdirektunten".$FR.$WH;
359break;
360
361case $btyp_heil: // 11 - H e i l q u e l l e ,  G a s q u e l l e
362        $FR=" FROM ax_heilquellegasquelle b11 ";
363        $btyptitle="Heilquelle, Gasquelle";
364        $sqlb="SELECT b11.name, b11.statement, GeometryType(b11.wkb_geometry) as bgeotyp, round(st_area(b11.wkb_geometry)::numeric,2) AS flae".$FR.$WH;
365        $sqlk="SELECT b11.art, k11.beschreibung, k11.dokumentation, "
366        ."b11.hydrologischesmerkmal, hm.beschreibung AS hmbes, hm.dokumentation AS hmdok".$FR
367        ."LEFT JOIN ax_art_heilquellegasquelle k11 ON b11.art=k11.wert "
368        ."LEFT JOIN ax_hydrologischesmerkmal_heilquellegasquelle hm ON b11.hydrologischesmerkmal=hm.wert".$WH;
369        $sqlz="";
370        $sqlr="SELECT b11.hatdirektunten ".$FR.$WH;
371break;
372
373case $btyp_oeff: // 12 - Einrichtung in  ö f f e n t l i c h e n  Bereichen
374        $FR=" FROM ax_einrichtunginoeffentlichenbereichen b12 ";
375        $btyptitle="Einrichtung in &ouml;ffentlichen Bereichen";
376        $sqlb="SELECT b12.statement, GeometryType(b12.wkb_geometry) as bgeotyp, round(st_area(b12.wkb_geometry)::numeric,2) AS flae".$FR.$WH;
377        $sqlk="SELECT b12.art, k12.beschreibung, k12.dokumentation".$FR
378        ."LEFT JOIN ax_art_einrichtunginoeffentlichenbereichen k12 ON b12.art=k12.wert".$WH;
379        $sqlz="SELECT b12.kilometerangabe".$FR.$WH;
380        $sqlr="SELECT b12.hatdirektunten ".$FR.$WH;
381break;
382/*  +++ B A U S T E L L E +++
383case $btyp_bpkt: // 13 - Besonderer Bauwerkspunkt (ohne Geom.)
384        $FR=" FROM ax_besondererbauwerkspunkt b13 ";
385        $btyptitle="Besonderer Bauwerkspunkt";
386//  punktkennung, sonstigeeigenschaft, zustaendigestelle_land, zustaendigestelle_stelle
387
388break;
389
390CREATE TABLE IF NOT EXISTS public.ax_besondererbauwerkspunkt
391(   ...
392        punktkennung character varying, -- immer gefÃŒllt,
393           z.B. '324825754002450'
394                 rrhhrrhhAnnnnnn       
395    sonstigeeigenschaft character varying[],
396    zustaendigestelle_land character varying,
397    zustaendigestelle_stelle character varying,
398
399
400SELECT b.gml_id, p.gml_id
401FROM ax_besondererbauwerkspunkt b
402JOIN ax_punktortag p ON b.gml_id = any(p.istteilvon)
403LIMIT 100;
404
405Das ZUSO besteht aus einem 'PunktortAG' und/oder aus einem oder mehreren 'PunktortAU'.
406
407Der 'Besondere Bauwerkspunkt' und der ihm zugeordnete 'Punktort' mit der Attributart 'Liegenschaftskarte' und der Werteart TRUE erhÀlt
408den Raumbezug durch einen Punkt der FlÀche oder der Linie, die zur Vermittlung des Raumbezuges des entsprechenden Bauwerks
409oder der Einrichtung beitrÀgt.
410
411
412 'PunktortAG' ist ein Punktort mit redundanzfreier Geometrie (Besonderer GebÀudepunkt, Besonderer Bauwerkspunkt) innerhalb eines Geometriethemas.
413    istteilvon[]
414
415
416 'PunktortAU' ist ein Punktort mit unabhÀngiger Geometrie ohne Zugehörigkeit zu einem Geometriethema. Er kann zu ZUSOs der folgenden Objektarten gehören: Grenzpunkt, Besonderer GebÀudepunkt, Besonderer Bauwerkspunkt, Aufnahmepunkt, Sicherungspunkt, Sonstiger Vermessungspunkt, Besonderer topographischer Punkt, Lagefestpunkt, Höhenfestpunkt, Schwerefestpunkt, Referenzstationspunkt.
417
418 'PunktortTA' ist ein Punktort, der in der FlurstÃŒcksgrenze liegt und einen Grenzpunkt verortet.
419 
420       
421SchlÃŒssel:
422        ax_art_punktkennung
423
424pg_dump  -d alkis0150 -s -x -O -F p -f /home/b600352/ALKIS-Schema.sql
425
426 */
427
428default:
429        die('<p class="stop1">Falscher Bauwerkstyp.</p></body>');
430break;
431}
432
433// 1. sqlb: Standard-Spalten, die bei (fast) jedem Typ vorhanden sind
434$v=array($gmlid);
435$resb=pg_prepare($con, "", $sqlb);
436$resb=pg_execute($con, "", $v);
437if (!$resb) {
438        echo "\n<p class='err'>Fehler bei Bauwerksdaten Standardfelder.</p>";
439        if ($dbg > 0) {
440                echo "\n<p class='dbg'>Fehler:".pg_result_error($resb)."</p>";
441                if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlb)."'</p>";}
442        }
443} else {
444        if ($dbg > 0) {
445                $zeianz=pg_num_rows($resb);
446                if ($zeianz > 1){
447                        echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Standardfelder)</p>";
448                        if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlb), ENT_QUOTES, "UTF-8")."</p>";}
449                }
450        }
451        if (!$rowb = pg_fetch_assoc($resb)) {
452                echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
453                die('<p class="stop1">Abbruch</p></body>'); // Das wÃŒrde sich sonst 2x wiederholen
454        } else { // Treffer
455                // Seitenkopf
456                echo "<p class='balken bauwerk".$btyp."'>ALKIS Bauwerk ".$btyp." - ".$gmlid."&nbsp;</p>" // Balken, Farbe wie WMS
457                ."\n<h2>".$btyptitle."</h2>"
458                ."\n<p class='nwlink noprint'>" // Umschalter: auch leere Felder
459                ."Umschalten: <a class='nwlink' href='".selbstverlinkung()."?gkz=".$gkz."&amp;btyp=".$btyp."&amp;gmlid=".$gmlid.LnkStf();
460                if ($allefelder) {
461                        echo "&amp;allfld=n'>nur Felder mit Inhalt";
462                } else {
463                        echo "&amp;allfld=j'>auch leere Felder";
464                }
465                echo "</a></p>";
466
467                echo "\n<table class='geb'>"
468                ."\n<tr>"
469                        ."\n\t<td class='head' title=''>Attribut</td>"
470                        ."\n\t<td class='head mittelspalte' title=''>Wert</td>"
471                        ."\n\t<td class='head' title=''>"
472                                ."\n\t\t<p class='erklk'>Erkl&auml;rung zum Attribut</p>"
473                                ."\n\t\t<p class='erkli'>Erkl&auml;rung zum Inhalt</p>"
474                        ."\n\t</td>"
475                ."\n</tr>";
476
477                if (isset($rowb["bauwerksfunktion"])) { // nicht immer vorhanden
478                        tab_zeile('Bauwerksfunktion', $rowb["bauwerksfunktion"], htmlentities($rowb["beschreibung"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowb["dokumentation"], ENT_QUOTES, "UTF-8"));
479                }
480
481                if (isset($rowb["name"])) {
482                        tab_zeile('Name', '', htmlentities($rowb["name"], ENT_QUOTES, "UTF-8"), '', '');
483                }
484
485                if (isset($rowb["statement"])) {
486                        tab_zeile('Statement', '', htmlentities($rowb["statement"], ENT_QUOTES, "UTF-8"), '', '');
487                }
488
489                // G e o m e t r i e  und FlÀche
490                if (isset($rowb["bgeotyp"])) {
491                        $geotyp=$rowb["bgeotyp"];
492                        switch ($geotyp) {
493                                case "POINT":
494                                        $geodeutsch=$geotyp." bedeutet 'Punkt', einzelne Koordinate.";
495                                break;
496                                case "LINESTRING":
497                                        $geodeutsch=$geotyp." bedeutet 'Linie'.";
498                                break;
499                                case "POLYGON":
500                                        $geodeutsch=$geotyp." bedeutet eine einzelne 'Fl&auml;che'.";
501                                break;
502                                case "MULTIPOLYGON":
503                                        $geodeutsch=$geotyp." bedeutet eine 'Fl&auml;che', die aus mehreren Teilen bestehen kann oder die Aussparungen haben kann.";   
504                                break;
505                                default: $geodeutsch="";
506                        }
507                        tab_zeile('Geometrietyp', '', $geotyp, '', $geodeutsch);
508
509                        if ($geotyp == "POLYGON" or $geotyp == "MULTIPOLYGON") {
510                                $flaeche=$rowb["flae"]." m&#178;";
511                                tab_zeile('Fl&auml;che', '', $flaeche, '', "Die 'Fl&auml;che' des Bauwerks wird aus der Geometrie berechnet, aber nur bei POLYGON.");
512                        }
513                }
514        }
515        pg_free_result($resb);
516}
517
518// 2. sqlk:  ZusÀtzliche Key-Value-Beziehungen
519// Andere Art der Darstellung als die schlichten Zusatzfelder, Key optional anzeigen, ErklÀrung zum Wert aus SchlÌsseltabelle
520if ($sqlk != '') {
521        $v=array($gmlid);
522        $resk=pg_prepare($con, "", $sqlk);
523        $resk=pg_execute($con, "", $v);
524        if (!$resk) {
525                echo "\n<p class='err'>Fehler bei Schl&uuml;sseltabelle ".$btyp."</p>";
526                if ($dbg > 0) {
527                        echo "<p class='dbg'>Fehler:".pg_result_error($resk)."</p>";
528                        if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlk)."'</p>";}
529                }
530        } else {
531                if ($dbg > 0) {
532                        $zeianz=pg_num_rows($resk);
533                        if ($zeianz > 1){
534                                echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Key-Value)</p>";
535                                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlk), ENT_QUOTES, "UTF-8")."</p>";}
536                        }
537                }
538                if (!$rowk = pg_fetch_array($resk)) {
539                        echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
540                } else {
541                // Treffer
542                        if (is_null($rowk["beschreibung"])) {
543                                $bes="";
544                        } else {
545                                $bes=htmlentities($rowk["beschreibung"], ENT_QUOTES, "UTF-8");
546                        }
547                        if (is_null($rowk["dokumentation"])) {
548                                $dok="";
549                        } else {
550                                $dok=htmlentities($rowk["dokumentation"], ENT_QUOTES, "UTF-8");
551                        }
552                        switch ($btyp) {  // individuell je Typ
553                        case $btyp_verkehr: // 1
554                                tab_zeile('Zustand', $rowk["zustand"], $bes, '', $dok);
555                        break;
556                        case $btyp_gewaesser: // 2
557                                tab_zeile('Zustand', $rowk["zustand"], $bes, '', $dok);
558                        break;
559                        case $btyp_sonst: // 3
560                                tab_zeile('Funktion', $rowk["funktion"], $bes, '', $dok);
561                                if (is_null($rowk["hmbeschr"])) {
562                                        $hmbeschr="";
563                                } else {
564                                        $hmbeschr=htmlentities($rowk["hmbeschr"], ENT_QUOTES, "UTF-8");
565                                }
566                                if (is_null($rowk["hmdoku"])) {
567                                        $hmdoku="";
568                                } else {
569                                        $hmdoku=htmlentities($rowk["hmdoku"], ENT_QUOTES, "UTF-8");
570                                }
571                                tab_zeile('Hydrologisches Merkmal', $rowk["hydrologischesmerkmal"], $hmbeschr, '', $hmdoku);
572                        break;
573                        case $btyp_indu: // 4
574                                tab_zeile('Zustand', $rowk["zustand"], $bes, '', $dok);
575                        break;
576                        case $btyp_sport: // 5
577                                tab_zeile('Sportart', $rowk["sportart"], $bes, '', $dok);
578                        break;
579                        case $btyp_trans: // 7
580                                tab_zeile('Lage zur Erdoberfl&auml;che', $rowk["lagezurerdoberflaeche"], $bes, '', $dok);
581                        break;
582                        case $btyp_turm: // 8
583                                tab_zeile('Zustand', $rowk["zustand"], $bes, '', $dok);
584                        break;
585                        case $btyp_vorrat: // 9
586                                tab_zeile('Lage zur Erdoberfl&auml;che', $rowk["lagezurerdoberflaeche"], $bes, '', $dok);
587                                tab_zeile('Speicherinhalt', $rowk["speicherinhalt"], htmlentities($rowk["spbes"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["spdok"], ENT_QUOTES, "UTF-8"));
588                        break;
589                        case $btyp_hist: // 10
590                                tab_zeile('Arch&auml;ologischer Typ', $rowk["archaeologischertyp"], $bes, '', $dok);
591                        break;
592                        case $btyp_heil: // 11
593                                tab_zeile('Art', $rowk["art"], $bes, '', $dok);
594                                tab_zeile('Hydrologisches Merkmal', $rowk["hydrologischesmerkmal"], htmlentities($rowk["hmbes"], ENT_QUOTES, "UTF-8"), '', htmlentities($rowk["hmdok"], ENT_QUOTES, "UTF-8"));
595                        break;
596                        case $btyp_oeff: // 12
597                                tab_zeile('Art', $rowk["art"], $bes, '', $dok);
598                        break;
599//                      case $btyp_bpkt: // 13
600//                      break;
601                        }
602                }
603                pg_free_result($resk);
604        }
605}
606
607// 3. sqlz: Individuelle Z u s a t z - Spalten je Bauwerks-Art
608// einfache Werte-Anzeige, ohne SchlÃŒsseltabelle
609if ($sqlz != '') {
610        $v=array($gmlid);
611        $resz=pg_prepare($con, "", $sqlz);
612        $resz=pg_execute($con, "", $v);
613        if (!$resz) {
614                echo "\n<p class='err'>Fehler bei Bauwerk Relation.</p>";
615                if ($dbg > 0) {
616                        echo "<p class='dbg'>Fehler:".pg_result_error($resz)."</p>";
617                        if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlz)."'</p>";}
618                }
619        } else {
620                if ($dbg > 0) {
621                        $zeianz=pg_num_rows($resz);
622                        if ($zeianz > 1){
623                                echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Zusatz-Spalten)</p>";
624                                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlz), ENT_QUOTES, "UTF-8")."</p>";}
625                        }
626                }
627                if (!$rowz = pg_fetch_array($resz)) {
628                        echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
629                } else {
630                        // Die Spalten im Row abarbeiten
631                        $anzcol=pg_num_fields($resz);
632                        for ($i = 0; $i < $anzcol; $i++) {
633                                $k=pg_field_name($resz, $i);
634                                $v=$rowz[$i];
635                                if ($v != "" OR $allefelder) {
636                                        zusatz_spalte($k, $v);
637                                }
638                        }
639                }       
640                pg_free_result($resz);
641        }
642}
643
644// 4. sqlr: R e l a t i o n e n  zu anderen Objektarten
645if ($sqlr != '') {
646        $v=array($gmlid);
647        $resr=pg_prepare($con, "", $sqlr);
648        $resr=pg_execute($con, "", $v);
649        if (!$resr) {
650                echo "\n<p class='err'>Fehler bei Bauwerksdaten Zusatzfelder.</p>";
651                if ($dbg > 0) {
652                        echo "<p class='dbg'>Fehler:".pg_result_error($resr)."</p>";
653                        if ($dbg > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1","'".$gmlid."'",$sqlr)."'</p>";}
654                }
655        } else {
656                if ($dbg > 0) {
657                        $zeianz=pg_num_rows($resr);
658                        if ($zeianz > 1){
659                                echo "\n<p class='err'>Die Abfrage liefert mehr als ein (".$zeianz.") Bauwerk! (Relationen)</p>";
660                                if ($dbg > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1","'".$gmlid."'",$sqlr), ENT_QUOTES, "UTF-8")."</p>";}
661                        }
662                }
663                if (!$rowr = pg_fetch_array($resr)) {
664                        echo "\n<p class='err'>Fehler! Kein Treffer f&uuml;r gml_id=".$gmlid."</p>";
665                } else { // Die Spalten im Row abarbeiten
666                        $anzcol=pg_num_fields($resr);
667                        for ($i = 0; $i < $anzcol; $i++) {
668                                $k=pg_field_name($resr, $i);
669                                $v=$rowr[$i]; // Array mit gml_id anderer Objekte
670                                if ($v != "" OR $allefelder) {
671                                        objektverweis($k, $v);
672                                }
673                        }
674                }       
675                pg_free_result($resr);
676        }
677}
678
679echo "\n</table>\n";
680echo "<div class='buttonbereich noprint'>\n<hr>\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;";
681if ($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;";}
682echo "\n</div>";
683
684footer($gmlid, selbstverlinkung()."?", "&amp;btyp=".$btyp);
685?>
686</body>
687</html>
Note: See TracBrowser for help on using the repository browser.