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

Revision 105, 11.9 KB checked in by frank.jaeger, 13 years ago (diff)

Anpassung an PostNAS-Version 0.6:
Buchauskunft und Navigation: Formate des Feldes "lage" (Straßenschlüssel) werden gesteuert über einen neuen conf-Parameter $dbvers (05 oder 06).
Konverter-Scripte für PostNAS 0.6 in einem neuen Ordner.

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