Index: trunk/info/info/alkisn/alkishaus.php
===================================================================
--- trunk/info/info/alkisn/alkishaus.php	(revision 412)
+++ trunk/info/info/alkisn/alkishaus.php	(revision 422)
@@ -5,22 +5,13 @@
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import
-	2016-11-29 HTML5, Gemeinsam genutzte Datenbanken ermÃ¶glichen
-	2016-12-05 Array-Behandlung ax_gebaeude.name
-	2017-06-08 Validierung Eingabeparameter, Feinkorrekturen
-	2017-06-09 Tool-Tip GebÃ€udefunktion, ErklÃ€rung 2 getrennte p.Styles
-	2017-10-09 Sauber filtern auf endet IS NULL
-	2018-04-23 &nodebug
-	2018-11-09 Umstellung Full-Schema
-
-	ToDo:
-	- Die im Modul 'Lage' als Tooltip vorhandene lange Beschreibung der GebÃ€ude-Funktion (Inhalt) hier auch anzeigen.
-	- sinnvolle Sortierung und Gruppierung der Felder
-	- geometrische Suche nach FS, auf denen das Haus steht
+	....
+	2020-12-01 Darstellung der Datenerhebung, Klammern um SchlÃŒsselwerte
+	2020-12-02 Verschnitt GebÃ€ude / FlurstÃŒcke
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF']
+	2020-12-15 Input-Validation und Strict Comparisation (===)
+ToDo:
 	- Template im WMS auf Ebene GebÃ€ude hierhin verknÃŒpfen.
-	- Relationen abbilden:
-		ax_gebaeude >gehoertZu> ax_gebaeude  (ringfÃ¶rmige Verbindung GebÃ€udekomplex)
-		ax_gebaeude (umschliesst) ax_bauteil
-		ax_gebaeude >gehoert> ax_person (Ausnahme)
 */
+ini_set("session.cookie_httponly", 1);
 session_start();
 $allfld = "n"; $showkey="n"; $nodebug=""; // Var. aus Parameter initalisieren
@@ -28,15 +19,23 @@
 
 // strikte Validierung aller Parameter
-if (!isset($gmlid) or !preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
-if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+if (isset($gmlid)) {
+	if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");}
+} else {
+	die("Fehlender Parameter");
+}
+if (isset($gkz)) {
+	if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");}
+} else {
+	die("Fehlender Parameter");
+}
 if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");}
-if ($showkey == "j") {$showkey=true;} else {$showkey=false;}
+if ($showkey === "j") {$showkey=true;} else {$showkey=false;}
 if (!preg_match('#^[j|n]{0,1}$#', $allfld)) {die ("Eingabefehler allfld");}
-if ($allfld == "j") {$allefelder=true;} else {$allefelder=false;}
+if ($allfld === "j") {$allefelder=true;} else {$allefelder=false;}
 if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");}
 
-require_once("alkis_conf_location.php");
-if ($auth == "mapbender") {require_once($mapbender);}
-include("alkisfkt.php");
+include "alkis_conf_location.php";
+include "alkisfkt.php";
+
 echo <<<END
 <!doctype html>
@@ -52,7 +51,10 @@
 <body>
 END;
+
+$erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); }
+
 // Mit URL-Parameter "&nodebug=j" kann man die Entwicklungsumgebung (in Conf definiert) ausschalten.
 // Manuell an die URL anfÃŒgen, wirkt nur temporÃ€r und wird nicht in Links weiter gereicht.
-if ($nodebug == "j") {$debug=0;} 
+if ($nodebug === "j") {$debug=0;} 
 
 $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkishaus.php'");
@@ -85,13 +87,9 @@
 
 // Balken
-echo "\n<p class='geb'>ALKIS Haus ".$gmlid."&nbsp;</p>"; // ++ Kennzeichen?
-echo "\n<h2><img src='ico/Haus.png' width='16' height='16' alt=''> Haus (Geb&auml;ude)</h2>";
-
-// Kennzeichen in Rahmen 
-// - Welches Kennzeichen zum Haus ?
-echo "\n<hr>";
-// Umschalter: auch leere Felder ausgeben?
-echo "<p class='nwlink noprint'>";
-echo "Umschalten: <a class='nwlink' href='".$_SERVER['PHP_SELF']."?gkz=".$gkz."&amp;gmlid=".$gmlid;
+echo "\n<p class='balken geb'>ALKIS Haus ".$gmlid."&nbsp;</p>";
+echo "\n<h2><img src='ico/Haus.png' width='16' height='16' alt=''> Haus (Geb&auml;ude)</h2>\n<hr>";
+
+echo "<p class='nwlink noprint'>"; // Umschalter: auch leere Felder
+echo "Umschalten: <a class='nwlink' href='".selbstverlinkung()."?gkz=".$gkz."&amp;gmlid=".$gmlid;
 	if ($showkey) {echo "&amp;showkey=j";} else {echo "&amp;showkey=n";}
 	if ($allefelder) {
@@ -102,346 +100,439 @@
 echo "</a></p>";
 
-$gebnr = 0;
-
-while($rowg = pg_fetch_assoc($resg)) { // Schleife, kann aber nur EIN Haus sein.
-	$gebnr++;
-	echo "\n<table class='geb'>"
-	."\n<tr>\n"
-		."\n\t<td class='head' title=''>Attribut</td>"
-		."\n\t<td class='head mittelspalte' title=''>Wert</td>"
-		."\n\t<td class='head' title=''>"
-			."\n\t\t<p class='erklk'>Erkl&auml;rung Kategorie</p>"
-			."\n\t\t<p class='erkli'>Erkl&auml;rung Inhalt</p>"
-		."\n\t</td>"
-	."\n</tr>";
-
-	$aog=$rowg["aog"];
-	$aug=$rowg["aug"];
-	$hoh=$rowg["hochhaus"];
-	$nam=trim(trim($rowg["name"], "{}"), '"'); // Gebaeude-Name ist ein Array in der DB: '{"A","B"}'
-	// Mehrfachbelegung nur theoretisch. Entklammern reicht. Mal mit und mal ohne "" drum !?
-	/* SELECT name FROM ax_gebaeude WHERE NOT name IS NULL AND array_length(name, 1) > 1; */
-	$kfunk=$rowg["gebaeudefunktion"];
-	$bfunk=$rowg["bfunk"];
-	$dfunk=$rowg["dfunk"];
-
-	$baw=$rowg["bauweise"];
-	$bbauw=$rowg["bbauw"];
-	$dbauw=$rowg["dbauw"];
-
-	$ofl=$rowg["lagezurerdoberflaeche"];
-	$oflv=$rowg["oflv"];
-	$ofld=$rowg["ofld"];
-
-	$dga=$rowg["dachgeschossausbau"]; // Key
-	$dgav=$rowg["dgaus"]; // Value
-
-	$zus=$rowg["zustand"]; // Key
-	$zusv=$rowg["zustandv"]; // Value
-	$zusd=$rowg["zustandd"]; // Description
-
-	$wgf=$rowg["wgf"]; // Array-> kommagetrennte Liste
-
-	$daf=$rowg["dachform"]; // Key
-	$dach=$rowg["bdach"]; // Value
-
-	$hho=$rowg["objekthoehe"];
-	$gfl=$rowg["geschossflaeche"];
-	$grf=$rowg["grundflaeche"];
-	$ura=$rowg["umbauterraum"];
-	$bja=$rowg["baujahr"];
-	$daa=$rowg["dachart"];
-//	$qag=$rowg["qualitaetsangaben"];
-
-	if (($nam != "") OR $allefelder) {
+if (!($rowg = pg_fetch_assoc($resg))) {
+	echo "\n<p class='err'><br>Kein Geb&auml;ude gefunden</p>";
+	die ("Abbruch");
+}
+
+echo "\n<table class='geb'>"
+."\n<tr>\n"
+	."\n\t<td class='head' title=''>Attribut</td>"
+	."\n\t<td class='head mittelspalte' title=''>Wert</td>"
+	."\n\t<td class='head' title=''>"
+		."\n\t\t<p class='erklk'>Erkl&auml;rung Kategorie</p>"
+		."\n\t\t<p class='erkli'>Erkl&auml;rung Inhalt</p>"
+	."\n\t</td>"
+."\n</tr>";
+
+$aog=$rowg["aog"];
+$aug=$rowg["aug"];
+$hoh=$rowg["hochhaus"];
+$nam=trim(trim($rowg["name"], "{}"), '"'); // Gebaeude-Name ist ein Array.
+// Mehrfachbelegung theoretisch. Entklammern reicht. Mal mit und mal ohne "" drum.
+$kfunk=$rowg["gebaeudefunktion"];
+$bfunk=$rowg["bfunk"];
+$dfunk=$rowg["dfunk"];
+
+$baw=$rowg["bauweise"];
+$bbauw=$rowg["bbauw"];
+$dbauw=$rowg["dbauw"];
+
+$ofl=$rowg["lagezurerdoberflaeche"];
+$oflv=$rowg["oflv"];
+$ofld=$rowg["ofld"];
+
+$dga=$rowg["dachgeschossausbau"]; // Key
+$dgav=$rowg["dgaus"];		// Value
+
+$zus=$rowg["zustand"];		// Key
+$zusv=$rowg["zustandv"];	// Value
+$zusd=$rowg["zustandd"];	// Description
+
+$wgf=$rowg["wgf"];			// Array-> kommagetr. Liste
+
+$daf=$rowg["dachform"];		// Key
+$dach=$rowg["bdach"];		// Value
+
+$hho=$rowg["objekthoehe"];
+$gfl=$rowg["geschossflaeche"];
+$grf=$rowg["grundflaeche"];
+$ura=$rowg["umbauterraum"];
+$bja=$rowg["baujahr"];
+$daa=$rowg["dachart"];
+
+if (($nam != "") OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Name</td>"
+		."\n\t<td>".$nam."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Name' ist der Eigenname oder die Bezeichnung des Geb&auml;udes."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// 0 bis N   L a g e bezeichnungen mit Haus- oder Pseudo-Nummer
+
+// HAUPTgebÃ€ude
+$sqll ="SELECT 'm' AS ltyp, lh.gml_id AS gmllag, sh.lage, sh.bezeichnung, lh.hausnummer, '' AS laufendenummer FROM ax_gebaeude gh
+JOIN ax_lagebezeichnungmithausnummer lh ON lh.gml_id=ANY(gh.zeigtauf)
+JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage
+WHERE gh.gml_id= $1 AND gh.endet IS NULL AND lh.endet IS NULL AND sh.endet IS NULL";
+// oder NEBENgebÃ€ude
+$sqll.=" UNION 
+SELECT 'p' AS ltyp, ln.gml_id AS gmllag, sn.lage, sn.bezeichnung, ln.pseudonummer AS hausnummer, ln.laufendenummer
+FROM ax_gebaeude gn
+JOIN ax_lagebezeichnungmitpseudonummer ln ON ln.gml_id=gn.hat
+JOIN ax_lagebezeichnungkatalogeintrag sn ON ln.kreis=sn.kreis AND ln.gemeinde=sn.gemeinde AND ln.lage=sn.lage
+WHERE gn.gml_id= $1 AND gn.endet IS NULL AND ln.endet IS NULL AND sn.endet IS NULL ";
+
+$sqll.="ORDER BY bezeichnung, hausnummer ;";
+
+$v = array($gmlid);
+$resl = pg_prepare("", $sqll);
+$resl = pg_execute("", $v);
+if (!$resl) {
+	echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+$zhsnr=0;
+while($rowl = pg_fetch_assoc($resl)) { // LOOP: Lagezeilen
+	$zhsnr++;
+	$ltyp=$rowl["ltyp"]; // Lagezeilen-Typ
+	$skey=$rowl["lage"]; // Str.-Schluessel
+	$snam=htmlentities($rowl["bezeichnung"], ENT_QUOTES, "UTF-8"); // -Name
+	$hsnr=$rowl["hausnummer"];
+	$hlfd=$rowl["laufendenummer"];
+	$gmllag=$rowl["gmllag"];
+
+	if ($zhsnr === 1) {
 		echo "\n<tr>"
-			."\n\t<td class='li'>Name</td>"
-			."\n\t<td>".$nam."</td>"
+			."\n\t<td class='li' title='Lage mit Hausnummer oder Pseudonummer'>Adresse</td>"
+			."\n\t<td class='fett'>";
+	}
+	echo "\n\t\t<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''>&nbsp;";
+	if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}			
+	echo "\n\t\t<a title='Hausnummer' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
+		if ($showkey) {echo "&amp;showkey=j";}
+		echo "'>".$snam."&nbsp;".$hsnr;
+		if ($ltyp === "p") {echo ", lfd.Nr ".$hlfd;}
+	echo "</a><br>";
+} // Ende Loop Lagezeilen m.H.
+if ($zhsnr > 0) {echo "\n\t</td>\n\t<td>&nbsp;</td>\n</tr>";}
+pg_free_result($resl);
+
+// GebÃ€udefunktion
+echo "\n<tr>"
+	."\n\t<td class='li'>Geb&auml;udefunktion</td>"
+	."\n\t<td class='fett'>";
+	if ($showkey and $kfunk != '') {echo "<span class='key'>(".$kfunk.")</span>&nbsp;";}
+	echo $bfunk."</td>"
+	."\n\t<td>"
+		."\n\t\t<p class='erklk'>'Geb&auml;udefunktion' ist die zum Zeitpunkt der Erhebung vorherrschend funktionale Bedeutung des Geb&auml;udes'</p>"
+		."\n\t\t<p class='erkli'>".$dfunk."</p>"
+	."</td>"
+."\n</tr>";
+
+// Bauweise
+if ($baw != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Bauweise</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $baw != '') {echo "<span class='key'>(".$baw.")</span>&nbsp;";}
+		echo $bbauw."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Bauweise' ist die Beschreibung der Art der Bauweise.</p>"
+			."\n\t\t<p class='erkli'>".$dbauw."</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Geschosse
+if ($aog != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Geschosse</td>"
+		."\n\t<td class='fett'>".$aog."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>Anzahl oberirdischer Geschosse.</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// U-Geschosse
+if ($aug != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>U-Geschosse</td>"
+		. "\n\t<td class='fett'>".$aug."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>Anzahl unterirdischer Geschosse.</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Hochhaus
+if ($hoh != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Hochhaus</td>"
+		."\n\t<td class='fett'>".$hoh."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'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."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Lage zur ErdoberflÃ€che
+if ($ofl != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Lage zur Erdoberfl&auml;che</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $ofl != '') {echo "<span class='key'>(".$ofl.")</span>&nbsp;";}
+		echo $oflv."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'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>"
+			."\n\t\t<p class='erkli'>".$ofld."</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Dachgeschossausbau, Spalte dokumentation ist immer leer
+if ($dga != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Dachgeschossausbau</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $dga != '') {echo "<span class='key'>(".$dga.")</span>&nbsp;";}
+		echo $dgav."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Dachgeschossausbau' ist ein Hinweis auf den Ausbau bzw. die Ausbauf&auml;higkeit des Dachgeschosses."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Zustand
+if ($zus != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Zustand</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $zus != '') {echo "<span class='key'>(".$zus.")</span>&nbsp;";}
+		echo $zusv."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'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.</p>"
+			."\n\t\t<p class='erkli'>".$zusd."</p>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Weitere GebÃ€udefunktionen
+// Suche Testfall: SELECT gml_id, gebaeudefunktion, weiteregebaeudefunktion FROM ax_gebaeude WHERE (NOT weiteregebaeudefunktion IS NULL) AND cardinality(weiteregebaeudefunktion) > 1 liMIT 10;
+if ($wgf != "" OR $allefelder) { // ... ist ein Array
+	echo "\n<tr>"
+		."\n\t<td class='li'>Weitere Geb&auml;udefunktionen</td>"
+		."\n\t<td>";
+		if ($wgf != "") { // Kommagetrennte Liste aus Array
+			$sqlw="SELECT wert, beschreibung, dokumentation FROM ax_gebaeudefunktion WHERE wert IN ( $1 ) ORDER BY wert;";
+			$v = array($wgf);
+			$resw = pg_prepare("", $sqlw);
+			$resw = pg_execute("", $v);
+			if (!$resw) {
+				echo "\n<p class='err'>Fehler bei Geb&auml;ude - weitere Funktion.</p>";
+				if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlw."<br>$1 = Werteliste = '".$wgf."'</p>";}
+			}
+			$zw=0;
+			while($roww = pg_fetch_assoc($resw)) { // LOOP Funktion
+				if ($zw > 0) {echo "<br>";}
+				if ($showkey and $roww["wert"] != '') {echo "<span class='key'>(".$roww["wert"].")</span>&nbsp;";}
+				echo "<span title='".$roww["dokumentation"]."'>".$roww["beschreibung"]."</span>";
+				$zw++;
+		   }
+		   pg_free_result($resw);
+		}
+		echo "</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Weitere Geb&auml;udefunktion' ist die Funktion, die ein Geb&auml;ude neben der dominierenden Geb&auml;udefunktion hat."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Dachform, Spalte dokumentation ist immer leer
+if ($daf != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Dachform</td>"
+		."\n\t<td class='fett'>";
+		if ($showkey and $daf != '') {echo "<span class='key'>(".$daf.")</span>&nbsp;";}
+		echo $dach."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Dachform' beschreibt die charakteristische Form des Daches."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// ObjekthÃ¶he
+if ($hho != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Objekth&ouml;he</td>"
+		."\n\t<td class='fett'>".$hho."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'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."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// GeschossflÃ€che
+if ($gfl != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Geschossfl&auml;che</td>"
+		."\n\t<td class='fett'>";
+		if ($gfl != "") {echo $gfl." m&#178;";}
+		echo "</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Geschossfl&auml;che' ist die Geb&auml;udegeschossfl&auml;che in [qm]."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// GrundflÃ€che
+if ($grf != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Grundfl&auml;che</td>"
+		."\n\t<td class='fett'>";
+		if ($grf != "") {echo $grf." m&#178;";}
+		echo "\n\t<td>"
+			."\n\t\t<p class='erklk'>'Grundfl&auml;che' ist die Geb&auml;udegrundfl&auml;che in [qm]."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Umbauter Raum
+if ($ura != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Umbauter Raum</td>"
+		."\n\t<td class='fett'>".$ura."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Umbauter Raum' ist der umbaute Raum [Kubikmeter] des Geb&auml;udes."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Baujahr
+if ($bja != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Baujahr</td>"
+		."\n\t<td class='fett'>".$bja."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Baujahr' ist das Jahr der Fertigstellung oder der baulichen Ver&auml;nderung des Geb&auml;udes."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// Dachart
+if ($daa != "" OR $allefelder) {
+	echo "\n<tr>"
+		."\n\t<td class='li'>Dachart</td>"
+		."\n\t<td class='fett'>".$daa."</td>"
+		."\n\t<td>"
+			."\n\t\t<p class='erklk'>'Dachart' gibt die Art der Dacheindeckung (z.B. Reetdach) an."
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+// D a t e n e r h e b u n g  (QualitÃ€t der Einmessung)
+$sqle ="SELECT g.gml_id, e.wert, e.beschreibung, e.dokumentation FROM ax_gebaeude g 
+LEFT JOIN ax_datenerhebung e ON cast(e.wert AS varchar) = any(g.herkunft_source_source_ax_datenerhebung) 
+WHERE g.gml_id= $1 AND g.endet IS NULL;";
+$v = array($gmlid);
+$rese = pg_prepare("", $sqle);
+$rese = pg_execute("", $v);
+if (!$rese) {
+	echo "\n<p class='err'>Fehler bei Datenerhebung.<br>".pg_last_error()."</p>";
+	if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqle."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+while($rowe = pg_fetch_assoc($rese)) { // Schleife weil array-Feld, meist aber leer
+	$erheb =$rowe["wert"];
+	$berheb=$rowe["beschreibung"];
+	$derheb=$rowe["dokumentation"]; // immer leer, oder
+	if ($derheb == '' AND $erheb != '') { // Wert ohne Doku
+		if ( $erheb >= 2000) { // selbst was dazu sagen
+			$derheb = 'nicht eingemessenes Geb&auml;ude'; // so hieÃ das in der ALK
+		}
+	}
+	if ($erheb != "" OR $allefelder) {
+		echo "\n<tr>"
+			."\n\t<td class='li'>Datenerhebung</td>"
+			."\n\t<td class='fett'>";
+			if ($showkey) {echo "<span class='key'>(".$erheb.")</span>&nbsp;";}
+			echo $berheb."</td>"
 			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Name' ist der Eigenname oder die Bezeichnung des Geb&auml;udes."
-			."\n\t</td>"
+				."\n\t\t<p class='erklk'>'Datenerhebung' beschreibt Qualit&auml;tsangaben, Herkunft.</p>"
+				."\n\t\t<p class='erkli'>".$derheb."</p>"
+			."</td>"
 		."\n</tr>";
 	}
-
-	// 0 bis N   L a g e bezeichnungen mit Haus- oder Pseudo-Nummer
-
-	// HAUPTgebÃ€ude
-	$sqll ="SELECT 'm' AS ltyp, lh.gml_id AS gmllag, sh.lage, sh.bezeichnung, lh.hausnummer, '' AS laufendenummer FROM ax_gebaeude gh
-	JOIN ax_lagebezeichnungmithausnummer lh ON lh.gml_id=ANY(gh.zeigtauf)
-	JOIN ax_lagebezeichnungkatalogeintrag sh ON lh.kreis=sh.kreis AND lh.gemeinde=sh.gemeinde AND lh.lage=sh.lage
-	WHERE gh.gml_id= $1 AND gh.endet IS NULL AND lh.endet IS NULL AND sh.endet IS NULL";
-	// oder NEBENgebÃ€ude
-	$sqll.=" UNION 
-	SELECT 'p' AS ltyp, ln.gml_id AS gmllag, sn.lage, sn.bezeichnung, ln.pseudonummer AS hausnummer, ln.laufendenummer
-	FROM ax_gebaeude gn
-	JOIN ax_lagebezeichnungmitpseudonummer ln ON ln.gml_id=gn.hat
-	JOIN ax_lagebezeichnungkatalogeintrag sn ON ln.kreis=sn.kreis AND ln.gemeinde=sn.gemeinde AND ln.lage=sn.lage
-	WHERE gn.gml_id= $1 AND gn.endet IS NULL AND ln.endet IS NULL AND sn.endet IS NULL ";
-
-	$sqll.="ORDER BY bezeichnung, hausnummer ;";
-
-	$v = array($gmlid);
-	$resl = pg_prepare("", $sqll);
-	$resl = pg_execute("", $v);
-	if (!$resl) {
-		echo "\n<p class='err'>Fehler bei Lage mit HsNr.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqll."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+echo "\n</table>";
+pg_free_result($rese);
+
+$gfla=$rowg["gebflae"]; // bei Flurstck. gebraucht
+pg_free_result($resg);
+
+echo "\n\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurst&uuml;cke</h3>"
+."\n<p>.. auf dem das Geb&auml;ude steht. Ermittelt durch Verschneidung der Geometrie.</p>";
+
+// F l u r s t ÃŒ c k
+$sqlf ="SELECT f.gml_id, round(st_area(ST_Intersection(g.wkb_geometry,f.wkb_geometry))::numeric,2) AS schnittflae, 
+st_within(g.wkb_geometry,f.wkb_geometry) as drin, o.gemarkungsnummer, o.bezeichnung, f.flurnummer, f.zaehler, f.nenner 
+FROM ax_gebaeude g, ax_flurstueck f LEFT JOIN ax_gemarkung o ON f.land=o.land AND f.gemarkungsnummer=o.gemarkungsnummer
+WHERE g.gml_id= $1 AND f.endet IS NULL and g.endet IS NULL 
+AND st_intersects(g.wkb_geometry,f.wkb_geometry) = true ORDER BY schnittflae DESC;";
+
+$v=array($gmlid);
+$resf=pg_prepare("", $sqlf);
+$resf=pg_execute("", $v);
+if (!$resf) {
+	echo "\n<p class='err'>Fehler bei FS-Verschneidung.</p>";
+	if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlf."<br>$1 = gml_id = '".$gmlid."'</p>";}
+}
+
+echo "\n<hr>\n<table class='geb'>"
+."\n<tr>"
+	."\n\t<td class='heads fla' title='Schnittfl&auml;che zwischen Flurst&uuml;ck und Geb&auml;ude'><img src='ico/sortd.png' width='10' height='10' alt='' title='Sortierung (absteigend)'>Fl&auml;che</td>"
+	."\n\t<td class='head' title='Verh&auml;ltnis Geb&auml;udefl&auml;che zur FlurstÃŒcksfl&auml;che'>Verh&auml;ltnis</td>"
+	."\n\t<td class='head' title='Flurst&uuml;ckskennzeichen Ortsteil'>Gemarkung</td>"
+	."\n\t<td class='head' title='Flurst&uuml;ckskennzeichen Flur-Nummer'>Flur</td>"
+	."\n\t<td class='heads fsnr' title='Flurst&uuml;ckskennzeichen Flurst&uuml;cks-Nummer'>Flurst&uuml;ck</td>"
+	."\n\t<td class='head nwlink' title='Flurst&uuml;cks-Nachweis'>weitere Auskunft</td>"
+."\n</tr>";
+
+while($rowf = pg_fetch_assoc($resf)) {
+	$fgml=$rowf["gml_id"];
+	$drin=$rowf["drin"];
+	$schni=$rowf["schnittflae"];
+	$flur= $rowf["flurnummer"];
+	$fskenn=$rowf["zaehler"];
+	if ($rowf["nenner"] != "") { $fskenn.="/".$rowf["nenner"];}
+
+	// 3 FÃ€lle:
+	if ($drin === "t") { // GebÃ€ude liegt komplett in FlurstÃŒck
+		$gstyle="gin"; // siehe .css	
+		$f1=number_format($schni,2,",",".") . " m&#178;";
+		$f2="vollst&auml;ndig";
+	} else {
+		if ($schni === "0.00") { // GebÃ€ude angrenzend (Grenzbebauung)
+			$gstyle="gan";
+			$f1="&nbsp;";
+			$f2="angrenzend";
+		} else { // Teile des GebÃ€udes stehen auf dem FlurstÃŒck
+			$gstyle="gtl";
+			$f1=number_format($schni,2,",",".") . " m&#178;";
+			$f2="teilweise";
+		}
 	}
-	$zhsnr=0;
-	while($rowl = pg_fetch_assoc($resl)) { // LOOP: Lagezeilen
-		$zhsnr++;
-		$ltyp=$rowl["ltyp"]; // Lagezeilen-Typ
-		$skey=$rowl["lage"]; // Str.-Schluessel
-		$snam=htmlentities($rowl["bezeichnung"], ENT_QUOTES, "UTF-8"); // -Name
-		$hsnr=$rowl["hausnummer"];
-		$hlfd=$rowl["laufendenummer"];
-		$gmllag=$rowl["gmllag"];
-
-		if ($zhsnr == 1) {
-			echo "\n<tr>"
-				."\n\t<td class='li' title='Lage mit Hausnummer oder Pseudonummer'>Adresse</td>"
-				."\n\t<td class='fett'>";
-		}
-		echo "\n\t\t<img src='ico/Lage_mit_Haus.png' width='16' height='16' alt=''>&nbsp;";
-		if ($showkey) {echo "<span class='key'>(".$skey.")</span>&nbsp;";}			
-		echo "\n\t\t<a title='Hausnummer' href='alkislage.php?gkz=".$gkz."&amp;gmlid=".$gmllag."&amp;ltyp=".$ltyp;
-			if ($showkey) {echo "&amp;showkey=j";}
-			echo "'>".$snam."&nbsp;".$hsnr;
-			if ($ltyp == "p") {echo ", lfd.Nr ".$hlfd;}
-		echo "</a><br>";
-	} // Ende Loop Lagezeilen m.H.
-	if ($zhsnr > 0) {echo "\n\t</td>\n\t<td>&nbsp;</td>\n</tr>";}
-
-// In der 3. Spalte:
-// p.erklk = ErklÃ€rungen zur Kategorie
-// p.erkli = .. zum Inhalt
-
-	// GebÃ€udefunktion
-	echo "\n<tr>"
-		."\n\t<td class='li'>Geb&auml;udefunktion</td>"
-		."\n\t<td class='fett'>";
-		if ($showkey) {echo "<span class='key'>".$kfunk."</span>&nbsp;";}
-		echo $bfunk."</td>"
-		."\n\t<td>"
-			."\n\t\t<p class='erklk'>'Geb&auml;udefunktion' ist die zum Zeitpunkt der Erhebung vorherrschend funktionale Bedeutung des Geb&auml;udes'</p>"
-			."\n\t\t<p class='erkli'>".$dfunk."</p>"
-		."</td>"
-	."\n</tr>";
-
-	// Bauweise
-	if ($baw != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Bauweise</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$baw."</span>&nbsp;";}
-			echo $bbauw."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Bauweise' ist die Beschreibung der Art der Bauweise.</p>"
-				."\n\t\t<p class='erkli'>".$dbauw."</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Geschosse
-	if ($aog != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Geschosse</td>"
-			."\n\t<td class='fett'>".$aog."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>Anzahl oberirdischer Geschosse.</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// U-Geschosse
-	if ($aug != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>U-Geschosse</td>"
-			. "\n\t<td class='fett'>".$aug."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>Anzahl unterirdischer Geschosse.</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Hochhaus
-	if ($hoh != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Hochhaus</td>"
-			."\n\t<td class='fett'>".$hoh."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'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."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Lage zur ErdoberflÃ€che
-	if ($ofl != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Lage zur Erdoberfl&auml;che</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$ofl."</span>&nbsp;";}
-			echo $oflv."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'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>"
-				."\n\t\t<p class='erkli'>".$ofld."</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Dachgeschossausbau, Spalte dokumentation ist immer leer
-	if ($dga != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Dachgeschossausbau</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$dga."</span>&nbsp;";}
-			echo $dgav."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Dachgeschossausbau' ist ein Hinweis auf den Ausbau bzw. die Ausbauf&auml;higkeit des Dachgeschosses."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Zustand
-	if ($zus != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Zustand</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$zus."</span>&nbsp;";}
-			echo $zusv."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'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.</p>"
-				."\n\t\t<p class='erkli'>".$zusd."</p>"
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Weitere GebÃ€udefunktionen
-	// Suche Testfall: SELECT gml_id, gebaeudefunktion, weiteregebaeudefunktion FROM ax_gebaeude WHERE (NOT weiteregebaeudefunktion IS NULL) AND cardinality(weiteregebaeudefunktion) > 1 liMIT 10;
-	if ($wgf != "" OR $allefelder) { // ... ist ein Array
-		echo "\n<tr>"
-			."\n\t<td class='li'>Weitere Geb&auml;udefunktionen</td>"
-			."\n\t<td>";
-			if ($wgf != "") { // Kommagetrennte Liste aus Array
-				$sqlw="SELECT wert, beschreibung, dokumentation FROM ax_gebaeudefunktion WHERE wert IN ( $1 ) ORDER BY wert;";
-				$v = array($wgf);
-				$resw = pg_prepare("", $sqlw);
-				$resw = pg_execute("", $v);
-				if (!$resw) {
-					echo "\n<p class='err'>Fehler bei Geb&auml;ude - weitere Funktion.</p>";
-					if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqlw."<br>$1 = Werteliste = '".$wgf."'</p>";}
-				}
-				$zw=0;
-				while($roww = pg_fetch_assoc($resw)) { // LOOP Funktion
-					if ($zw > 0) {echo "<br>";}
-					if ($showkey) {echo "<span class='key'>".$roww["wert"]."</span>&nbsp;";}
-					echo "<span title='".$roww["dokumentation"]."'>".$roww["beschreibung"]."</span>";
-					$zw++;
-			   }
-			}
-			echo "</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Weitere Geb&auml;udefunktion' ist die Funktion, die ein Geb&auml;ude neben der dominierenden Geb&auml;udefunktion hat."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Dachform, Spalte dokumentation ist immer leer
-	if ($daf != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Dachform</td>"
-			."\n\t<td class='fett'>";
-			if ($showkey) {echo "<span class='key'>".$daf."</span>&nbsp;";}
-			echo $dach."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Dachform' beschreibt die charakteristische Form des Daches."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// ObjekthÃ¶he
-	if ($hho != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Objekth&ouml;he</td>"
-			."\n\t<td class='fett'>".$hho."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'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."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// GeschossflÃ€che
-	if ($gfl != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Geschossfl&auml;che</td>"
-			."\n\t<td class='fett'>";
-			if ($gfl != "") {echo $gfl." m&#178;";}
-			echo "</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Geschossfl&auml;che' ist die Geb&auml;udegeschossfl&auml;che in [qm]."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// GrundflÃ€che
-	if ($grf != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Grundfl&auml;che</td>"
-			."\n\t<td class='fett'>";
-			if ($grf != "") {echo $grf." m&#178;";}
-			echo "\n\t<td>"
-				."\n\t\t<p class='erklk'>'Grundfl&auml;che' ist die Geb&auml;udegrundfl&auml;che in [qm]."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Umbauter Raum
-	if ($ura != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Umbauter Raum</td>"
-			."\n\t<td class='fett'>".$ura."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Umbauter Raum' ist der umbaute Raum [Kubikmeter] des Geb&auml;udes."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Baujahr
-	if ($bja != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Baujahr</td>"
-			."\n\t<td class='fett'>".$bja."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Baujahr' ist das Jahr der Fertigstellung oder der baulichen Ver&auml;nderung des Geb&auml;udes."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// Dachart
-	if ($daa != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Dachart</td>"
-			."\n\t<td class='fett'>".$daa."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>'Dachart' gibt die Art der Dacheindeckung (z.B. Reetdach) an."
-			."\n\t</td>"
-		."\n</tr>";
-	}
-
-	// QualitÃ€tsangaben
-/*	if ($qag != "" OR $allefelder) {
-		echo "\n<tr>"
-			."\n\t<td class='li'>Qualit&auml;tsangaben</td>"
-			."\n\t<td class='fett'>".$qag."</td>"
-			."\n\t<td>"
-				."\n\t\t<p class='erklk'>Angaben zur Herkunft der Informationen (Erhebungsstelle). Die Information ist konform zu den Vorgaben aus ISO 19115 zu repr&auml;sentieren."
-			."\n\t</td>"
-		."\n</tr>";
-	} */
-	echo "\n</table>";
-}
-if ($gebnr == 0) {echo "\n<p class='err'><br>Kein Geb&auml;ude gefunden<br>&nbsp;</p>";}
-
-// ++ ToDo:  -Verschnitt mit FS?  -Ausgeben ax_georeferenziertegebaeudeadresse dazz, wenn gefÃŒllt.
+	echo "\n<tr>"
+		."\n\t<td class='fla'>".$f1."</td>"
+		."\n\t<td class='".$gstyle."'>".$f2."</td>";
+	echo "\n\t<td>";
+	if ($showkey) {echo "<span class='key'>(".$rowf["gemarkungsnummer"].")</span> ";}
+	echo $rowf["bezeichnung"]."</td>"
+	."\n\t<td>".$flur."</td>"
+	."\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>";
+
+	echo "\n\t<td class='nwlink noprint'>" // Link FS
+		."\n\t\t<a title='Flurst&uuml;ck' href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$fgml;
+		if ($showkey) {echo "&amp;showkey=j";}
+		echo "'>Flurst&uuml;ck&nbsp;<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''></a>"
+		."\n\t</td>"
+	."\n</tr>";
+}
+
+$gfla=number_format($gfla,2,",",".") . " m&#178;";
+echo "\n<tr>\n\t<td class='fla sum'>".$gfla."</td>\n\t<td>Geb&auml;udefl&auml;che</td>\n\t<td></td>\n</tr>";
+echo "\n</table>"; // Ende FlurstÃŒcke
 ?>
 
@@ -452,5 +543,5 @@
 </div>
 
-<?php footer($gmlid, $_SERVER['PHP_SELF']."?", ""); ?>
+<?php footer($gmlid, selbstverlinkung()."?", ""); ?>
 
 </body>
