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

Revision 430, 29.4 KB checked in by frank.jaeger, 22 months ago (diff)

ALKIS-Auskunft angepasst an PHP 8

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