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

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

Mapbender-Navigation mit ALKIS-Daten komplett überarbeitet.

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