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

Revision 280, 13.7 KB checked in by frank.jaeger, 11 years ago (diff)

ALKIS-Navigation: Darstellung im IE verbessert

RevLine 
[66]1<?php
[85]2/* Version vom
[278]3        2011-04-11      epsg in Link, transform nur wenn notwendig
4        2011-07-25      PostNAS 0.5/0.6 Versionen unterscheiden
5        2011-10-24      Nach Pos-Klick Highlight erneuern statt hideHighlight
6        2011-12-09      Sonderfall PostNAS 0.5 raus,
7        2012-12-03      A.E.: Ausgabe von Hausnr ohne Gebaeude
8        2013-01-15      F.J.: HsNr ohne GebÀude auf NRW/krz-Daten anpassen
9        2013-04-26      "import_request_variables" entfÀllt in PHP 5.4.
10                                        ZurÃŒck-Link, Titel der Transaktion anzeigen
[280]11        2013-04-29      Test mit IE
[105]12
[140]13        ToDo:
14        -       Eingabe aus "Balken" von Buchauskunft "Lage" zulassen: Numerisch: Gem-Str-Haus-lfd
15                Analog zur Zerlegung des FS-Kennz in _fls
[197]16        -       Mouse-Over in Straßenliste soll Position zeigen.
17                Dazu in der DB eine Tabelle mit Koordinate zum StraßenschlÃŒssel aufbauen.
[85]18*/
[276]19$cntget = extract($_GET);
[187]20include("../../conf/alkisnav_conf.php");
21$con_string = "host=".$host." port=".$port." dbname=".$dbname.$dbvers.$gkz." user=".$user." password=".$password;
[105]22$con = pg_connect ($con_string) or die ("Fehler bei der Verbindung zur Datenbank ".$$dbname.$dbvers.$gkz);
[278]23echo <<<END
[66]24
[187]25<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
26<html>
27<head>
28        <meta http-equiv="cache-control" content="no-cache">
29        <meta http-equiv="pragma" content="no-cache">
30        <meta http-equiv="expires" content="0">
31        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
32        <title>ALKIS-Suche Adressen</title>
33        <link rel="stylesheet" type="text/css" href="alkisnav.css">
[278]34        <script type='text/javascript'>
35                function transtitle (trans) { // Titel der letzten Transaktion anzeigen
36                        document.getElementById('transaktiontitle').innerHTML = trans;
37                }
38        </script>
[187]39</head>
[66]40<body>
[280]41<a href='javascript:history.back()'>
42        <img src="ico/zurueck.ico" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck" />
[278]43</a>
44<dfn class='title' id='transaktiontitle'></dfn>
[66]45
[278]46END;
47
[66]48function suchStrName() {
[83]49        // Strassen nach Name(-nsanfang)
[86]50        global $con, $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug;
[66]51        $linelimit=120;  // -> in die Conf?
[187]52        preg_match("/^(\D+)(\d*)(\D*)/",$street,$matches); # 4 matches name/nr/zusatz echo "match: ".$matches[1].",".$matches[2].",".$matches[3];
53        $matches[1] = preg_replace("/strasse/i","str", $matches[1]);
[66]54        $matches[1] = preg_replace("/str\./i","str", $matches[1]);
[187]55        if(preg_match("/\*/",$matches[1])){
56                $match=trim(preg_replace("/\*/i","%", strtoupper($matches[1])));
57        } else {
58                $match=trim($matches[1])."%";
[66]59        }
[68]60        $sql ="SELECT g.bezeichnung AS gemname, k.bezeichnung, k.schluesselgesamt, k.lage ";
[66]61        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
[68]62        $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 ";
63        $sql.="WHERE k.bezeichnung ILIKE $1 ";
[85]64        switch ($gfilter) {
65                case 1: // Einzelwert
66                        $sql.="AND k.gemeinde=".$gemeinde." ";
67                        break;
68                case 2: // Liste
69                        $sql.="AND k.gemeinde in (".$gemeinde.") ";
70                        break;
71                default: // kein Filter
72                        break;
[66]73        }
[187]74        $sql.="ORDER BY k.bezeichnung, g.bezeichnung, k.lage LIMIT $2 ;";
[68]75        $v=array($match,$linelimit);
76        $res=pg_prepare("", $sql);
77        $res=pg_execute("", $v);
78        if (!$res) {return "\n<p class='err'>Fehler bei Name</p>";}
[187]79        $cnt = 0;
[66]80        while($row = pg_fetch_array($res)) {
[68]81                $sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");         
[83]82                $gkey=$row["schluesselgesamt"]; // Land-Kreis-Gem-Strasse
[68]83                $gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
[66]84                $skey=$row["lage"];
[68]85                echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
86                        if (trim($skey, "0..9") == "") { // Integer
[86]87                                echo "<a class='stl' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."'>".$sname."</a>";
[68]88                        } else { // Klassifizierung?
89                                echo $sname; // nicht brauchbar fuer ax_lagebezeichnungmithausnummer.lage (Integer)
[86]90                        }       
[85]91                        switch ($gfilter) {
92                                case 0: // Kein Filter
93                                        echo " in ".$gemname;
94                                        break;
95                                case 2: // Liste
96                                        echo " in ".$gemname;
97                                        break;
98                                default: // Einzelwert
99                                        break;
100                        }                       
[66]101                echo "</div>";
[187]102                $cnt++;
103        }
[66]104        if($cnt == 0) {
[278]105                echo "<pclass='anz'>Keine Stra&szlig;e</p>";
[66]106        } elseif($cnt == 1) { // Eindeutig
[68]107                $str_schl=$gkey; // dann gleich weiter
[66]108        } elseif($cnt >= $linelimit) {
[278]109                echo "<p class='anz'>".$cnt." Stra&szlig;en ... und weitere</p>";                       
110        } elseif ($cnt > 1) {
111                echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";     
112        }
[187]113        return;
114}
[66]115
[68]116function suchStrKey() {
[83]117        // Strassen nach Strassen-Schluessel
[86]118        global $con, $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug;
[68]119        $linelimit=50;
[187]120        if(preg_match("/\*/",$street)) {
[68]121                $match=trim(preg_replace("/\*/i","%",$street));
[187]122                // -> Anwender muss fuehrende Nullen eingeben oder fuehrende Wildcard
123        } else {
124                $match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten
[68]125        }
126   //if ($debug >= 2) {echo "<p>sql-Match='".$match."'</p>";}
127        $sql ="SELECT g.bezeichnung AS gemname, k.bezeichnung, k.schluesselgesamt, k.lage ";
128        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
129        $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 ";
130        $sql.="WHERE k.lage LIKE $1 ";
[85]131
132        switch ($gfilter) {
133                case 1: // Einzelwert
134                        $sql.="AND k.gemeinde=".$gemeinde." ";
135                        break;
136                case 2: // Liste
137                        $sql.="AND k.gemeinde in (".$gemeinde.") ";
138                        break;
139                default: // kein Filter
140                        break;
[68]141        }
[85]142
[187]143        $sql.="ORDER BY k.lage, k.bezeichnung LIMIT $2 ;";
[68]144        $v=array($match,$linelimit);
145        $res=pg_prepare("", $sql);
146        $res=pg_execute("", $v);
147        if (!$res) {return "\n<p class='err'>Fehler bei Schl&uuml;ssel</p>";}
[187]148        $cnt = 0;
[68]149        while($row = pg_fetch_array($res)) {
150                $sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8");         
151                $gkey=$row["schluesselgesamt"];
152                $gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
153                $skey=$row["lage"];
154                echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
[86]155                        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]156                        echo "</a>";
[85]157
158                        switch ($gfilter) {
159                                case 0: // Kein Filter
160                                        echo " in ".$gemname;
161                                        break;
162                                case 2: // Liste
163                                        echo " in ".$gemname;
164                                        break;
165                                default: // Einzelwert
166                                        break;
167                        }
[68]168                echo "</div>";
[187]169                $cnt++;
170        }
[68]171        if($cnt == 0) {
[278]172                echo "\n<p class='anz'>Keine Stra&szlig;e mit Schl&uuml;ssel ".$match."</p>";
[68]173        } elseif($cnt == 1) { // Eindeutig
174                $str_schl=$gkey; // dann gleich weiter
[278]175        } elseif ($cnt >= $linelimit) {
176                echo "\n<p>".$cnt." Stra&szlig;en ... und weitere</p>";                 
177        } elseif ($cnt > 1) {
178                echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";     
[68]179        }       
[187]180        return;
[68]181}
182
[187]183function suchHausZurStr($showParent){
[83]184        // Haeuser zu einer Strasse
[278]185        global $con, $str_schl, $gkz, $scalestr, $scalehs, $epsg, $gemeinde, $epsg, $gfilter, $debug;
[66]186        // Strasse zum Strassenschluessel
[83]187        $sql ="SELECT g.bezeichnung AS gemname, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage ";
188        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
189        $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 ";
190        $sql.="WHERE k.schluesselgesamt = $1 LIMIT 1";
[197]191        $v=array($str_schl);
[66]192        $res=pg_prepare("", $sql);
193        $res=pg_execute("", $v);
[187]194        if($row = pg_fetch_array($res)) { // Strassenschluessel gefunden
[66]195                $sname=$row["bezeichnung"];
196                $land =$row["land"];
197                $regb =$row["regierungsbezirk"];
198                $kreis=$row["kreis"];
199                $gemnd=$row["gemeinde"];
[83]200                $gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
[140]201                $nr=$row["lage"];
[83]202                if ($showParent) {
203                        // eine Koordinate zur Strasse besorgen
204                        // ax_Flurstueck  >zeigtAuf>  ax_LagebezeichnungOhneHausnummer
[197]205                        $sqlko ="SELECT ";
[86]206                        if($epsg == "25832") { // Transform nicht notwendig
[188]207                                $sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
208                                $sqlko.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
[197]209                        } else {
[188]210                                $sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
[197]211                                $sqlko.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";
[86]212                        }
[83]213                        $sqlko.="FROM ax_lagebezeichnungohnehausnummer o ";
214                        $sqlko.="JOIN alkis_beziehungen v ON o.gml_id=v.beziehung_zu ";
215                        $sqlko.="JOIN ax_flurstueck f ON v.beziehung_von=f.gml_id ";
216                        $sqlko.="WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 ";       
[197]217                        $sqlko.="AND v.beziehungsart='zeigtAuf' LIMIT 1;"; // die erstbeste Koordinate
[83]218                        $v=array($land,$regb,$kreis,$gemnd,$nr);
219                        $resko=pg_prepare("", $sqlko);
220                        $resko=pg_execute("", $v);
221                        if ($resko) {
222                                $rowko=pg_fetch_array($resko);
223                                $x=$rowko["x"];
224                                $y=$rowko["y"];
225                        } else {               
226                                echo "\n<p class='err'>Fehler bei Koordinate zur Stra&szlig;e</p>";
227                        }
228                        echo "\n<div class='stu'>";             
229                        if ($x > 0) { // Koord. bekommen?
[115]230                                echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:"; // mit Link
[278]231                                                echo "transtitle(\"auf Stra&szlig;e positioniert\"); ";
[115]232                                                echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); ";
233                                                echo "parent.parent.showHighlight(".$x.",".$y."); ";
[278]234                                                //echo "document.location.href=\"".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$str_schl."\"";
235                                        echo "' "; // end href
[187]236                                        echo "\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' ";
[83]237                                        echo "\n\t\tonmouseout='parent.parent.hideHighlight()'";
238                                echo ">\n\t\t".$sname." (".$nr.")\n\t</a>";
[197]239                        } else { // keine Koord. gefunden
[83]240                                echo $sname." (".$nr.")"; // nur Anzeige, ohne Link
241                        }
[85]242                        switch ($gfilter) {
243                                case 0: // Kein Filter
244                                        echo " in ".$gemname;
245                                        break;
246                                case 2: // Liste
247                                        echo " in ".$gemname;
248                                        break;
249                                default: // Einzelwert
250                                        break;
251                        }                       
[83]252                        echo "\n</div>";
[66]253                }
[83]254                echo "\n<hr>";
[197]255
[66]256                // Haeuser zum Strassenschluessel
[197]257        //      $sql="SELECT replace(h.hausnummer,' ','') AS hsnr, subq.geb, "; // Subquery
258                $sql="SELECT replace(h.hausnummer,' ','') AS hsnr, ";
[86]259                if($epsg == "25832") { // Transform nicht notwendig
[197]260                        $sql.="st_x(p.wkb_geometry) AS x, ";
261                        $sql.="st_y(p.wkb_geometry) AS y ";             
262                } else { 
263                        $sql.="st_x(st_transform(p.wkb_geometry,".$epsg.")) AS x, ";
264                        $sql.="st_y(st_transform(p.wkb_geometry,".$epsg.")) AS y ";             
[86]265                }
[197]266
267/* Version mit // Subquery
268Liefert Informationen Ìber GebÀude zur Hausnummer. LÀuft aber spÌrbar langsamer.
269                $sql.="FROM ap_pto p JOIN alkis_beziehungen v ON p.gml_id = v.beziehung_von ";
270                $sql.="JOIN ax_lagebezeichnungmithausnummer h ON v.beziehung_zu = h.gml_id ";
271                $sql.="LEFT JOIN (SELECT b.beziehung_zu AS zu, g.gml_id AS geb FROM alkis_beziehungen b ";
272                $sql.="JOIN ax_gebaeude g ON b.beziehung_von=g.gml_id WHERE b.beziehungsart='zeigtAuf') subq ";
273                $sql.="ON h.gml_id = subq.zu WHERE v.beziehungsart='dientZurDarstellungVon' AND p.art = 'HNR' ";
274                $sql.="AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 ";
[278]275                $sql.="ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);"; */
276
[197]277                // Version ohne Subquery
278                $sql.="FROM ap_pto p JOIN alkis_beziehungen v ON p.gml_id = v.beziehung_von ";
279                $sql.="JOIN ax_lagebezeichnungmithausnummer h ON v.beziehung_zu = h.gml_id ";
280                $sql.="WHERE v.beziehungsart='dientZurDarstellungVon' AND p.art = 'HNR' ";
281                $sql.="AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 ";
282                $sql.="ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);";
283
[83]284                $v=array($land,$regb,$kreis,$gemnd,$nr);
[68]285                $resh=pg_prepare("", $sql);
286                $resh=pg_execute("", $v);
[187]287                $cnt=0;
288                $count=0;
289                echo "\n<table>";
[197]290                while($rowh = pg_fetch_array($resh)) { // mehrere HsNr je Zeile
291                        if($count == 0){echo "\n<tr>";}
292                        $hsnr=$rowh["hsnr"];
293                //      $geb=$rowh["geb"]; // Subquery
[187]294                        $x=$rowh["x"];
295                        $y=$rowh["y"];
[197]296                /* // Subquery
297                        if ($geb == "") { // kein GebÀude
298                                $cls=" class='hsnro'";
299                                $ttl="kein Haus";
300                        } else {
301                                $cls="";
302                                $ttl="Haus ".$geb;
303                        }
304                */             
[66]305                        echo "\n\t<td class='hsnr'>";
[197]306                        //      echo "<a".$cls." href='";
[66]307                                echo "<a href='";
[278]308                                        echo "javascript:";
309                                        echo "transtitle(\"auf Haus positioniert\"); ";
310                                        echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalehs."); ";
[115]311                                        echo "parent.parent.showHighlight(".$x.",".$y.");' ";
[187]312                                echo "onmouseover='parent.parent.showHighlight(".$x.",".$y.")' ";
[66]313                                echo "onmouseout='parent.parent.hideHighlight()";
[197]314                        //      echo "' title='".$ttl."'>".$hsnr."</a>"; // Subquery
[187]315                                echo "'>".$hsnr."</a>";
316                        echo "</td>";
317                        $cnt++;
318                        $count++;
[66]319                        if($count == 6) {
320                                echo "\n</tr>";
321                                $count = 0;
[187]322                        }
323                }
[66]324                if($count > 0) {echo "\n</tr>";}
325                echo "\n</table>";
[278]326                echo "\n<p class='anz'>".$cnt." Hausnummern</p>";
[66]327        } else {
[278]328                echo "\n<p class='anz'>Keine Stra&szlig;e</p>";
[187]329        }
330        return;
331}
[66]332// ===========
333// Start hier!
334// ===========
335if(isset($epsg)) {
[278]336        #if ($debug >= 2) {echo "\n<p>aktueller EPSG='".$epsg."'</p>";} // aus MB
[86]337        $epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);   
[66]338} else {
[278]339        #if ($debug >= 1) {echo "\n<p class='err'>kein EPSG gesetzt</p>";}     
[66]340        $epsg=$gui_epsg; // aus Conf
341}
[278]342#if ($debug >= 2) {echo "<p>Filter Gemeinde = ".$gemeinde."</p>";}
[85]343if ($gemeinde == "") {
344        $gfilter = 0; // ungefiltert
345} elseif(strpos($gemeinde, ",") === false) {
346        $gfilter = 1; // Einzelwert
347} else {
348        $gfilter = 2; // Liste
349}
[187]350if (isset($str_schl)) { // aus Link
[278]351        $trans="Hausnummern zur Stra&szlig;e";
[83]352        suchHausZurStr(true);
[187]353} elseif(isset($street)) { // Eingabe in Form
[278]354        if (trim($street, "*,0..9") == "") { // Zahl, ggf. mit Wildcard
355                $trans="Suche Stra&szlig;enschl&uuml;ssel \"".$street."\"";
356                suchStrKey();
[66]357        } else {
[278]358                $trans="Suche Stra&szlig;enname \"".$street."\"";
359                suchStrName();
[187]360        }
361        if(isset($str_schl)) { // Eindeutiges Ergebnis
[278]362                $trans="1 Stra&szlig;e gefunden, Hausnummern";
[187]363                suchHausZurStr(false);
[83]364        }
[68]365}
[278]366// Titel im Kopf anzeigen
367echo "\n<script type='text/javascript'>\n\ttranstitle('".$trans."')\n</script>";
368
[66]369?>
[68]370
[187]371</body>
372</html>
Note: See TracBrowser for help on using the repository browser.