source: trunk/mapbender/http/nav/alkisnav_eig.php @ 420

Revision 420, 27.3 KB checked in by frank.jaeger, 5 years ago (diff)

In der ALKIS-Navigation für Mapbender2 die Sortierung für Flurstücksnummer korrigiert. Mit Umstellung auf Full-Schema sind Zähler und Nenner Textfelder geworden. Sie wurden also nicht mehr "numerisch" sortiert.

RevLine 
[134]1<?php
[399]2/*      Navigation mit ALKIS-Daten im Mapbender 2 - Teil EigentÃŒmer-Suche
3        Datenbank-Struktur aus dem norGIS-ALKIS-Importer.
4Version vom
[376]5        2016-02-11 Version fÃŒr norGIS-ALKIS-Import aus Version Classic abgeleitet.
6        2016-03-02 $gemeinde auf feste LÀnge korrigieren
7        2016-07-18 Personendaten: Zeilen getauscht. Wie Brief-Anschrift.
8        2016-11-28 Gemeinsam genutzte Datenbanken ermöglichen
[399]9        2018-02-15 Strikte Input-Validation der Parameter
[405]10        2018-04-24 Geburtsdatum formatieren
[413]11        2018-11-12 Full-Schema
[420]12        2019-02-12 Sortierung FlurstÃŒcksnummer repariert
[134]13*/
[356]14
[399]15$cntget = extract($_GET);
[356]16
[399]17// Input-Validation
18// Parameter aus Konfiguration oder Links sollten keine "Eingabefehler" enthalten.
19// Entweder falsche Konfiguration oder Hack. Programm sofort abbrechen.
20if (!isset($gkz) or !preg_match('#^[0-9]{3}$#', $gkz)) {die("Eingabefehler gkz");} // Mandant, muss!
21
22if(isset($epsg)) { // SRS, kann. Wenn als Parameter ...
23        if (preg_match('#^EPSG:[0-9]{4,5}$#', $epsg)) { // Prefix aus MB-Mapframe
24                $epsg = str_replace("EPSG:", "" , $epsg);
25        } elseif (!preg_match('#^[0-9]{4,5}$#', $epsg)) { // nur die Nummer
26                die("Eingabefehler epsg");
27        }
28} else { // Nichts ÃŒbergeben
29        $epsg=$gui_epsg; // dann default aus Conf
30}
31
32// Filter-Parameter fÃŒr Gemeindenummer in Kreis-Datenbank aus der Mapbender GUI-Konfiguration
33if (isset($gemeinde) AND trim($gemeinde, '0') != "") {
34        if (!preg_match('#^[0-9]{1,3}$#', $gemeinde)) {die("Eingabefehler Gemeinde");}
35        $gemeinde=str_pad($gemeinde, 3, "0", STR_PAD_LEFT);
36        if(strpos($gemeinde, ",") === false) {
37                $gfilter = 1; // Einzelwert
38        } else {
39                $gfilter = 2; // Liste
40        }
41} else { // Kein Filter
42        $gemeinde = "";
43        $gfilter = 0;
44}
45if (isset($blattgml) and $blattgml != "" ) {
46        if (!preg_match('#^[0-9a-zA-Z]{16}$#', $blattgml)) {die("Eingabefehler GML-ID Blatt");}
47} else {
48        $blattgml="";
49}
50if (isset($person) and $person != "" ) {
51        if (!preg_match('#^[0-9a-zA-Z]{16}$#', $person)) {die("Eingabefehler GML-ID Person");}
52} else {
53        $person="";
54}
55if (isset($gbkennz) and $gbkennz != "" ) { // gggg-bbbbbbA-0001
56        if (!preg_match('#^[0-9A-E -]{4,17}$#', $gbkennz)) {die("Eingabefehler Grundbuch-Kennzeichen");}
57} else {
58        $gbkennz="";
59}
60
[278]61include("../../conf/alkisnav_conf.php"); // Konfigurations-Einstellungen
62include("alkisnav_fkt.php"); // Funktionen
[376]63$con = pg_connect ($dbconn) or die ("<p class='err'>Fehler bei der Verbindung zur Datenbank</p>".$dbpre.$dbgkz);
[356]64
[278]65echo <<<END
[376]66<!doctype html>
67<html lang="de">
[134]68<head>
69        <meta http-equiv="cache-control" content="no-cache">
70        <meta http-equiv="pragma" content="no-cache">
71        <meta http-equiv="expires" content="0">
[376]72        <meta charset="utf-8">
[134]73        <title>ALKIS-Suche Eigent&uuml;mer</title>
[129]74        <link rel="stylesheet" type="text/css" href="alkisnav.css">
75        <script type="text/javascript">
76                function imFenster(dieURL) {
77                        var link = encodeURI(dieURL);
78                        window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
79                }
[278]80                function transtitle(trans) {
81                        document.getElementById('transaktiontitle').innerHTML = trans;
82                }
[134]83        </script>
84</head>
[66]85<body>
[280]86<a href='javascript:history.back()'>
[356]87        <img src="ico/zurueck.png" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
88</a>&nbsp;
89<span title='zuletzt ausgef&uuml;hrte Aktion'>
90        <dfn class='title' id='transaktiontitle'></dfn>
91</span>
[66]92
[278]93END;
[134]94
[278]95function familiensuche() {
[374]96        // Einen Link generieren, um nach anderen Personen mit gleichem Familiennamen (Nachnamen) zu suchen.
[399]97        // Bei versehendlich falschem Vornamen muss somit nicht von vorn begonnen werden.
[282]98        global $gkz, $gemeinde, $epsg, $name;
[399]99        $lnknam=urlencode(substr($name,0,50));
100        $dspnam=htmlentities($name, ENT_QUOTES, "UTF-8");
101        if(isset($name)) {
102                echo "\n<div class='back' title='Andere Personen mit diesem Nachnamen'>"
103                        ."\n\t\t<img class='nwlink' src='ico/Eigentuemer_2.png' width='16' height='16' alt='FAM' title='Andere Personen mit diesem Nachnamen'> "
104                        ."\n<a class='back' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;name=".$lnknam."'>\"".$dspnam."\"</a>"
105                ."\n</div>\n<br>";     
[278]106        }
107        return;
108}
109
[374]110function personendaten() {
111        // Adresse und Geburtsdatum der aktuellen Person ausgeben
[278]112        global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $auskpath; // $debug
[405]113        $sql ="SELECT p.nachnameoderfirma, p.vorname, to_char(cast(p.geburtsdatum AS date),'DD.MM.YYYY') AS geburtsdatum, p.namensbestandteil, "
[399]114        ."a.ort_post, a.postleitzahlpostzustellung AS plz, a.strasse, a.hausnummer "
115        ."FROM ax_person p LEFT JOIN ax_anschrift a ON a.gml_id=ANY(p.hat) "
116        ."WHERE p.gml_id= $1 AND p.endet IS NULL AND a.endet IS NULL LIMIT 1;";
[374]117        // Es wird nur EINE Zeile ausgewertet
[330]118
[278]119        $v=array($person);
120        $res=pg_prepare("", $sql);
121        $res=pg_execute("", $v);
[282]122        if (!$res) {echo "\n<p class='err'>Fehler bei Name</p>\n";}
[283]123        $row = pg_fetch_array($res);
[374]124
[283]125        $zeil1=$row["nachnameoderfirma"].", ".$row["vorname"];
126        $gebdat=$row["geburtsdatum"];
127        if ($gebdat != "") {$zeil1.= ", geb. ".$gebdat;}
128        $best=$row["namensbestandteil"];
129        if ($best != "") {$zeil1.= ", ".$best;}
130        $zeil1=htmlentities($zeil1, ENT_QUOTES, "UTF-8");
[374]131        $zeil2= trim($row["strasse"]." ".$row["hausnummer"]);
[283]132        if ($zeil2 != "") {
[374]133                $zeil2= "\n\t<br>".htmlentities($zeil2, ENT_QUOTES, "UTF-8");
[283]134        }
[374]135        $zeil3=trim($row["plz"]." ".$row["ort_post"]);
[283]136        if ($zeil3 != "") {
[374]137                $zeil3="\n\t<br>".htmlentities($zeil3, ENT_QUOTES, "UTF-8");
[283]138        }
139
140// Tabelle: Sp.1=Icon, Link zur Auskunft Person, Sp.2=Rahmen
[374]141        echo "
[283]142<div class='pe aktuell'>
143<table>
144<tr>
145        <td valign='top'>
146                <a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisnamstruk.php?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;gmlid=".$person."\")'>
[356]147                        <img class='nwlink' src='ico/Eigentuemer.png' width='16' height='16' alt='EIG' title='Nachweis'>
[283]148                </a>
149        </td>
150        <td>
151                <p class='nam'>".$zeil1.$zeil2.$zeil3."</p>
152        </td>
153</tr>
154</table>
155</div>";
[374]156        return;
[278]157}
158
[66]159function getEigByName() {
[282]160        // 1 // Eigentuemer nach Name(-nsanfang)
[374]161        global $gkz, $debug, $gemeinde, $epsg, $name, $person, $gfilter;
[278]162        $linelimit=150;
[135]163        $arr = explode(",", $name);
[356]164        $name0 = trim($arr[0]); // Nachname
165        if (count($arr) > 1) {
166                $name1=trim($arr[1]);   // Vorname
167        } else {
168                $name1="";
169        }
[134]170        if(preg_match("/\*/",$name0)){
171                $match = trim(preg_replace("/\*/i","%", strtoupper($name0)));
172        } else {
173                $match = trim($name0)."%";
[66]174        }       
[134]175        if(preg_match("/\*/",$name1)){
176                $match1 = trim(preg_replace("/\*/i","%", strtoupper($name1)));
177        } else {
178                $match1 = trim($name1)."%";
[374]179        }
180       
[140]181        $sql ="SELECT p.nachnameoderfirma, p.vorname, p.gml_id FROM ax_person p ";
[374]182
183// Der Filter auf "Gemeinde" bleibt hier zunÀchst unberÌcksichtigt, bis im NorGIS-ALKIS-Importer ein Ersatz
184// geschaffen wurde fÃŒr die Tabelle "gemeinde_person" aus dem Post-Processing der "klassischen" Datenstruktur.
185// Es können somit Personen gefunden werden, die kein GrundstÌck im berechtigten Bereich haben.
186// Wenn eine Gemeinde-DB aus eigenem NBA geladen wurde, ist das unkritisch.
187// Wenn eine Gemeinde aus einer kreisweiten DB beauskunftet wird, ist das so noch nicht einsetzbar.
188
189/*      if ($gfilter > 0) {
[334]190                $sql.="JOIN gemeinde_person g ON p.gml_id=g.person WHERE p.endet IS NULL AND ";
[140]191                switch ($gfilter) {
[330]192                        case 1: // Einzel
193                                $sql.="g.gemeinde='".$gemeinde."' AND "; break;
[140]194                        case 2: // Liste
[330]195                                $sql.="g.gemeinde in ('".str_replace(",", "','", $gemeinde)."') AND "; break;
[140]196                }
[374]197        } else { */
[334]198                $sql.="WHERE p.endet IS NULL AND ";
[374]199//      }
200
[134]201        if($match1 != '%'){
[399]202                $sql.="nachnameoderfirma ILIKE $1 AND p.vorname ILIKE $2 "
203                ."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $3 ;";
[134]204                $v=array($match, $match1, $linelimit);
205        }else{
[399]206                $sql.="nachnameoderfirma ILIKE $1 "
207                ."ORDER BY p.nachnameoderfirma, p.vorname LIMIT $2 ;";
[134]208                $v=array($match, $linelimit);
209        }
[66]210        $res=pg_prepare("", $sql);
211        $res=pg_execute("", $v);
212        if (!$res) {
213                echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";
[374]214                if ($debug > 2) {echo "<p class='dbg'>SQL=<br>".$sql."<br>$1='".$match."'</p>";}
[66]215                return;
216        }
[134]217        $cnt = 0;
[66]218        while($row = pg_fetch_array($res)) {
[282]219                $nachname=$row["nachnameoderfirma"];
220                $vorname=$row["vorname"];
221                $persongml=$row["gml_id"];
[283]222                zeile_person($persongml, $nachname, $vorname);
[134]223                $cnt++;
224        }
[66]225        if($cnt == 0){
[278]226                echo "\n<p class='anz'>Kein Eigent&uuml;mer gefunden.</p>";
227        } elseif($cnt >= $linelimit) { // das Limit war zu knapp
228                echo "\n<p class='anz' title='Bitte den Namen eindeutiger qualifizieren'>... und weitere</p>";
[66]229        } elseif($cnt == 1){ // Eindeutig!
[282]230                $person = $persongml;
[399]231                $name = $nachname; // familiensuche() verwendet sonst den Suchbegriff
[278]232        } else {
233                echo "\n<p class='anz'>".$cnt." Eigent&uuml;mer mit '".$name."'</p>";   // im Limit
[66]234        }
[134]235        return;
[66]236}
237
238function getGBbyPerson() {
[282]239        // 2 // GrundbÃŒcher zur gewÀhlten Person
[278]240// Es wird in dieser Function nicht geprÃŒft, ob die gefundenen GrundbÃŒcher auch FlurstÃŒcke
[374]241// haben, die im gefilterten Bereich (Gemeinde) liegen. Es können daher "Sackgassen" entstehen,
[278]242// also GrundbÌcher, die in der nÀchsten Stufe bei Filterung nicht zu Treffern fÌhren.
[374]243// Das Joinen bis zum FS unter BerÌcksichtigung von speziellen Buchungen ist aber zu aufwÀndig.
[278]244// Dann kann entweder das FS gleich mit ausgegeben werden -> getGBuFSbyPerson.
245// Alternativ wÌrde eine Hilfstabelle benötigt, in der im PostProcessing
246// das GB-zu-Gemeinde-VerhÀltnis vorbereitet wird.
[284]247        global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $debug, $bltbez, $bltblatt, $bltseite, $kennztyp, $zgbbez;
[278]248        $linelimit=150;
[284]249
250        // Head
[278]251        familiensuche();
252        personendaten();
[284]253
254        // Body
[66]255        // Suche nach GrundbÃŒchern der Person
[399]256        $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
257        ."FROM ax_namensnummer n JOIN ax_buchungsblatt gb ON n.istbestandteilvon=gb.gml_id "
258        ."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
259        ."WHERE n.bennennt = $1 AND n.endet IS NULL AND gb.endet IS NULL AND b.endet IS NULL;";
[284]260
261        // Parameter $gbkennz, z.B. nach Klick auf Zeile "Bezirk"
[330]262        if ($kennztyp > 1) { // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
[284]263                #if ($debug > 0) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
[330]264                $sql.="AND b.bezirk='".$zgbbez."' ";
[284]265                $bezirkaktuell = true;
266        } else {
267                $bezirkaktuell = false;
268        }
269
[278]270        if ($bltbez.$bltblatt != "") { // BlÀttern, Fortsetzen bei ...
271                $sql.="AND ((b.bezeichnung > '".$bltbez."') ";
272                $sql.="OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."')) ";
273        }
[284]274
[278]275        $sql.="ORDER BY b.bezeichnung, gb.buchungsblattnummermitbuchstabenerweiterung LIMIT $2 ;";
276
277        if ($bltseite == "") { // Seite 1
278                $bltseite = 1;
279        } else { // Folgeseite
280                echo "\n<p class='ein'>Teil ".$bltseite;
281        }
[339]282        $v=array($person, $linelimit);
[66]283        $res=pg_prepare("", $sql);
284        $res=pg_execute("", $v);
285        if (!$res) {
286                echo "\n<p class='err'>Fehler bei Grundbuch</p>";
287                return;
288        }
289        $cnt = 0;
[284]290        $gwbez="";
[66]291        while($row = pg_fetch_array($res)) {
[284]292                $beznr=$row["bezirk"];
293                if ($gwbez != $beznr) { // Gruppenwechsel Bezirk
294                        $beznam=$row["beznam"];
295                        $gwbez=$beznr;
296                        zeile_gbbez ($beznam, $beznr, $bezirkaktuell);
297                }
[66]298                $gml=$row["gml_g"];
[278]299                $blatt=$row["blatt"];
[374]300                zeile_blatt($zgbbez, "", $gml, $blatt, false, $person, false);
[134]301                $cnt++;
302        }
[334]303/*      if ($cnt == 0) { // Nur Entwicklg.
304                if ($debug > 1) {echo "\n<p class='err'>keine Buchung</p>";}
[339]305                if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."',<br>$1 = '".$person."'<p>";}
[334]306        } */
307
[284]308        // Foot
[278]309        if($cnt == 0) {
310                echo "\n<p class='anz'>Kein Grundbuch zum Eigent&uuml;mer</p>";
[66]311        } elseif($cnt >= $linelimit) {
[278]312                echo "\n<p class='blt'>".$cnt." Grundb. zum Eigent.";
[284]313
314                // BlÀttern
[278]315                $nxtbltbez=urlencode($beznam);
316                $nxtbltblatt=urlencode($blatt);
317                $nxtbltseite=$bltseite + 1;
[399]318                echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltseite=".$nxtbltseite."' "
319                ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt."'>weitere</a>"
320                ."</p>";
[278]321        } elseif($cnt == 1) { // Eindeutig!
322                $blattgml=$gml; // dann Stufe 3 gleich nachschieben
323        } else {
324                echo "\n<p class='anz'>".$cnt." Grundb&uuml;cher zum Eigent&uuml;mer</p>";
[66]325        }
326        return;
327}
[278]328
[66]329function getFSbyGB($backlink) {
[282]330        // 3 // FlurstÃŒcke zum Grundbuch
[278]331// Zu einem Grundbuch (gml_id als Parameter) werden alle darauf gebuchten FlurstÃŒcke gesucht.
332// Im ersten Schritt sind das direkt gebuchten FlurstÃŒcke.
333// Im zweiten Schritt wird gesucht nach Rechten einer Buchungstelle des durchsuchten Blattes an anderen
[282]334// Buchungstellen.
335        global $gkz, $gemeinde, $name, $person, $blattgml, $epsg, $gfilter, $debug;
[278]336        if($backlink) { // Erneuter Ansatz bei Person oder GB möglich.
[284]337
[278]338                // Namen ermitteln
[334]339                $sql ="SELECT nachnameoderfirma, vorname FROM ax_person WHERE gml_id = $1 AND endet IS NULL;";
[278]340                $v=array($person);
341                $res=pg_prepare("", $sql);
342                $res=pg_execute("", $v);
[282]343                if (!$res) {echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>";}
[278]344                $row = pg_fetch_array($res); // nur eine Zeile
[284]345                zeile_person($person, $row["nachnameoderfirma"], $row["vorname"]);
[282]346
[278]347                // Grundbuch-Daten ermitteln
[399]348                $sql ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam "
349                ."FROM ax_buchungsblatt gb JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
350                ."WHERE gb.gml_id= $1 AND gb.endet IS NULL and b.endet IS NULL LIMIT 1 ;";
[278]351                $v=array($blattgml);
352                $res=pg_prepare("", $sql);
353                $res=pg_execute("", $v);
[282]354                if (!$res) {echo "\n<p class='err'>Fehler bei Grundbuch</p>";}
355                $row = pg_fetch_array($res); // eine Zeile
[278]356                $gml=$row["gml_g"];
[282]357                $bezirk=$row["bezirk"];
[278]358                $beznam=$row["beznam"];
359                $blatt=$row["blatt"];
[284]360                zeile_gbbez ($beznam, $bezirk, false);
[374]361                zeile_blatt($bezirk, "", $blattgml, $blatt, false, $person, true);     
[66]362        }
[284]363        GB_Buchung_FS(250, ""); // Blatt > Grundst. > FS, max. 250, ohne Link "Buchung"
[278]364        return;
365}
366
367function getGBuFSbyPerson() {
[282]368        // 2 + 3 // GrundbÃŒcher UND FlurstÃŒcke zur gewÀhlten Person
[278]369// Dies ist die Kombination von Stufe 2 (GrundbÃŒcher zur Person) und 3 (FlurstÃŒcke zum Grundbuch)
370// in einem einzelnen Schritt. Wenn auf Gemeinde gefiltert wird, dann können in Stufe 2 (noch ohne Filter)
371// auch GrundbÃŒcher gefunden werden, die dann auf Stufe 3 (mit Filter) keine FS liefern ("Sackgasse"!).
372// Wenn aber per JOIN "GB -> FS -> Gemarkung -> Gemeinde" geprÌft wird, dann können
373// die Daten ja auch gleich ausgegeben werden.
374// FÌr FÀlle in denen nicht nach Gemeinde gefiltert wird (z.B. ganzer Kreis) kann weiter
375// Stufe 2 und 3 nacheinander verwendet werden. Dies ist wahrscheinlich ÃŒbersichtlicher,
376// weil "ungefiltert" in "2+3" zu lange Listen entstehen wÌrden, die durchblÀttert werden mÌssen.
[330]377
[284]378        global $gkz, $gemeinde, $epsg, $name, $person, $blattgml, $gfilter, $debug, $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht, $kennztyp, $zgbbez;
[278]379        $linelimit=80; // als Limit "Anzahl FlurstÃŒcke" in den beiden folgenden Abfragen
380        // darf nun etwas knapper sein, weil man jetzt blÀttern kann
381        familiensuche();
382        personendaten();
383
[330]384        // Wenn das Limit ÃŒberschritten wurde: zusÀtzliche Parameter "blt"=BlÀttern:
385        // - $bltbez   = Bezirk-Name 
386        // - $bltblatt = BlattMitBuchstabe
387        // - $bltbvnr  = lfd.Nr der Buchungsstelle
388        // - $bltseite = fortlaufende Seiten-Nr
389        // - $bltrecht = "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung
[278]390
[140]391        // SQL-Bausteine vorbereiten
[330]392        //  Direkte Buchungen suchen mit:  $sql1 + $sqla1 + $sql2
393        //  SonderfÀlle suchen mit:        $sql1 + $sqla2 + $sql2
[278]394
[330]395        // Baustein 1: SQL-Anfang fuer beide Varianten
[399]396        $sql1 ="SELECT gb.gml_id AS gml_g, gb.buchungsblattnummermitbuchstabenerweiterung as blatt, b.bezirk, b.bezeichnung AS beznam, "
[413]397        ."s1.gml_id as bsgml, s1.laufendenummer AS lfd, f.gml_id, f.flurnummer, f.zaehler, f.nenner, ot.gemashl, trim(trailing from ot.gemarkung) AS gemarkungsname, "; // f.gemeindezugehoerigkeit_gemeinde,
[86]398        if($epsg == "25832") { // Transform nicht notwendig
[399]399                $sql1.="st_x(st_centroid(f.wkb_geometry)) AS x, st_y(st_centroid(f.wkb_geometry)) AS y ";
[86]400        } else { 
[399]401                $sql1.="st_x(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS x, "
402                        ."st_y(st_transform(st_centroid(f.wkb_geometry), ".$epsg.")) AS y ";                   
[86]403        }
[66]404
[330]405        // NamenNummer >istbestandteilvon> buchungsblatt <istbestandteilvon< buchungsstelle-1
[399]406        $sql1.="FROM ax_namensnummer nn "
407        ."JOIN ax_buchungsblatt gb ON gb.gml_id=nn.istbestandteilvon "
408        ."JOIN ax_buchungsblattbezirk b ON gb.land=b.land AND gb.bezirk=b.bezirk "
409        ."JOIN ax_buchungsstelle s1 ON gb.gml_id=s1.istbestandteilvon ";
[140]410
[330]411        // Baustein A: Auswahl 1 oder 2
412        // buchungsstelle-1 <istGebucht< FS
[339]413        $sqla1 ="JOIN ax_flurstueck f ON s1.gml_id=f.istgebucht ";
[140]414
[330]415        // buchungsStelle1 (herr.) >an> buchungsStelle2 (dien.) <istGebucht< FS
[399]416        $sqla2 ="JOIN ax_buchungsstelle s2 ON s2.gml_id=ANY(s1.an) "
417                ."JOIN ax_flurstueck f ON s2.gml_id=f.istgebucht ";
[284]418
[330]419        // Baustein 2: SQL-Ende fuer beide Varianten
[399]420        $sql2 ="JOIN gema_shl ot ON f.land || f.gemarkungsnummer = ot.gemashl "  // Ortsteil
421                ."WHERE nn.benennt = $1 AND nn.endet IS NULL AND gb.endet IS NULL AND s1.endet IS NULL AND f.endet IS NULL ";
[334]422        $sqlw2="AND s2.endet IS NULL ";
423
[284]424        // Parameter $gbkennz nach Klick auf Zeile "Bezirk"
[330]425        if ($kennztyp > 1) { // 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
[284]426                #if ($debug > 0) {echo "<p class='dbg'>Filter Bezirk '".$zgbbez."'<p>";}
[333]427                $sql2.="AND b.bezirk = '".$zgbbez."' ";
[284]428                $bezirkaktuell = true;
429        } else {
430                $bezirkaktuell = false;
431        }
432
[278]433        switch ($gfilter) { // Gemeinde-Filter
434                case 1: // Einzelwert
[374]435                        $sql2.="AND substring(ot.gemshl from 6 for 3)='".$gemeinde."' "; break;
[278]436                case 2: // Liste
[374]437                        $sql2.="AND substring(ot.gemshl from 6 for 3) in ('".str_replace(",", "','", $gemeinde)."') "; break;
[140]438        }
[374]439
[420]440        $sql3 ="ORDER BY b.bezirk, gb.buchungsblattnummermitbuchstabenerweiterung, cast(s1.laufendenummer AS integer), f.gemarkungsnummer, f.flurnummer, cast(f.zaehler AS integer), cast(f.nenner AS integer) LIMIT $2 ;";
[278]441        // Sortier-Problem: laufendenummer in varchar linksbÃŒndig
[140]442
[278]443        // Die Bausteine in 2 Varianten kombinieren
[140]444
[278]445        // BlÀttern mit folgenden Parametern: $bltbez, $bltblatt, $bltbvnr, $bltseite, $bltrecht
[356]446        if ($bltbez.$bltblatt.$bltbvnr == "") {
447                $bltwhere ="";
448        } else { // BlÀttern, Fortsetzen bei ...
[399]449                $bltwhere ="AND ((b.bezeichnung > '".$bltbez."') "
450                        ."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung > '".$bltblatt."') "
451                        ."OR (b.bezeichnung = '".$bltbez."' AND gb.buchungsblattnummermitbuchstabenerweiterung = '".$bltblatt."' AND cast(s1.laufendenummer AS integer) >= ".$bltbvnr." )) ";
[282]452        } // FlurstÃŒcke in der angeblÀtterten BVNR werden ggf. wiederholt
[278]453
454        if ($bltseite == "") { // auf Seite 1 beide Teile ausgegeben
455                $bltseite = 1;
456        } else { // Folgegeseite: nur Teil 1 *oder* 2
457                echo "\n<p class='ein'>Teil ".$bltseite." - ";
458                switch ($bltrecht) {
459                        case "nur":
460                                echo "nur Rechte an .. Buchungen</p>"; break;
461                        case "ohne":
462                                echo "nur direkte Buchungen</p>"; break;
463                        default:
464                                echo "</p>"; break;
[140]465                }
466        }
467
[278]468        // FÀlle ohne "Rechte an"
469        if ($bltrecht != "nur") { // "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung
[330]470                // Blatt <istBestandteilVon<  Buchungsstelle <istGebucht< Flurstck.
[278]471                $sql=$sql1.$sqla1.$sql2.$bltwhere.$sql3; // Direkte Buchungen
[333]472
[339]473                $v=array($person, $linelimit);
[278]474                $res=pg_prepare("", $sql);
475                $res=pg_execute("", $v);
476                if (!$res) {
477                        echo "\n<p class='err'>Fehler bei Buchung und Flurst&uuml;ck.</p>";
[339]478                        if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."', $1 = '".$person."'<p>";}
[278]479                        return;
480                }
[330]481
[278]482                $zfs1=0;
[283]483                $gwbez="";
484                while($row = pg_fetch_array($res)) {
485                        $bezirk=$row["bezirk"];
486                        if ($gwbez != $bezirk) { // Gruppierung Bezirk
487                                $gwbez=$bezirk;
488                                $beznam=$row["beznam"];
489                                $gwgb="";
[284]490                                zeile_gbbez($beznam, $gwbez, $bezirkaktuell);
[283]491                        }
[278]492                        $gb_gml=$row["gml_g"];
[282]493                        if ($gwgb != $gb_gml) { // Gruppierung Blatt (Grundbuch)
[278]494                                $blatt=$row["blatt"];
[374]495                        //      zeile_blatt($bezirk, $beznam, $gb_gml, $blatt, false, $person, false);
496                                zeile_blatt($bezirk, "", $gb_gml, $blatt, false, $person, false);
[278]497                                $gwgb = $gb_gml;        // Steuerg GW GB
498                                $gwbv = "";             // Steuerg GW BVNR
499                        }
500                        $bvnr=$row["lfd"];
[282]501                        if ($gwbv != $bvnr) { // Gruppierung Buchung (BVNR)
502                                $gwbv = $bvnr;
[283]503                                $bsgml=$row["bsgml"];
[284]504                                zeile_buchung($bsgml, $bvnr, "", false, false); //ohne Link
[278]505                        }
506                        $fs_gml=$row["gml_id"];
507                        $gmkg=$row["gemarkungsname"];
508                        $flur=$row["flurnummer"];
509                        $fskenn=$row["zaehler"];
510                        if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];} // BruchNr
[283]511                        zeile_flurstueck($fs_gml, $fskenn, $row["x"], $row["y"], $gmkg, $flur, false);
[278]512                        $zfs1++;
513                }
[374]514
[278]515                if($zfs1 == 0) {
[282]516                        if ($bltrecht == "ohne") {echo "\n<p class='anz'>Keine direkte Buchung gefunden.</p>";}
[374]517                        /* nur Entw.
518                        if ($debug > 1) {
519                                echo "\n<p class='dbg'>Keine direkte Buchung gefunden.</p>";
520                                if ($debug > 2) {echo "<p class='err'>SQL = '".$sql."', $1 = '".$person."'<p>";}
521                        } */
[284]522                } elseif($zfs1 >= $linelimit) { // das Limit war zu knapp
523                        echo "\n<p class='blt'>";
524                        if ($bltseite > 1) {echo "weitere ";}
525                        echo $zfs1." Flurst&uuml;cke";
[330]526
[284]527                        // B l À t t e r n  (eine Folgeseite anbieten)
[278]528                        $nxtbltbez=urlencode($beznam);
529                        $nxtbltblatt=urlencode($blatt);
530                        $nxtbltseite=$bltseite + 1;
[399]531                        echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person
532                        ."&amp;gbkennz=".$zgbbez // Filter Bezirk
533                        ."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=ohne' "
534                        ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"
535                        ."</p>";
[284]536                } elseif($zfs1 > 1) { // Meldung (Plural) ab 2, im Limit
537                        echo "\n<p class='anz'>";
538                        if ($bltseite > 1) {echo "weitere ";}
539                        echo $zfs1;
540                        if ($kennztyp > 1) {
541                                echo " Flurst. zum Eigent. im GB-Bezirk</p>";
542                        } else {
543                                echo " Flurst&uuml;cke zum Eigent&uuml;mer</p>";
544                        }
[278]545                }
[374]546        }
547
[278]548        if ($bltrecht == "" and $zfs1 > 0) { // beides
549                echo "<hr>"; // dann Trenner
[66]550        }
[140]551
[278]552        // FÀlle mit "Rechte an"
553        if ($bltrecht != "ohne") { // "nur"/"ohne" liefert nur den abgebrochene Teil der Auflistung
554                // Zweite Abfrage (Variante) aus den Bausteinen zusammen bauen
[330]555                // buchungsStelle2 <an< buchungsStelle1
[334]556                $sql=$sql1.$sqla2.$sql2.$bltwhere.$sqlw2.$sql3; // Rechte an
[339]557                $v=array($person, $linelimit);
[278]558                $res=pg_prepare("", $sql);
559                $res=pg_execute("", $v);
560                if (!$res) {
561                        echo "\n<p class='err'>Fehler bei Recht an Buchung.</p>";
562                        return;
563                }
564                $zfs2=0;
[284]565                $gwbez="";
[278]566                while($row = pg_fetch_array($res)) {   
[284]567                        $bezirk=$row["bezirk"];
568                        if ($gwbez != $bezirk) { // Gruppierung Bezirk
569                                $gwbez=$bezirk;
570                                $beznam=$row["beznam"];
571                                $gwgb="";
572                                zeile_gbbez($beznam, $gwbez, $bezirkaktuell);
573                        }
[278]574                        $gb_gml=$row["gml_g"];
[282]575                        if ($gwgb != $gb_gml) {  // Gruppierung Blatt (Grundbuch)
[278]576                                $beznam=$row["beznam"];
577                                $blatt=$row["blatt"];
[374]578                                zeile_blatt ($bezirk, "", $gb_gml, $blatt, false, $person, false);
[278]579                                $gwgb = $gb_gml;        // Steuerg GW GB
580                                $gwbv = "";             // Steuerg GW BVNR
581                        }
582                        $bvnr=$row["lfd"];
[282]583                        if ($gwbv != $bvnr) { // Gruppierung Buchungs (BVNR)
584                                $gwbv = $bvnr;
[283]585                                $bsgml=$row["bsgml"];
[330]586                                zeile_buchung($bsgml, $bvnr, "", true, false); // Recht an ... // ohne Link!
[278]587                        }
588                        $fs_gml=$row["gml_id"];
589                        $gmkg=$row["gemarkungsname"];
590                        $flur=$row["flurnummer"];
591                        $fskenn=$row["zaehler"];
[282]592                        if ($row["nenner"] != "") {$fskenn.="/".$row["nenner"];}
[278]593                        $x=$row["x"];
594                        $y=$row["y"];
[283]595                        zeile_flurstueck ($fs_gml, $fskenn, $x, $y, $gmkg, $flur, false);
[278]596                        $zfs2++;
597                }
598                if($zfs2 == 0) {
599                        if ($zfs1 == 0 or $bltrecht == "nur") { // keine Meldung wenn schon in Teil 1 eine Ausgabe
600                                echo "\n<p class='anz'>Keine Rechte an Buchungen.</p>";
601                        }
602                } elseif($zfs2 >= $linelimit) { // das Limit war zu knapp, das  B l À t t e r n  anbieten
[284]603                        echo "\n<p class='blt'>";
604                        if ($bltseite > 1) {echo "weitere ";}
605                        echo $zfs2." Rechte an Flurst.";
[278]606                        $nxtbltbez=urlencode($beznam);
607                        $nxtbltblatt=urlencode($blatt);
608                        $nxtbltseite=$bltseite + 1;
[399]609                        echo "\n - <a class='blt' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;person=".$person
610                        ."&amp;gbkennz=".$zgbbez // Filter Bezirk
611                        ."&amp;bltbez=".$nxtbltbez."&amp;bltblatt=".$nxtbltblatt."&amp;bltbvnr=".$bvnr."&amp;bltseite=".$nxtbltseite."&amp;bltrecht=nur' "
612                        ."title='Bl&auml;ttern ab ".htmlentities($beznam)." Blatt ".$blatt." BVNR ".$bvnr."'>weitere</a>"
613                        ."</p>";
[278]614                } elseif($zfs2 > 1) { // ab 2
[284]615                        echo "\n<p class='anz'>";
616                        if ($bltseite > 1) {echo "weitere ";}
617                        echo $zfs2." Rechte an Flurst.</p>"; // im Limit               
[278]618                }
619        } // ENDE FÀlle mit "Rechte an"
[66]620        return;
621}
622
623// ===========
624// Start hier!
625// ===========
626// Parameter: 
627// 1. name   = Suche nach Namensanfang oder -bestandteil.
628// 2. person = gml_id der Person      -> Suche nach GrundbÃŒchern
629// 3. gb     = gml_id des Grundbuches -> Suche nach FlurstÃŒcken
[278]630
[399]631// Validation: Eingabefeld aus Formular. Wird aber auch an Link angehÀngt (LÀnge!)
632// Suchbegriff (EigentÃŒmer)
633// Hier formatierte Meldung und html-Foot.
634if (isset($name) and $name != "" ) {
635        if (!preg_match('#^[a-zA-Z0-9ÀöÌÄÖÜß*,. \-&/]{1,50}$#', $name)) {
636                echo "<p class='err'>Eingabe unzul&auml;ssig!</p>";
637        //      if ($debug > 1) {echo "<p class='err'>Name='".$name."' LÀnge='".strlen($name)."</p>";}
638                $name="";
639        }
[66]640} else {
[399]641        $name="";
[66]642}
[330]643
[399]644$kennztyp=ZerlegungGBKennz($gbkennz); // Grundbuch-Kennzeichen aus Parameter zerlegen
[284]645// 2=Such Bezirk-Nummer, 3=Such Blatt, 4=Such Buchung BVNR
[66]646
[278]647// Quo Vadis?
[315]648if($blattgml != "") { // FlurstÃŒcke zum Grundbuch
[278]649
[66]650        // Das Programm hat sich selbst verlinkt aus einer Liste der GB zu einem EigentÃŒmer.
651        // Wenn Parameter mitgegeben wurden, können diese fÃŒr einen "Link zurÃŒck" verwendet werden.
[278]652        $trans="Flurst&uuml;cke zum Grundbuch";
[315]653        getFSbyGB(true); // mit BackLink
[278]654
[315]655} elseif($person != "") { // GrundbÃŒcher zur Person
[66]656        // Das Programm hat sich selbst verlinkt aus einer Liste der Personen zu einer Suchmaske.
[330]657        //if ($debug >= 2) {echo "\n<p class='dbg'>Gemeinde-Filter-Steuerung = '".$gfilter."'</p>";}
[278]658
659        // Die Filtereinstellung beeinflusst die Such-Strategie:
[315]660        if ($gfilter == 0) { // Keine Filterung auf "Gemeinde": große Datenmenge
[284]661                if ($kennztyp > 1) {
662                        $trans = "Grundb&uuml;cher in ".$zgbbez." von .."; // Filter GB-Bez
663                } else {
664                        $trans = "Grundb&uuml;cher von .."; // Name steht darunter
665                }
[278]666                getGBbyPerson();
667                // Also schrittweise erst mal Stufe 2 = GrundbÃŒcher zur Person suchen.
668                if(isset($blattgml) ) { // Es wurde nur EIN Grundbuch zu der Person gefunden.
[284]669                        $trans = "1 Blatt zum Eigent&uuml;mer";
[278]670                        getFSbyGB(false);       // Dann dazu auch gleich die Stufe 3 hinterher, aber ohne Backlink.
[284]671                }
[315]672        } else { // mit Filter auf Gemeinde: weniger Daten?
[284]673                if ($kennztyp > 1) {
674                        $trans="Grdb. und Flst. von .. in .."; // Filter GB-Bez,
675                } else {
[399]676                        $trans="Grundb. und Flurst. von .."; // Name steht darunter
[284]677                }
[315]678                getGBuFSbyPerson(); // Schritte 2+3 gleichzeitig, dabei Gemeinde-Filter auf Stufe 3
[278]679        }
680
[315]681} elseif(isset($name)) { // Suchbegriff aus Form: Suche nach Name
[278]682
683        $trans="Namensuche \"".$name."\"";
[315]684        getEigByName(); // Suchen nach Namensanfang
[278]685
[399]686        if($person != "") { // genau EIN Treffer zum gesuchten Namen
[282]687                if ($gfilter == 0) {
688                        $trans="Grundb&uuml;cher zum Namen";
[315]689                        getGBbyPerson(); // Dann gleich das Grundbuch hinterher
[282]690                } else {
691                        $trans="Grdb. und Flst. zum Namen";
692                        getGBuFSbyPerson();     // .. oder auch GB + FS
693                }
[278]694        }
695
[283]696} elseif ($debug >= 1) {
697        $trans="falscher Aufruf";
698        echo "\n<p class='dbg'>Parameter?</p>"; // sollte nicht vorkommen
[66]699}
[356]700
701// Nach Durchlaufen des PHP-Scriptes die zuletzt ausgefÃŒhrte Transaktion
[374]702//  im Kopf des Ergebnisrahmens anzeigen.
[356]703// Dazu die im HTML-Header definierte Javascript-Function benutzen.
704// Alternativ wird auch aus dem Javascript "positionieren Karte" dieser Titel gesetzt.
[283]705echo "
706<script type='text/javascript'>
707        transtitle('".$trans."');
708</script>";
[278]709
[66]710?>
[134]711
712</body>
[66]713</html>
Note: See TracBrowser for help on using the repository browser.