source: trunk/mapbender/http/nav/alkisnav_adr.php @ 333

Revision 333, 14.8 KB checked in by frank.jaeger, 10 years ago (diff)

Anpassung der Programme und Views an verschieden lange gm_id und Datenbanken mit historischen Objekten.

RevLine 
[66]1<?php
[85]2/* Version vom
[278]3        2013-04-26      "import_request_variables" entfÀllt in PHP 5.4.
4                                        ZurÃŒck-Link, Titel der Transaktion anzeigen
[280]5        2013-04-29      Test mit IE
[282]6        2013-05-07  Strukturierung des Programms
[306]7        2013-05-14  Feinkorrekturen
8        2013-05-15  Gruppierung nach Gemeinde, mehrfache HsNr (ap_pto.advstandardmodell) unterdrÃŒcken, Icon f. Straße
9        2014-01-23      Link zum Auskunft-Modul fÃŒr Straße
[330]10        2014-09-03  PostNAS 0.8: ohne Tab. "alkis_beziehungen", mehr "endet IS NULL", Spalten varchar statt integer
[333]11        2014-09-10  Bei Relationen den Timestamp abschneiden
[330]12
[140]13        ToDo:
[306]14        -       Gruppierung (mit Zeile) der Straßenliste nach Gemeinde
[140]15        -       Eingabe aus "Balken" von Buchauskunft "Lage" zulassen: Numerisch: Gem-Str-Haus-lfd
[306]16                -- lfd (NebengebÀude) als Untergliederung der geklickten Haus-Nr anzeigen
[140]17                Analog zur Zerlegung des FS-Kennz in _fls
[197]18        -       Mouse-Over in Straßenliste soll Position zeigen.
19                Dazu in der DB eine Tabelle mit Koordinate zum StraßenschlÃŒssel aufbauen.
[85]20*/
[276]21$cntget = extract($_GET);
[187]22include("../../conf/alkisnav_conf.php");
[306]23include("alkisnav_fkt.php"); // Funktionen
[187]24$con_string = "host=".$host." port=".$port." dbname=".$dbname.$dbvers.$gkz." user=".$user." password=".$password;
[105]25$con = pg_connect ($con_string) or die ("Fehler bei der Verbindung zur Datenbank ".$$dbname.$dbvers.$gkz);
[278]26echo <<<END
[66]27
[187]28<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
29<html>
30<head>
31        <meta http-equiv="cache-control" content="no-cache">
32        <meta http-equiv="pragma" content="no-cache">
33        <meta http-equiv="expires" content="0">
34        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
35        <title>ALKIS-Suche Adressen</title>
36        <link rel="stylesheet" type="text/css" href="alkisnav.css">
[278]37        <script type='text/javascript'>
38                function transtitle (trans) { // Titel der letzten Transaktion anzeigen
39                        document.getElementById('transaktiontitle').innerHTML = trans;
40                }
[306]41                function imFenster(dieURL) {
42                        var link = encodeURI(dieURL);
43                        window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
44                }
[278]45        </script>
[187]46</head>
[66]47<body>
[280]48<a href='javascript:history.back()'>
[282]49        <img src="ico/zurueck.ico" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
[278]50</a>
51<dfn class='title' id='transaktiontitle'></dfn>
[66]52
[278]53END;
54
[306]55function suchStrName() { // Strassen nach Name(-nsanfang)
56        global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
[66]57        $linelimit=120;  // -> in die Conf?
[187]58        preg_match("/^(\D+)(\d*)(\D*)/",$street,$matches); # 4 matches name/nr/zusatz echo "match: ".$matches[1].",".$matches[2].",".$matches[3];
59        $matches[1] = preg_replace("/strasse/i","str", $matches[1]);
[66]60        $matches[1] = preg_replace("/str\./i","str", $matches[1]);
[187]61        if(preg_match("/\*/",$matches[1])){
62                $match=trim(preg_replace("/\*/i","%", strtoupper($matches[1])));
63        } else {
64                $match=trim($matches[1])."%";
[66]65        }
[306]66        $sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage ";
[330]67        $sql.="FROM ax_lagebezeichnungkatalogeintrag k ";
[68]68        $sql.="JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
[330]69        $sql.="WHERE k.bezeichnung ILIKE $1 AND k.endet IS NULL AND g.endet IS NULL ";
[85]70        switch ($gfilter) {
71                case 1: // Einzelwert
[330]72                        $sql.="AND k.gemeinde='".$gemeinde."' ";
[85]73                        break;
74                case 2: // Liste
[330]75                        $sql.="AND k.gemeinde in (".str_replace(",", "','", $gemeinde).") ";
[85]76                        break;
77                default: // kein Filter
78                        break;
[66]79        }
[306]80        $sql.="ORDER BY g.bezeichnung, k.bezeichnung, k.lage LIMIT $2 ;";
[68]81        $v=array($match,$linelimit);
82        $res=pg_prepare("", $sql);
83        $res=pg_execute("", $v);
[330]84
85        if (!$res) {
86                echo "\n<p class='err'>Fehler bei Name</p>";
87                if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<p>";}
88                return;
89        }
90
[187]91        $cnt = 0;
[306]92        $gwgem="";
[66]93        while($row = pg_fetch_array($res)) {
[306]94                $gemname=$row["gemname"];
95                $gemnr=$row["gemeinde"] ;
96                if ($gwgem != $gemname) {
97                        if ($gfilter != 1) {
98                                zeile_gemeinde($gemnr, $gemname, false); // ToDo: aber ohne Link oder Link verarbeiten können
99                        }
100                        $gwgem=$gemname;
101                }
102                $gkey=$row["schluesselgesamt"]; // Land-RegBez-Kreis-Gem-Strasse - fÃŒr weitere Suche
103                $skey=$row["lage"]; // Nur Str.-schl. daraus
104                $kgml=$row["gml_id"]; // ID von Katalog
105
106// +++ in function_zeile_strasse()
107                $sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8"); 
[68]108                echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
[306]109                // Icon -> Buchnachweis
110                echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
111                        echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.ico' width='16' height='16' alt='STR' title='Stra&szlig;e'>";
112                echo "\n\t</a>";
113                echo "<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."'>".$sname."</a>";
[66]114                echo "</div>";
[306]115// +++ function ende
[187]116                $cnt++;
117        }
[66]118        if($cnt == 0) {
[278]119                echo "<pclass='anz'>Keine Stra&szlig;e</p>";
[66]120        } elseif($cnt == 1) { // Eindeutig
[68]121                $str_schl=$gkey; // dann gleich weiter
[66]122        } elseif($cnt >= $linelimit) {
[278]123                echo "<p class='anz'>".$cnt." Stra&szlig;en ... und weitere</p>";                       
124        } elseif ($cnt > 1) {
125                echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";     
126        }
[187]127        return;
128}
[66]129
[306]130function suchStrKey() { // Strassen nach num. Schluessel
131        global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
132        $linelimit=60;
[187]133        if(preg_match("/\*/",$street)) {
[68]134                $match=trim(preg_replace("/\*/i","%",$street));
[306]135                // fuehrende Nullen eingeben oder fuehrende Wildcard
[187]136        } else {
137                $match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten
[68]138        }
[306]139        $sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage ";
[68]140        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
141        $sql.="JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
142        $sql.="WHERE k.lage LIKE $1 ";
[85]143        switch ($gfilter) {
144                case 1: // Einzelwert
[330]145                        $sql.="AND k.gemeinde='".$gemeinde."' ";
[85]146                        break;
147                case 2: // Liste
[330]148                        $sql.="AND k.gemeinde in ('".str_replace(",", "','", $gemeinde)."') ";
[85]149                        break;
[68]150        }
[187]151        $sql.="ORDER BY k.lage, k.bezeichnung LIMIT $2 ;";
[330]152
[68]153        $v=array($match,$linelimit);
154        $res=pg_prepare("", $sql);
155        $res=pg_execute("", $v);
[330]156        if (!$res) {
157                echo "\n<p class='err'>Fehler bei Schl&uuml;ssel</p>";
158                return;
159        }
[187]160        $cnt = 0;
[68]161        while($row = pg_fetch_array($res)) {
162                $sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");         
163                $gkey=$row["schluesselgesamt"];
164                $gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
165                $skey=$row["lage"];
[306]166                $kgml=$row["gml_id"]; // ID von Katalog
167               
168// +++ in function_zeile_strasse()
[68]169                echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
[306]170
171                        // Icon -> Buchnachweis
172                        echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
173                                echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.ico' width='16' height='16' alt='STR' title='Stra&szlig;e'>";
[309]174                        echo "\n\t</a>";
[306]175               
[86]176                        echo $skey." <a class='st' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."' title='".$gemname."'>".$sname;
[68]177                        echo "</a>";
[85]178                        switch ($gfilter) {
179                                case 0: // Kein Filter
180                                        echo " in ".$gemname;
181                                        break;
182                                case 2: // Liste
183                                        echo " in ".$gemname;
184                                        break;
185                        }
[68]186                echo "</div>";
[306]187// function ende
[330]188
[187]189                $cnt++;
190        }
[68]191        if($cnt == 0) {
[278]192                echo "\n<p class='anz'>Keine Stra&szlig;e mit Schl&uuml;ssel ".$match."</p>";
[68]193        } elseif($cnt == 1) { // Eindeutig
194                $str_schl=$gkey; // dann gleich weiter
[278]195        } elseif ($cnt >= $linelimit) {
196                echo "\n<p>".$cnt." Stra&szlig;en ... und weitere</p>";                 
197        } elseif ($cnt > 1) {
198                echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";     
[68]199        }       
[187]200        return;
[68]201}
202
[306]203function suchHausZurStr($showParent) { // Haeuser zu einer Strasse
[309]204        global $str_schl, $gkz, $scalestr, $scalehs, $epsg, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
[306]205
206        // Head
[66]207        // Strasse zum Strassenschluessel
[309]208        $sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage ";
[83]209        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
210        $sql.="JOIN ax_gemeinde g ON k.land=g.land AND k.regierungsbezirk=g.regierungsbezirk AND k.kreis=g.kreis AND k.gemeinde=g.gemeinde ";
211        $sql.="WHERE k.schluesselgesamt = $1 LIMIT 1";
[330]212
[306]213        $v=array($str_schl);    // Schluessel-Gesamt ..
[66]214        $res=pg_prepare("", $sql);
215        $res=pg_execute("", $v);
[330]216        if (!$res) {
217                echo "\n<p class='err'>Fehler bei Name zum Stra&szlig;enschl&uuml;ssel</p>";
218                if ($debug > 2) {echo "<p class='dbg'>SQL = '".$sql."'<p>";}
219                return;
220        }
221
[306]222        if($row = pg_fetch_array($res)) { // .. gefunden
[309]223                $kgml=$row["kgml"]; // ID aus Katalog
[66]224                $sname=$row["bezeichnung"];
[306]225                $land =$row["land"];    // Einzel-Felder fÃŒr JOIN _lagebezeichnung_
[66]226                $regb =$row["regierungsbezirk"];
227                $kreis=$row["kreis"];
228                $gemnd=$row["gemeinde"];
[306]229                $nr=$row["lage"];
[83]230                $gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
231                if ($showParent) {
[306]232                        // EINE Koordinate zur Strasse besorgen
[309]233                        // ax_Flurstueck >zeigtAuf> ax_LagebezeichnungOhneHausnummer
[197]234                        $sqlko ="SELECT ";
[86]235                        if($epsg == "25832") { // Transform nicht notwendig
[188]236                                $sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
237                                $sqlko.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
[197]238                        } else {
[188]239                                $sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
[197]240                                $sqlko.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";
[86]241                        }
[83]242                        $sqlko.="FROM ax_lagebezeichnungohnehausnummer o ";
[333]243                        $sqlko.="JOIN ax_flurstueck f ON substring(o.gml_id,1,16)=ANY(f.zeigtauf) ";
[83]244                        $sqlko.="WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 ";       
[330]245                        $sqlko.="LIMIT 1;"; // die erstbeste Koordinate
[83]246                        $v=array($land,$regb,$kreis,$gemnd,$nr);
247                        $resko=pg_prepare("", $sqlko);
248                        $resko=pg_execute("", $v);
249                        if ($resko) {
250                                $rowko=pg_fetch_array($resko);
251                                $x=$rowko["x"];
252                                $y=$rowko["y"];
253                        } else {               
254                                echo "\n<p class='err'>Fehler bei Koordinate zur Stra&szlig;e</p>";
255                        }
[309]256
257// +++ IN ARBEIT:
258                        echo "\n\t<div class='stu' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
259                        // Icon -> Buchnachweis
260                        echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
261                                echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.ico' width='16' height='16' alt='STR' title='Stra&szlig;e'>";
262                        echo "\n\t</a>";
263
[83]264                        if ($x > 0) { // Koord. bekommen?
[115]265                                echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:"; // mit Link
[278]266                                                echo "transtitle(\"auf Stra&szlig;e positioniert\"); ";
[115]267                                                echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); ";
268                                                echo "parent.parent.showHighlight(".$x.",".$y."); ";
[306]269                                        //      echo "document.location.href=\"".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$str_schl."\"";
[278]270                                        echo "' "; // end href
[187]271                                        echo "\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' ";
[83]272                                        echo "\n\t\tonmouseout='parent.parent.hideHighlight()'";
273                                echo ">\n\t\t".$sname." (".$nr.")\n\t</a>";
[197]274                        } else { // keine Koord. gefunden
[83]275                                echo $sname." (".$nr.")"; // nur Anzeige, ohne Link
276                        }
[85]277                        switch ($gfilter) {
278                                case 0: // Kein Filter
279                                        echo " in ".$gemname;
280                                        break;
281                                case 2: // Liste
282                                        echo " in ".$gemname;
283                                        break;
284                        }                       
[83]285                        echo "\n</div>";
[66]286                }
[83]287                echo "\n<hr>";
[306]288
289                // Body
[66]290                // Haeuser zum Strassenschluessel
[306]291                $sql="SELECT min(replace(h.hausnummer,' ','')) AS hsnr, ";
[86]292                if($epsg == "25832") { // Transform nicht notwendig
[306]293                        $sql.="avg (st_x(p.wkb_geometry)) AS x, ";
294                        $sql.="avg (st_y(p.wkb_geometry)) AS y ";               
[197]295                } else { 
[306]296                        $sql.="avg (st_x(st_transform(p.wkb_geometry,".$epsg."))) AS x, ";
297                        $sql.="avg (st_y(st_transform(p.wkb_geometry,".$epsg."))) AS y ";               
[86]298                }
[333]299                $sql.="FROM ap_pto p JOIN ax_lagebezeichnungmithausnummer h ON substring(h.gml_id,1,16)=ANY(p.dientzurdarstellungvon) ";
300                $sql.="WHERE p.art='HNR' AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 ";
[306]301                $sql.="GROUP BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2) ";
[197]302                $sql.="ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);";
[306]303                // Problem: mehrere Koordinaten fÃŒr verschiedene MaßstÀbe der Kartendarstellung
304                // Diese sollten nicht mehrfach gelistet werden. FÃŒr Positionierung "irgendeine" nehmen.
305                // Lösung: ÃŒber GROUP BY in SQL. Alternative Lösungen wÀren:
306                //  1. Gruppenwechsel bei Abarbeitung des Result
307                //  2. Subquery mit LIMIT 1 statt JOIN
308                //  3. Geometrie aus GebÀude-Mittelpunkt statt aus PrÀsentationsobjekt der Hausnummer
[197]309
[83]310                $v=array($land,$regb,$kreis,$gemnd,$nr);
[68]311                $resh=pg_prepare("", $sql);
312                $resh=pg_execute("", $v);
[330]313                if (!$resh) {
314                        echo "\n<p class='err'>Fehler bei H&auml;user zum Stra&szlig;enschl&uuml;ssel</p>";
315                        if ($debug > 2) {echo "<p class='dbg'>SQL='".$sql."'<br>Array=".$v."</p>";}
316                        return;
317                }
[306]318
[187]319                $cnt=0;
320                $count=0;
321                echo "\n<table>";
[197]322                while($rowh = pg_fetch_array($resh)) { // mehrere HsNr je Zeile
323                        if($count == 0){echo "\n<tr>";}
324                        $hsnr=$rowh["hsnr"];
[187]325                        $x=$rowh["x"];
326                        $y=$rowh["y"];
[66]327                        echo "\n\t<td class='hsnr'>";
328                                echo "<a href='";
[278]329                                        echo "javascript:";
[306]330                                        echo "transtitle(\"auf Haus ".$hsnr." positioniert\"); ";
[278]331                                        echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalehs."); ";
[115]332                                        echo "parent.parent.showHighlight(".$x.",".$y.");' ";
[187]333                                echo "onmouseover='parent.parent.showHighlight(".$x.",".$y.")' ";
[66]334                                echo "onmouseout='parent.parent.hideHighlight()";
[187]335                                echo "'>".$hsnr."</a>";
336                        echo "</td>";
337                        $cnt++;
338                        $count++;
[66]339                        if($count == 6) {
340                                echo "\n</tr>";
341                                $count = 0;
[187]342                        }
343                }
[66]344                if($count > 0) {echo "\n</tr>";}
345                echo "\n</table>";
[306]346                if ($cnt > 1) {
347                        echo "\n<p class='anz'>".$cnt." Hausnummern</p>";
348                }
[66]349        } else {
[278]350                echo "\n<p class='anz'>Keine Stra&szlig;e</p>";
[187]351        }
352        return;
353}
[66]354// ===========
355// Start hier!
356// ===========
357if(isset($epsg)) {
[86]358        $epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);   
[66]359} else {
360        $epsg=$gui_epsg; // aus Conf
361}
[85]362if ($gemeinde == "") {
363        $gfilter = 0; // ungefiltert
364} elseif(strpos($gemeinde, ",") === false) {
365        $gfilter = 1; // Einzelwert
366} else {
367        $gfilter = 2; // Liste
368}
[306]369
370// +++  Zerlegung Eingabe aus "Balken" von Buchauskunft "Lage":
[330]371//              Numerisch: Gem-Str-Haus-lfd
[306]372
373if ($str_schl != "") { // aus Link
[278]374        $trans="Hausnummern zur Stra&szlig;e";
[83]375        suchHausZurStr(true);
[306]376} elseif($street != "") { // Eingabe in Form
[278]377        if (trim($street, "*,0..9") == "") { // Zahl, ggf. mit Wildcard
378                $trans="Suche Stra&szlig;enschl&uuml;ssel \"".$street."\"";
379                suchStrKey();
[66]380        } else {
[278]381                $trans="Suche Stra&szlig;enname \"".$street."\"";
382                suchStrName();
[187]383        }
384        if(isset($str_schl)) { // Eindeutiges Ergebnis
[278]385                $trans="1 Stra&szlig;e gefunden, Hausnummern";
[187]386                suchHausZurStr(false);
[83]387        }
[68]388}
[278]389// Titel im Kopf anzeigen
[283]390echo "
391<script type='text/javascript'>
392        transtitle ('".$trans."') ;
393</script>";
[278]394
[66]395?>
[68]396
[187]397</body>
398</html>
Note: See TracBrowser for help on using the repository browser.