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

Revision 282, 12.2 KB checked in by frank.jaeger, 11 years ago (diff)

Mapbender-ALKIS-Navigation korrigiert und verbessert.

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