1 | <?php |
---|
2 | /* Modul: alkisgsnw.php |
---|
3 | |
---|
4 | ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo). |
---|
5 | GrundstÃŒcksnachweis fuer ein GrundstÃŒck aus ALKIS PostNAS |
---|
6 | |
---|
7 | Version: |
---|
8 | 2018-05-03 Neues Modul "gsnw" abgeleitet aus "fsnw" |
---|
9 | 2018-11-09 Umstellung Full-Schema |
---|
10 | */ |
---|
11 | |
---|
12 | function get_GS_Daten($gmlid, $gskennz) { |
---|
13 | // Daten zur Buchungsstelle (GS = GrundstÃŒck) aus der DB lesen. |
---|
14 | // Suche wahlweise ÃŒber die GML-ID oder ÃŒber das GrundstÃŒcks-Kennzeichen (Bezirk-Blatt-LfdNr) aus der URL. |
---|
15 | global $gkz, $showkey, $debug, $defland, $gsbez, $gsblatt, $gslfdnr, $gsbart; |
---|
16 | |
---|
17 | $sqlgs="SELECT s.gml_id, b.bezirk, b.buchungsblattnummermitbuchstabenerweiterung AS blatt, s.laufendenummer, s.buchungsart " |
---|
18 | ."FROM ax_buchungsstelle s JOIN ax_buchungsblatt b ON s.istbestandteilvon=b.gml_id "; |
---|
19 | if ($gskennz == '') { // normaler Link ÃŒber gmlid |
---|
20 | $sqlgs.="WHERE s.gml_id= $1 "; |
---|
21 | $v=array($gmlid); |
---|
22 | } else { // Kennzeichen "Bezirk-Blatt-BVNR" alternativ zur gml_id |
---|
23 | $arr=explode("-", $gskennz, 4); // zerlegen |
---|
24 | $zbez=trim($arr[0]); // Bezirk |
---|
25 | if (strlen($zbez) == 6) { |
---|
26 | $land=substr($zbez, 0, 2); |
---|
27 | $zbez=substr($zbez, 2, 4); |
---|
28 | } else { // kein schöner Land .. |
---|
29 | $land=$defland; // Default aus config |
---|
30 | } |
---|
31 | $zblatt=$arr[1]; |
---|
32 | if (preg_match('#^[0-9]{1,6}$#', $zblatt)) { // Nur numerisch |
---|
33 | $zblatt=str_pad($zblatt, 6, "0", STR_PAD_LEFT)." "; // 6 Nr + 1 blank |
---|
34 | } elseif (preg_match('#^[0-9A-Z]{1,7}$#', $zblatt)) { // +++ A nur in LETZTER Stelle prÃŒfen |
---|
35 | $zblatt=str_pad($zblatt, 7, "0", STR_PAD_LEFT); // 6 Nr + 1 "A", gesamt 7 |
---|
36 | } else { |
---|
37 | die("Fehler in Buchungsblatt im Parameter 'gskennz'."); |
---|
38 | } |
---|
39 | $zlfdnr=str_pad($arr[2], 4, "0", STR_PAD_LEFT); // Lfd.-Nr./BVNR |
---|
40 | $sqlgs.="WHERE b.land= $1 AND b.bezirk= $2 AND b.buchungsblattnummermitbuchstabenerweiterung= $3 AND s.laufendenummer= $4 "; |
---|
41 | $v=array($land, $zbez, $zblatt, $zlfdnr); |
---|
42 | } |
---|
43 | // egal ob Suche mit gmlid ODER Kennzeichen |
---|
44 | $sqlgs.="AND b.endet IS NULL AND s.endet IS NULL;"; |
---|
45 | $resgs=pg_prepare("", $sqlgs); |
---|
46 | $resgs=pg_execute("", $v); |
---|
47 | if ($rowgs=pg_fetch_assoc($resgs)) { |
---|
48 | $gmlid=$rowgs["gml_id"]; |
---|
49 | $gsbez=$rowgs["bezirk"]; |
---|
50 | $gsblatt=$rowgs["blatt"]; |
---|
51 | $gslfdnr=$rowgs["laufendenummer"]; |
---|
52 | $gsbart=$rowgs["buchungsart"]; |
---|
53 | } else { |
---|
54 | echo "\n<p class='err'>Fehler! Kein Treffer für Grundstückskennzeichen='".$gskennz."'</p>\n</body>\n</html>"; |
---|
55 | return ""; |
---|
56 | } |
---|
57 | pg_free_result($resgs); |
---|
58 | return $gmlid; |
---|
59 | } |
---|
60 | |
---|
61 | function bs_dienend($gmlid_h) { |
---|
62 | // Eine ggf. vorhandene dienende Buchungsstelle suchen und dessen GML_ID liefern. |
---|
63 | global $debug, $gerooted; |
---|
64 | // BS-herrschend (bekannt) >an[]> BS-dienend (gesucht) |
---|
65 | $sqld="SELECT d.gml_id FROM ax_buchungsstelle d JOIN ax_buchungsstelle h ON d.gml_id=any(h.an) " |
---|
66 | ."WHERE h.gml_id = $1 and d.endet IS NULL AND h.endet IS NULL"; |
---|
67 | $v=array($gmlid_h); |
---|
68 | $resd=pg_prepare("", $sqld); |
---|
69 | $resd=pg_execute("", $v); |
---|
70 | $cntd=0; |
---|
71 | while($rowd=pg_fetch_assoc($resd)) { |
---|
72 | $cntd++; |
---|
73 | $gmlid_d=$rowd["gml_id"]; |
---|
74 | } |
---|
75 | if ($cntd == 0) { // KEINE dienende BS |
---|
76 | $gmlid_d=""; |
---|
77 | } elseif ($cntd > 1) { // Problem: mehrere dienende BS |
---|
78 | $gmlid_d=""; // wennn mehrere (.an=Array[]), dann nicht eindeutig rÃŒckfÃŒhrbar. |
---|
79 | $gerooted=false; // Root nicht erreicht |
---|
80 | if ($debug > 2 ) { // Meldung? Auswahl? |
---|
81 | echo "\n<p class='err'>Mehrere 'diendende' Buchungen zur Buchung '".$gmlid_h."'</p>"; |
---|
82 | } |
---|
83 | } |
---|
84 | pg_free_result($resd); |
---|
85 | return $gmlid_d; |
---|
86 | } |
---|
87 | |
---|
88 | function Back2theRoots($gmlid_h) { |
---|
89 | // Eine Buchungsstelle (aus dem Aufruf-Parameter) zurÃŒck fÃŒhren auf die Basis-Buchungsstelle |
---|
90 | // Suchen bis Buchungsart="GrundstÃŒck" oder ggf. Blattart="fiktives Blatt" |
---|
91 | global $debug; |
---|
92 | $gh=$gmlid_h; // herrschend |
---|
93 | $gd=$gh; // dienend |
---|
94 | $gr=$gd; // root |
---|
95 | //$steps=0; // wie oft? |
---|
96 | while($gd != "") { |
---|
97 | //$steps++; |
---|
98 | $gr=$gd; // sichern |
---|
99 | $gd=bs_dienend($gh); // an? |
---|
100 | $gh=$gd; // fuer weitere Loop |
---|
101 | } |
---|
102 | //$steps=$steps -1; // erfolgreiche Suchen |
---|
103 | return $gr; |
---|
104 | } |
---|
105 | |
---|
106 | session_start(); |
---|
107 | $showkey="n"; $nodebug=""; |
---|
108 | $cntget=extract($_GET); // Parameter in Variable |
---|
109 | |
---|
110 | // Validierung |
---|
111 | if (isset($gmlid)) { // gml der Buchungsstelle (Aufruf) |
---|
112 | if (!preg_match('#^[0-9A-Za-z]{16}$#', $gmlid)) {die("Eingabefehler gmlid");} |
---|
113 | $gskennz=''; |
---|
114 | } else { // Alternativ |
---|
115 | $gmlid=''; |
---|
116 | if (isset($gskennz)) { // llgggg-bbbbbz-nnnn |
---|
117 | if (!preg_match('#^[0-9\-_/]{8,18}$#', $gskennz)) {die ("Eingabefehler gskennz");} |
---|
118 | } else { |
---|
119 | $gskennz=''; |
---|
120 | } |
---|
121 | } |
---|
122 | if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} |
---|
123 | if (!preg_match('#^[j|n]{0,1}$#', $showkey)) {die ("Eingabefehler showkey");} |
---|
124 | if ($showkey == "j") {$showkey=true;} else {$showkey=false;} |
---|
125 | if (!preg_match('#^j{0,1}$#', $nodebug)) {die("Eingabefehler nodebug");} |
---|
126 | |
---|
127 | require_once("alkis_conf_location.php"); |
---|
128 | if ($auth == "mapbender") {require_once($mapbender);} |
---|
129 | include("alkisfkt.php"); |
---|
130 | ?> |
---|
131 | <!doctype html> |
---|
132 | <html lang="de"> |
---|
133 | <head> |
---|
134 | <meta charset="utf-8"> |
---|
135 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
---|
136 | <title>ALKIS Grundstücksnachweis</title> |
---|
137 | <link rel="stylesheet" type="text/css" href="alkisauszug.css"> |
---|
138 | <link rel="shortcut icon" type="image/x-icon" href="ico/Grundstueck.ico"> |
---|
139 | <script> |
---|
140 | function ALKISexport(gmlid) { |
---|
141 | window.open('alkisexport.php?gkz=<?php echo $gkz;?>&tabtyp=buchung&gmlid=' + gmlid); |
---|
142 | } |
---|
143 | </script> |
---|
144 | </head> |
---|
145 | <body> |
---|
146 | <?php |
---|
147 | if ($nodebug == "j") {$debug=0;} |
---|
148 | $con = pg_connect($dbconn." options='--application_name=ALKIS-Auskunft_alkisgsnw.php'"); |
---|
149 | if (!$con) echo "\n<p class='err'>Fehler beim Verbinden der DB</p>"; |
---|
150 | |
---|
151 | $gmlid_p=$gmlid; // Wert aus Parameter merken |
---|
152 | $gerooted=true; // Auskunft beginnt mit dienendem GrundstÃŒck |
---|
153 | $gmlid=get_GS_Daten($gmlid, $gskennz); // nachschauen |
---|
154 | $gml_anfrd=$gmlid; // ursprÃŒngliche Anforderung aus URL merken |
---|
155 | if ($gmlid == "") { // nix gefunden |
---|
156 | die("Kein Treffer"); |
---|
157 | } else { // Treffer |
---|
158 | if ($gsbart != "1100") { // Buchungsart "GrundstÃŒck" |
---|
159 | $gmlid_r=Back2theRoots($gmlid); |
---|
160 | if ($gmlid_r != $gmlid) { // wurde hoch gerÃŒckt |
---|
161 | $gmlid=get_GS_Daten($gmlid_r, ""); // damit weiter arbeiten |
---|
162 | } |
---|
163 | } |
---|
164 | } |
---|
165 | echo "<p class='gskennz'>ALKIS Grundstück ".$gsbez."-".rtrim($gsblatt)."-".$gslfdnr." </p>\n\n<h2>Grundstück</h2>"; // Balken |
---|
166 | |
---|
167 | if ($gerooted) { |
---|
168 | // F l u r s t u e c k e |
---|
169 | echo "\n<h3><img src='ico/Flurstueck.png' width='16' height='16' alt=''> Flurstücke</h3>" |
---|
170 | ."\n<table class='fs'>"; |
---|
171 | echo "\n<tr>" // Kopfzeile |
---|
172 | ."\n\t<td class='heads'>Gemarkung</td>" |
---|
173 | ."\n\t<td class='heads'>Flur</td>" |
---|
174 | ."\n\t<td class='heads fsnr' title='Flurstücksnummer (Zähler / Nenner)'><span class='wichtig'>Flurst.</span></td>" |
---|
175 | ."\n\t<td class='head flag'>Fläche</td>" |
---|
176 | ."\n\t<td class='head nwlink noprint' title='Verlinkung zu anderen Nachweis-Arten und verbundenen Objekten'>weitere Auskunft</td>" |
---|
177 | ."\n</tr>"; |
---|
178 | //+++ Lage oder Nutzung zum FS in eine zus. Spalte oder Zeile? |
---|
179 | //+++ 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. |
---|
180 | |
---|
181 | $sqlfs="SELECT g.gemarkungsnummer, g.bezeichnung, f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.amtlicheflaeche |
---|
182 | FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer |
---|
183 | WHERE f.istgebucht = $1 AND f.endet IS NULL AND g.endet IS NULL "; |
---|
184 | if ($filtgem == '' ) { // ungefiltert |
---|
185 | $v=array($gmlid); |
---|
186 | } else { |
---|
187 | $sqlfs.="AND f.gemeindezugehoerigkeit_kreis = $2 AND f.gemeindezugehoerigkeit_gemeinde = $3 "; // ZustÀndiges Gebiet |
---|
188 | $v=array($gmlid, $filtkreis, $filtgem); |
---|
189 | } |
---|
190 | $sqlfs.="ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;"; |
---|
191 | $resfs = pg_prepare("", $sqlfs); |
---|
192 | $resfs = pg_execute("", $v); |
---|
193 | if (!$resfs) {echo "\n<p class='err'>Fehler bei Flurstück</p>";} |
---|
194 | |
---|
195 | $j=0; |
---|
196 | $zpaar=false; |
---|
197 | while($rowfs = pg_fetch_assoc($resfs)) { |
---|
198 | $flur= $rowfs["flurnummer"]; |
---|
199 | $fskenn=$rowfs["zaehler"]; |
---|
200 | if ($rowfs["nenner"] != "") {$fskenn.="/".$rowfs["nenner"];} |
---|
201 | $flae=number_format($rowfs["amtlicheflaeche"],0,",",".") . " m²"; |
---|
202 | |
---|
203 | if ($zpaar) {$trclass='paa';} else {$trclass='unp';} // Farbwechsel |
---|
204 | $zpaar=!$zpaar; |
---|
205 | echo "\n<tr class='".$trclass."'>"; // eine Zeile je Flurstueck |
---|
206 | echo "\n\t<td>"; |
---|
207 | if ($showkey) {echo "<span class='key'>".$rowfs["gemarkungsnummer"]."</span> ";} |
---|
208 | echo $rowfs["bezeichnung"] |
---|
209 | ."</td>" |
---|
210 | ."\n\t<td>".$flur."</td>" |
---|
211 | ."\n\t<td class='fsnr'><span class='wichtig'>".$fskenn."</span></td>" |
---|
212 | ."\n\t<td class='fla'>".$flae."</td>" |
---|
213 | ."\n\t<td>\n\t\t<p class='nwlink noprint'>" |
---|
214 | ."\n\t\t\t<a href='alkisfsnw.php?gkz=".$gkz."&gmlid=".$rowfs["gml_id"]."&eig=n"; |
---|
215 | if ($showkey) {echo "&showkey=j";} |
---|
216 | echo "' title='Flurstücksnachweis'>Flurstück " |
---|
217 | ."<img src='ico/Flurstueck_Link.png' width='16' height='16' alt=''>" |
---|
218 | ."</a>\n\t\t</p>" |
---|
219 | ."\n\t</td>" |
---|
220 | ."\n</tr>"; |
---|
221 | $j++; |
---|
222 | } |
---|
223 | pg_free_result($resfs); |
---|
224 | 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>";} |
---|
225 | echo "\n</table>"; |
---|
226 | } else { // konnte nicht bis zur Basis aufsteigen |
---|
227 | echo "<p>Die angeforderte Buchung hat Rechte an mehreren anderen Buchungen." |
---|
228 | ."<br>Für die Anzeige der Flurstücke muss eine dieser Buchungen (Grundstück) gewählt werden.</p>"; |
---|
229 | // Auswahl anbieten? Sonst ÃŒber den Link "Bestand" recherchieren. |
---|
230 | } |
---|
231 | |
---|
232 | // Rechte anderer GS an diesem GS |
---|
233 | // Dieser Teil ist fast identisch mit "FlurstÃŒcksnachweis", Kommentare siehe dort. |
---|
234 | $bartgrp=""; |
---|
235 | $barttypgrp=""; |
---|
236 | echo "\n<table class='outer'>"; |
---|
237 | $stufe=1; |
---|
238 | $gezeigt=buchung_anzg($gmlid, "j", false, "", 2); |
---|
239 | $anzber=ber_bs_zaehl($gmlid); |
---|
240 | $verf_next = array($gmlid); |
---|
241 | while ($anzber > 0 ) { |
---|
242 | $verf_akt=$verf_next; |
---|
243 | $verf_next=array(); |
---|
244 | $stufe++; |
---|
245 | $i=0; |
---|
246 | foreach($verf_akt as $gml_ber_bs) { |
---|
247 | $i++; |
---|
248 | if (ber_bs_zaehl($gml_ber_bs) > 0) { |
---|
249 | $verf_neu=ber_bs_anzg($gml_ber_bs, "j", false, "", $gml_anfrd); |
---|
250 | $anz_neu=count($verf_neu); |
---|
251 | if ($anz_neu > 0) { |
---|
252 | $verf_next=array_merge($verf_next, $verf_neu); |
---|
253 | } |
---|
254 | } |
---|
255 | } |
---|
256 | $anzber=count($verf_next); |
---|
257 | } |
---|
258 | echo "\n</table>\n\n"; |
---|
259 | |
---|
260 | pg_close($con); |
---|
261 | echo <<<END |
---|
262 | <div class='buttonbereich noprint'> |
---|
263 | <hr> |
---|
264 | <a title="zurück" href='javascript:history.back()'><img src="ico/zurueck.png" width="16" height="16" alt="zurück"></a> |
---|
265 | <a title="Drucken" href='javascript:window.print()'><img src="ico/print.png" width="16" height="16" alt="Drucken"></a> |
---|
266 | END; |
---|
267 | if ($stufe < 3) { |
---|
268 | 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>"; |
---|
269 | } 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. |
---|
270 | 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'>"; |
---|
271 | } |
---|
272 | echo " \n</div>"; |
---|
273 | |
---|
274 | footer($gmlid, $_SERVER['PHP_SELF']."?", ""); |
---|
275 | ?> |
---|
276 | </body> |
---|
277 | </html> |
---|