[405] | 1 | <?php |
---|
[427] | 2 | /* alkisgsnw.php |
---|
[405] | 3 | |
---|
[427] | 4 | ALKIS-Auskunft |
---|
| 5 | Author: Frank JÀger, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo) |
---|
[405] | 6 | |
---|
[427] | 7 | GrundstÃŒcksnachweis fÃŒr ein GrundstÃŒck (Buchung) aus ALKIS PostNAS |
---|
| 8 | |
---|
[405] | 9 | Version: |
---|
[427] | 10 | 2018-05-03 Neues Modul |
---|
| 11 | ... |
---|
[422] | 12 | 2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF'] |
---|
| 13 | 2020-12-15 Input-Validation und Strict Comparisation (===) |
---|
[425] | 14 | 2021-12-09 Neue Parameter: $katAmtMix (Kataster-Amt-Mix), $PrntBtn (Drucken-SchaltflÀche) |
---|
[427] | 15 | 2022-01-13 Neue Functions LnkStf(), DsKy() |
---|
[430] | 16 | 2022-07-05 PHP 8.1: Connection verwenden bei "pg_prepare" und "pg_execute", keine NULL-Werte in String-Functions verwenden |
---|
[425] | 17 | ToDo: |
---|
| 18 | - Den Fall berÌcksichtigen, dass die Buchung vorhanden ist, aber das GB nicht (ModellschwÀche). Meldungen ausgeben. |
---|
| 19 | - bei Aufruf herrschende Buchung mit mehreren dienenden Buchungen: Links zu den dienenden Buchungen anzeigen |
---|
[405] | 20 | */ |
---|
| 21 | |
---|
| 22 | function get_GS_Daten($gmlid, $gskennz) { |
---|
| 23 | // Daten zur Buchungsstelle (GS = GrundstÃŒck) aus der DB lesen. |
---|
| 24 | // Suche wahlweise ÃŒber die GML-ID oder ÃŒber das GrundstÃŒcks-Kennzeichen (Bezirk-Blatt-LfdNr) aus der URL. |
---|
[430] | 25 | global $gkz, $showkey, $dbg, $defland, $gsbez, $gsblatt, $gslfdnr, $gsbart, $con; |
---|
[405] | 26 | |
---|
| 27 | $sqlgs="SELECT s.gml_id, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, s.laufendenummer, s.buchungsart " |
---|
| 28 | ."FROM ax_buchungsstelle s JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id "; |
---|
[425] | 29 | // Falls das Buchungsblatt fehlt (ModellschwÀche) wÀre ein LEFT JOIN hier nÌtzlich. Das Fehlen aber kontrollieren! |
---|
[422] | 30 | |
---|
[405] | 31 | if ($gskennz == '') { // normaler Link ÃŒber gmlid |
---|
| 32 | $sqlgs.="WHERE s.gml_id= $1 "; |
---|
| 33 | $v=array($gmlid); |
---|
| 34 | } else { // Kennzeichen "Bezirk-Blatt-BVNR" alternativ zur gml_id |
---|
| 35 | $arr=explode("-", $gskennz, 4); // zerlegen |
---|
| 36 | $zbez=trim($arr[0]); // Bezirk |
---|
[422] | 37 | if (strlen($zbez) === 6) { |
---|
[405] | 38 | $land=substr($zbez, 0, 2); |
---|
| 39 | $zbez=substr($zbez, 2, 4); |
---|
| 40 | } else { // kein schöner Land .. |
---|
| 41 | $land=$defland; // Default aus config |
---|
| 42 | } |
---|
| 43 | $zblatt=$arr[1]; |
---|
| 44 | if (preg_match('#^[0-9]{1,6}$#', $zblatt)) { // Nur numerisch |
---|
| 45 | $zblatt=str_pad($zblatt, 6, "0", STR_PAD_LEFT)." "; // 6 Nr + 1 blank |
---|
| 46 | } elseif (preg_match('#^[0-9A-Z]{1,7}$#', $zblatt)) { // +++ A nur in LETZTER Stelle prÃŒfen |
---|
| 47 | $zblatt=str_pad($zblatt, 7, "0", STR_PAD_LEFT); // 6 Nr + 1 "A", gesamt 7 |
---|
| 48 | } else { |
---|
| 49 | die("Fehler in Buchungsblatt im Parameter 'gskennz'."); |
---|
| 50 | } |
---|
| 51 | $zlfdnr=str_pad($arr[2], 4, "0", STR_PAD_LEFT); // Lfd.-Nr./BVNR |
---|
| 52 | $sqlgs.="WHERE b.land= $1 AND b.bezirk= $2 AND b.buchungsblattnummermitbuchstabenerweiterung= $3 AND s.laufendenummer= $4 "; |
---|
| 53 | $v=array($land, $zbez, $zblatt, $zlfdnr); |
---|
| 54 | } |
---|
| 55 | // egal ob Suche mit gmlid ODER Kennzeichen |
---|
| 56 | $sqlgs.="AND b.endet IS NULL AND s.endet IS NULL;"; |
---|
[430] | 57 | $resgs=pg_prepare($con, "", $sqlgs); |
---|
| 58 | $resgs=pg_execute($con, "", $v); |
---|
[405] | 59 | if ($rowgs=pg_fetch_assoc($resgs)) { |
---|
| 60 | $gmlid=$rowgs["gml_id"]; |
---|
| 61 | $gsbez=$rowgs["bezirk"]; |
---|
| 62 | $gsblatt=$rowgs["blatt"]; |
---|
| 63 | $gslfdnr=$rowgs["laufendenummer"]; |
---|
| 64 | $gsbart=$rowgs["buchungsart"]; |
---|
| 65 | } else { |
---|
| 66 | echo "\n<p class='err'>Fehler! Kein Treffer für Grundstückskennzeichen='".$gskennz."'</p>\n</body>\n</html>"; |
---|
| 67 | return ""; |
---|
| 68 | } |
---|
| 69 | pg_free_result($resgs); |
---|
| 70 | return $gmlid; |
---|
| 71 | } |
---|
| 72 | |
---|
[425] | 73 | function Back2theRoots($gmlid) { |
---|
[430] | 74 | // Die Buchungsstelle aus dem Aufruf-Parameter - wenn eindeutig möglich - iterativ zurÌck fÌhren auf die dienende Buchungsstelle, |
---|
[425] | 75 | // auf der die FlurstÃŒcke gebucht sind (Buchungsart="GrundstÃŒck" oder Blattart="fiktives Blatt"). |
---|
| 76 | // Der GrundstÃŒcksnachweis wird aus anderen Modulen nur fÃŒr die "GrundstÃŒck"-Buchung aufgerufen, so dass diese Suche nicht notwendig ist. |
---|
| 77 | // Bei Aufrufen von auÃen kann dies aber sinnvoll sein. |
---|
| 78 | |
---|
[430] | 79 | global $gkz, $dbg, $showkey, $gerooted, $con; |
---|
[425] | 80 | $gd=$gmlid; // gml dienend |
---|
| 81 | |
---|
[405] | 82 | // BS-herrschend (bekannt) >an[]> BS-dienend (gesucht) |
---|
[425] | 83 | $sql="SELECT d.gml_id, d.laufendenummer FROM ax_buchungsstelle d JOIN ax_buchungsstelle h ON d.gml_id=any(h.an) " |
---|
| 84 | ."WHERE h.gml_id = $1 and d.endet IS NULL AND h.endet IS NULL ORDER BY d.laufendenummer;"; |
---|
[405] | 85 | |
---|
| 86 | while($gd != "") { |
---|
[425] | 87 | $gr=$gd; // gml Return |
---|
| 88 | $v=array($gd); |
---|
[430] | 89 | $res=pg_prepare($con, "", $sql); |
---|
| 90 | $res=pg_execute($con, "", $v); |
---|
[425] | 91 | $zeianz=pg_num_rows($res); |
---|
| 92 | if ($zeianz == 0){ // sollte nicht vorkommen, die Buchungsart "GrundstÃŒck" ruft dies NICHT auf |
---|
| 93 | if ($dbg > 1 ) {echo "\n<p class='err'>Keine 'diendende' Buchung zur Buchung '".$gd."'</p>";} |
---|
| 94 | $gd=""; |
---|
| 95 | } elseif ($zeianz == 1){ |
---|
| 96 | if ($dbg > 1 ) {echo "\n<p class='dbg'>Eine 'diendende' Buchung zur Buchung '".$gd."'</p>";} |
---|
| 97 | $row=pg_fetch_assoc($res); |
---|
| 98 | $gd=$row["gml_id"]; |
---|
| 99 | } else { // > 1 // Seltener Sonderfall |
---|
| 100 | if ($dbg > 1 ) {echo "\n<p class='dbg'>".$zeianz." 'diendende' Buchungen zur Buchung '".$gd."'</p>";} |
---|
| 101 | $gerooted=false; // Root (GrundstÃŒck) wird nicht erreicht |
---|
| 102 | $gd=""; // wenn mehrere (.an=Array[]), dann nicht eindeutig rÃŒckfÃŒhrbar |
---|
| 103 | echo "\n<table class='fs'>\n<tr>\n\t<td class='heads'>Hinweis</td>" |
---|
| 104 | ."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>" |
---|
| 105 | ."\n</tr>"; |
---|
| 106 | echo "\n<tr>\n\t<td>Die angeforderte Buchung hat Rechte an ".$zeianz." anderen Buchungen." |
---|
| 107 | ."<br>Für die Anzeige der Flurstücke muss eine dieser Grundstücks-Buchungen gewählt werden.</td>" |
---|
| 108 | ."\n\t<td>\n\t\t<p class='nwlink noprint'>"; |
---|
| 109 | while($row=pg_fetch_assoc($res)) { |
---|
| 110 | $gml_d=$row["gml_id"]; |
---|
| 111 | $bvnr=ltrim($row["laufendenummer"], '0'); |
---|
[427] | 112 | echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&gmlid=".$gml_d.LnkStf() |
---|
| 113 | ."' title='Grundstücksnachweis'>Buchung ".$bvnr |
---|
[425] | 114 | ." <img src='ico/Grundstueck_Link.png' width='16' height='16' alt=''></a><br>"; |
---|
| 115 | } |
---|
| 116 | echo "\n\t\t</p>\n\t</td>\n</tr>\n</table>"; |
---|
| 117 | } |
---|
[405] | 118 | } |
---|
[425] | 119 | pg_free_result($res); |
---|
[405] | 120 | return $gr; |
---|
| 121 | } |
---|
| 122 | |
---|
[425] | 123 | // S t a r t |
---|
[422] | 124 | ini_set("session.cookie_httponly", 1); |
---|
[405] | 125 | session_start(); |
---|
| 126 | $showkey="n"; $nodebug=""; |
---|
| 127 | $cntget=extract($_GET); // Parameter in Variable |
---|
| 128 | |
---|
| 129 | // Validierung |
---|
| 130 | if (isset($gmlid)) { // gml der Buchungsstelle (Aufruf) |
---|
| 131 | if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");} |
---|
| 132 | $gskennz=''; |
---|
| 133 | } else { // Alternativ |
---|
| 134 | $gmlid=''; |
---|
| 135 | if (isset($gskennz)) { // llgggg-bbbbbz-nnnn |
---|
| 136 | if (!preg_match('#^[0-9\-_/]{8,18}$#', $gskennz)) {die ("Eingabefehler gskennz");} |
---|
| 137 | } else { |
---|
| 138 | $gskennz=''; |
---|
[422] | 139 | die("Fehlender Parameter"); |
---|
[405] | 140 | } |
---|
| 141 | } |
---|
[422] | 142 | if (isset($gkz)) { |
---|
| 143 | if (!preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} |
---|
| 144 | } else { |
---|
| 145 | die("Fehlender Parameter"); |
---|
| 146 | } |
---|
[405] | 147 | if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");} |
---|
[422] | 148 | if ($showkey === "j") {$showkey=true;} else {$showkey=false;} |
---|
[405] | 149 | if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");} |
---|
| 150 | |
---|
[422] | 151 | include "alkis_conf_location.php"; |
---|
| 152 | include "alkisfkt.php"; |
---|
[405] | 153 | ?> |
---|
| 154 | <!doctype html> |
---|
| 155 | <html lang="de"> |
---|
| 156 | <head> |
---|
| 157 | <meta charset="utf-8"> |
---|
| 158 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
---|
| 159 | <title>ALKIS Grundstücksnachweis</title> |
---|
| 160 | <link rel="stylesheet" type="text/css" href="alkisauszug.css"> |
---|
| 161 | <link rel="shortcut icon" type="image/x-icon" href="ico/Grundstueck.ico"> |
---|
| 162 | <script> |
---|
| 163 | function ALKISexport(gmlid) { |
---|
| 164 | window.open('alkisexport.php?gkz=<?php echo $gkz;?>&tabtyp=buchung&gmlid=' + gmlid); |
---|
| 165 | } |
---|
| 166 | </script> |
---|
| 167 | </head> |
---|
| 168 | <body> |
---|
| 169 | <?php |
---|
[422] | 170 | $erlaubnis = darf_ich(); if ($erlaubnis === 0) { die('<p class="stop1">Abbruch</p></body>'); } |
---|
[427] | 171 | $dbg=$debug; |
---|
[425] | 172 | if ($nodebug === "j") {$dbg=0;} |
---|
[405] | 173 | $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisgsnw.php'"); |
---|
| 174 | if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>"; |
---|
| 175 | |
---|
[425] | 176 | $gml_anfrd=$gmlid; // ursprÃŒngliche Anforderung aus URL merken |
---|
| 177 | $gerooted=true; // Auskunft beginnt mit (dienendem) GrundstÃŒck |
---|
| 178 | $gmlid=get_GS_Daten($gmlid, $gskennz); // nachschauen, Variablen setzen, Keine Ausgabe |
---|
[405] | 179 | if ($gmlid == "") { // nix gefunden |
---|
| 180 | die("Kein Treffer"); |
---|
| 181 | } |
---|
[422] | 182 | echo "<p class='balken gskennz'>ALKIS Grundstück ".$gsbez."-".rtrim($gsblatt)."-".$gslfdnr." </p>\n\n<h2>Grundstück</h2>"; // Balken |
---|
[405] | 183 | |
---|
[425] | 184 | // F l u r s t Ì c k e |
---|
| 185 | echo "\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurstücke</h3>"; |
---|
| 186 | |
---|
| 187 | if ($gsbart > 1102){ // Recht an .. |
---|
| 188 | $gmlid_r=Back2theRoots($gmlid); |
---|
| 189 | if ($gmlid_r != $gmlid) { // wurde hoch gerÃŒckt |
---|
| 190 | $gmlid=get_GS_Daten($gmlid_r, ""); // damit weiter arbeiten |
---|
| 191 | } |
---|
| 192 | } |
---|
| 193 | if ($gerooted) { // // Buchungsart (aufgeteiltes) GrundstÃŒck (nicht Recht an ..) |
---|
| 194 | echo "\n<table class='fs'>\n<tr>" // Kopfzeile |
---|
[405] | 195 | ."\n\t<td class='heads'>Gemarkung</td>" |
---|
| 196 | ."\n\t<td class='heads'>Flur</td>" |
---|
| 197 | ."\n\t<td class='heads fsnr' title='Flurstücksnummer (Zähler / Nenner)'><span class='wichtig'>Flurst.</span></td>" |
---|
[425] | 198 | ."\n\t<td class='head fla'>Fläche</td>" |
---|
[405] | 199 | ."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>" |
---|
| 200 | ."\n</tr>"; |
---|
[422] | 201 | //++ Lage oder Nutzung zum FS in eine zus. Spalte oder Zeile? |
---|
| 202 | //++ Tabelle hat noch Platz, SQL in der Loop oder Subquery wÀre möglich, weil i.d.R. nur wenige FS je GS gebucht sind. |
---|
[405] | 203 | |
---|
[425] | 204 | $sqlfs ="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche " |
---|
| 205 | ."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ".UnqKatAmt("f","g") |
---|
| 206 | ."WHERE f.istgebucht = $1 AND f.endet IS NULL AND g.endet IS NULL "; |
---|
[422] | 207 | if ($filtgem === '' ) { // ungefiltert |
---|
[405] | 208 | $v=array($gmlid); |
---|
| 209 | } else { |
---|
[412] | 210 | $sqlfs.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÀndiges Gebiet |
---|
[405] | 211 | $v=array($gmlid, $filtkreis, $filtgem); |
---|
| 212 | } |
---|
| 213 | $sqlfs.="ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;"; |
---|
[430] | 214 | $resfs = pg_prepare($con, "", $sqlfs); |
---|
| 215 | $resfs = pg_execute($con, "", $v); |
---|
[405] | 216 | if (!$resfs) {echo "\n<p class='err'>Fehler bei Flurstück</p>";} |
---|
| 217 | |
---|
| 218 | $j=0; |
---|
| 219 | $zpaar=false; |
---|
| 220 | while($rowfs = pg_fetch_assoc($resfs)) { |
---|
| 221 | $flur= $rowfs["flurnummer"]; |
---|
| 222 | $fskenn=$rowfs["zaehler"]; |
---|
| 223 | if ($rowfs["nenner"] != "") {$fskenn.="/".$rowfs["nenner"];} |
---|
| 224 | $flae=number_format($rowfs["amtlicheflaeche"],0,",",".") . " m²"; |
---|
| 225 | |
---|
| 226 | if ($zpaar) {$trclass='paa';} else {$trclass='unp';} // Farbwechsel |
---|
| 227 | $zpaar=!$zpaar; |
---|
[427] | 228 | echo "\n<tr class='".$trclass."'>"; // eine Zeile je FlurstÃŒck |
---|
| 229 | echo "\n\t<td>".DsKy($rowfs["gemarkungsnummer"], 'Gemarkungsnummer').$rowfs["bezeichnung"]."</td>" |
---|
[405] | 230 | ."\n\t<td>".$flur."</td>" |
---|
| 231 | ."\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>" |
---|
| 232 | ."\n\t<td class='fla'>".$flae."</td>" |
---|
| 233 | ."\n\t<td>\n\t\t<p class='nwlink noprint'>" |
---|
[427] | 234 | ."\n\t\t\t<a href='alkisfsnw.php?gkz=".$gkz."&gmlid=".$rowfs["gml_id"]."&eig=n".LnkStf() |
---|
| 235 | ."' title='Flurstücksnachweis'>Flurstück " |
---|
| 236 | ."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>" |
---|
[405] | 237 | ."</a>\n\t\t</p>" |
---|
| 238 | ."\n\t</td>" |
---|
| 239 | ."\n</tr>"; |
---|
| 240 | $j++; |
---|
| 241 | } |
---|
| 242 | pg_free_result($resfs); |
---|
[422] | 243 | if ($j === 0) {echo "\n<tr class='unp'>\n\t<td colspan='5'><p class='warn'>Keine Flurstücke im berechtigten Bereich.</p></td>\n</tr>";} |
---|
[405] | 244 | echo "\n</table>"; |
---|
| 245 | } |
---|
| 246 | |
---|
| 247 | // Rechte anderer GS an diesem GS |
---|
| 248 | // Dieser Teil ist fast identisch mit "FlurstÃŒcksnachweis", Kommentare siehe dort. |
---|
| 249 | $bartgrp=""; |
---|
| 250 | $barttypgrp=""; |
---|
| 251 | echo "\n<table class='outer'>"; |
---|
| 252 | $stufe=1; |
---|
[422] | 253 | $gezeigt = buchung_anzg($gmlid, "j", false, "", 2); |
---|
[405] | 254 | $anzber=ber_bs_zaehl($gmlid); |
---|
| 255 | $verf_next = array($gmlid); |
---|
| 256 | while ($anzber > 0 ) { |
---|
| 257 | $verf_akt=$verf_next; |
---|
| 258 | $verf_next=array(); |
---|
| 259 | $stufe++; |
---|
| 260 | $i=0; |
---|
| 261 | foreach($verf_akt as $gml_ber_bs) { |
---|
| 262 | $i++; |
---|
| 263 | if (ber_bs_zaehl($gml_ber_bs) > 0) { |
---|
| 264 | $verf_neu=ber_bs_anzg($gml_ber_bs, "j", false, "", $gml_anfrd); |
---|
| 265 | $anz_neu=count($verf_neu); |
---|
| 266 | if ($anz_neu > 0) { |
---|
| 267 | $verf_next=array_merge($verf_next, $verf_neu); |
---|
| 268 | } |
---|
| 269 | } |
---|
| 270 | } |
---|
| 271 | $anzber=count($verf_next); |
---|
| 272 | } |
---|
[425] | 273 | echo "\n</table>\n"; |
---|
| 274 | pg_close($con); |
---|
[405] | 275 | |
---|
[425] | 276 | echo "<div class='buttonbereich noprint'>\n<hr>" |
---|
| 277 | ."\n\t<a title='zurück' href='javascript:history.back()'><img src='ico/zurueck.png' width='16' height='16' alt='zurück'></a> "; |
---|
| 278 | if ($PrntBtn==true){echo "\n\t<a title='Drucken' href='javascript:window.print()'><img src='ico/print.png' width='16' height='16' alt='Drucken'></a> ";} |
---|
[405] | 279 | if ($stufe < 3) { |
---|
| 280 | echo "\n\t<a title='Export als CSV' href='javascript:ALKISexport(\"".$gmlid."\")'><img src='ico/download_gs.png' width='32' height='16' alt='Export'></a>"; |
---|
| 281 | } else { // Export CSV wÀre unvollstÀndig bei Buchungen auf mehr als 2 Ebenen. 2 Ebenen werden im View Ìber UNION und einem Zweig mit 2x "an"-Relation abgefangen. |
---|
| 282 | echo "\n\t<img src='ico/download_gs_no.png' width='32' height='16' alt='Export' title='Komplexe Buchungen ÃŒber ".$stufe." Ebenen sind nicht als lineare CSV-Datei exportierbar'>"; |
---|
| 283 | } |
---|
| 284 | echo " \n</div>"; |
---|
| 285 | |
---|
[422] | 286 | footer($gmlid, selbstverlinkung()."?", ""); |
---|
[405] | 287 | ?> |
---|
| 288 | </body> |
---|
| 289 | </html> |
---|