source: trunk/data/mapbender/http/nav/alkisnav_adr.php @ 187

Revision 187, 14.4 KB checked in by astrid.emde, 11 years ago (diff)

kleine Anpassung subselect replace

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