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

Revision 309, 14.3 KB checked in by frank.jaeger, 7 years ago (diff)

Bessere Anbindung ALKIS-Straße-Auskunft an Mapbender-Adress-Navigation.

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        2013-05-14  Feinkorrekturen
8        2013-05-15  Gruppierung nach Gemeinde, mehrfache HsNr (ap_pto.advstandardmodell) unterdrÃŒcken, Icon f. Straße
9        2014-01-23      Link zum Auskunft-Modul fÃŒr Straße
10        ToDo:
11        -       Gruppierung (mit Zeile) der Straßenliste nach Gemeinde
12        -       Eingabe aus "Balken" von Buchauskunft "Lage" zulassen: Numerisch: Gem-Str-Haus-lfd
13                -- lfd (NebengebÀude) als Untergliederung der geklickten Haus-Nr anzeigen
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");
20include("alkisnav_fkt.php"); // Funktionen
21$con_string = "host=".$host." port=".$port." dbname=".$dbname.$dbvers.$gkz." user=".$user." password=".$password;
22$con = pg_connect ($con_string) or die ("Fehler bei der Verbindung zur Datenbank ".$$dbname.$dbvers.$gkz);
23echo <<<END
24
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">
34        <script type='text/javascript'>
35                function transtitle (trans) { // Titel der letzten Transaktion anzeigen
36                        document.getElementById('transaktiontitle').innerHTML = trans;
37                }
38                function imFenster(dieURL) {
39                        var link = encodeURI(dieURL);
40                        window.open(link,'','left=10,top=10,width=620,height=800,resizable=yes,menubar=no,toolbar=no,location=no,status=no,scrollbars=yes');
41                }
42        </script>
43</head>
44<body>
45<a href='javascript:history.back()'>
46        <img src="ico/zurueck.ico" width="16" height="16" alt="&lt;&lt;" title="zur&uuml;ck">
47</a>
48<dfn class='title' id='transaktiontitle'></dfn>
49
50END;
51
52function suchStrName() { // Strassen nach Name(-nsanfang)
53        global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
54        $linelimit=120;  // -> in die Conf?
55        preg_match("/^(\D+)(\d*)(\D*)/",$street,$matches); # 4 matches name/nr/zusatz echo "match: ".$matches[1].",".$matches[2].",".$matches[3];
56        $matches[1] = preg_replace("/strasse/i","str", $matches[1]);
57        $matches[1] = preg_replace("/str\./i","str", $matches[1]);
58        if(preg_match("/\*/",$matches[1])){
59                $match=trim(preg_replace("/\*/i","%", strtoupper($matches[1])));
60        } else {
61                $match=trim($matches[1])."%";
62        }
63        $sql ="SELECT g.gemeinde, g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage ";
64        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
65        $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        $sql.="WHERE k.bezeichnung ILIKE $1 ";
67        switch ($gfilter) {
68                case 1: // Einzelwert
69                        $sql.="AND k.gemeinde=".$gemeinde." ";
70                        break;
71                case 2: // Liste
72                        $sql.="AND k.gemeinde in (".$gemeinde.") ";
73                        break;
74                default: // kein Filter
75                        break;
76        }
77        $sql.="ORDER BY g.bezeichnung, k.bezeichnung, k.lage LIMIT $2 ;";
78        $v=array($match,$linelimit);
79        $res=pg_prepare("", $sql);
80        $res=pg_execute("", $v);
81        if (!$res) {return "\n<p class='err'>Fehler bei Name</p>";}
82        $cnt = 0;
83        $gwgem="";
84        while($row = pg_fetch_array($res)) {
85                $gemname=$row["gemname"];
86                $gemnr=$row["gemeinde"] ;
87                if ($gwgem != $gemname) {
88                        if ($gfilter != 1) {
89                                zeile_gemeinde($gemnr, $gemname, false); // ToDo: aber ohne Link oder Link verarbeiten können
90                        }
91                        $gwgem=$gemname;
92                }
93                $gkey=$row["schluesselgesamt"]; // Land-RegBez-Kreis-Gem-Strasse - fÃŒr weitere Suche
94                $skey=$row["lage"]; // Nur Str.-schl. daraus
95                $kgml=$row["gml_id"]; // ID von Katalog
96
97// +++ in function_zeile_strasse()
98                $sname=htmlentities($row["bezeichnung"], ENT_QUOTES, "UTF-8"); 
99                echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
100                // Icon -> Buchnachweis
101                echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
102                        echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.ico' width='16' height='16' alt='STR' title='Stra&szlig;e'>";
103                echo "\n\t</a>";
104                echo "<a href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."'>".$sname."</a>";
105                echo "</div>";
106// +++ function ende
107                $cnt++;
108        }
109        if($cnt == 0) {
110                echo "<pclass='anz'>Keine Stra&szlig;e</p>";
111        } elseif($cnt == 1) { // Eindeutig
112                $str_schl=$gkey; // dann gleich weiter
113        } elseif($cnt >= $linelimit) {
114                echo "<p class='anz'>".$cnt." Stra&szlig;en ... und weitere</p>";                       
115        } elseif ($cnt > 1) {
116                echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";     
117        }
118        return;
119}
120
121function suchStrKey() { // Strassen nach num. Schluessel
122        global $street, $scalestr, $str_schl, $gkz, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
123        $linelimit=60;
124        if(preg_match("/\*/",$street)) {
125                $match=trim(preg_replace("/\*/i","%",$street));
126                // fuehrende Nullen eingeben oder fuehrende Wildcard
127        } else {
128                $match=str_pad($street, 5, "0", STR_PAD_LEFT); // "Wie eine Zahl" verarbeiten
129        }
130        $sql ="SELECT g.bezeichnung AS gemname, k.gml_id, k.bezeichnung, k.schluesselgesamt, k.lage ";
131        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
132        $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 ";
133        $sql.="WHERE k.lage LIKE $1 ";
134        switch ($gfilter) {
135                case 1: // Einzelwert
136                        $sql.="AND k.gemeinde=".$gemeinde." ";
137                        break;
138                case 2: // Liste
139                        $sql.="AND k.gemeinde in (".$gemeinde.") ";
140                        break;
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                $kgml=$row["gml_id"]; // ID von Katalog
154               
155// +++ in function_zeile_strasse()
156                echo "\n\t<div class='stl' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
157
158                        // Icon -> Buchnachweis
159                        echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
160                                echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.ico' width='16' height='16' alt='STR' title='Stra&szlig;e'>";
161                        echo "\n\t</a>";
162               
163                        echo $skey." <a class='st' href='".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$gkey."' title='".$gemname."'>".$sname;
164                        echo "</a>";
165                        switch ($gfilter) {
166                                case 0: // Kein Filter
167                                        echo " in ".$gemname;
168                                        break;
169                                case 2: // Liste
170                                        echo " in ".$gemname;
171                                        break;
172                        }
173                echo "</div>";
174// function ende
175                $cnt++;
176        }
177        if($cnt == 0) {
178                echo "\n<p class='anz'>Keine Stra&szlig;e mit Schl&uuml;ssel ".$match."</p>";
179        } elseif($cnt == 1) { // Eindeutig
180                $str_schl=$gkey; // dann gleich weiter
181        } elseif ($cnt >= $linelimit) {
182                echo "\n<p>".$cnt." Stra&szlig;en ... und weitere</p>";                 
183        } elseif ($cnt > 1) {
184                echo "\n<p class='anz'>".$cnt." Stra&szlig;en</p>";     
185        }       
186        return;
187}
188
189function suchHausZurStr($showParent) { // Haeuser zu einer Strasse
190        global $str_schl, $gkz, $scalestr, $scalehs, $epsg, $gemeinde, $epsg, $gfilter, $debug, $auskpath;
191
192        // Head
193        // Strasse zum Strassenschluessel
194        $sql ="SELECT g.bezeichnung AS gemname, k.gml_id AS kgml, k.bezeichnung, k.land, k.regierungsbezirk, k.kreis, k.gemeinde, k.lage ";
195        $sql.="FROM ax_lagebezeichnungkatalogeintrag as k ";
196        $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 ";
197        $sql.="WHERE k.schluesselgesamt = $1 LIMIT 1";
198        $v=array($str_schl);    // Schluessel-Gesamt ..
199        $res=pg_prepare("", $sql);
200        $res=pg_execute("", $v);
201        if($row = pg_fetch_array($res)) { // .. gefunden
202                $kgml=$row["kgml"]; // ID aus Katalog
203                $sname=$row["bezeichnung"];
204                $land =$row["land"];    // Einzel-Felder fÃŒr JOIN _lagebezeichnung_
205                $regb =$row["regierungsbezirk"];
206                $kreis=$row["kreis"];
207                $gemnd=$row["gemeinde"];
208                $nr=$row["lage"];
209                $gemname=htmlentities($row["gemname"], ENT_QUOTES, "UTF-8");
210                if ($showParent) {
211                        // EINE Koordinate zur Strasse besorgen
212                        // ax_Flurstueck >zeigtAuf> ax_LagebezeichnungOhneHausnummer
213                        $sqlko ="SELECT ";
214                        if($epsg == "25832") { // Transform nicht notwendig
215                                $sqlko.="st_x(st_Centroid(f.wkb_geometry)) AS x, ";
216                                $sqlko.="st_y(st_Centroid(f.wkb_geometry)) AS y ";
217                        } else {
218                                $sqlko.="st_x(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS x, ";
219                                $sqlko.="st_y(st_transform(st_Centroid(f.wkb_geometry), ".$epsg.")) AS y ";
220                        }
221                        $sqlko.="FROM ax_lagebezeichnungohnehausnummer o ";
222                        $sqlko.="JOIN alkis_beziehungen v ON o.gml_id=v.beziehung_zu ";
223                        $sqlko.="JOIN ax_flurstueck f ON v.beziehung_von=f.gml_id ";
224                        $sqlko.="WHERE o.land= $1 AND o.regierungsbezirk= $2 AND o.kreis= $3 AND o.gemeinde= $4 AND o.lage= $5 ";       
225                        $sqlko.="AND v.beziehungsart='zeigtAuf' LIMIT 1;"; // die erstbeste Koordinate
226                        $v=array($land,$regb,$kreis,$gemnd,$nr);
227                        $resko=pg_prepare("", $sqlko);
228                        $resko=pg_execute("", $v);
229                        if ($resko) {
230                                $rowko=pg_fetch_array($resko);
231                                $x=$rowko["x"];
232                                $y=$rowko["y"];
233                        } else {               
234                                echo "\n<p class='err'>Fehler bei Koordinate zur Stra&szlig;e</p>";
235                        }
236
237// +++ IN ARBEIT:
238                        echo "\n\t<div class='stu' title='Stra&szlig;enschl&uuml;ssel ".$skey."'>";
239                        // Icon -> Buchnachweis
240                        echo "\n\t<a title='Nachweis' href='javascript:imFenster(\"".$auskpath."alkisstrasse.php?gkz=".$gkz."&amp;gmlid=".$kgml."\")'>";
241                                echo "\n\t\t<img class='nwlink' src='ico/Lage_mit_Haus.ico' width='16' height='16' alt='STR' title='Stra&szlig;e'>";
242                        echo "\n\t</a>";
243
244                        if ($x > 0) { // Koord. bekommen?
245                                echo "\n\t<a title='Positionieren 1:".$scalestr."' href='javascript:"; // mit Link
246                                                echo "transtitle(\"auf Stra&szlig;e positioniert\"); ";
247                                                echo "parent.parent.parent.mb_repaintScale(\"mapframe1\",".$x.",".$y.",".$scalestr."); ";
248                                                echo "parent.parent.showHighlight(".$x.",".$y."); ";
249                                        //      echo "document.location.href=\"".$_SERVER['SCRIPT_NAME']."?gkz=".$gkz."&amp;gemeinde=".$gemeinde."&amp;epsg=".$epsg."&amp;str_schl=".$str_schl."\"";
250                                        echo "' "; // end href
251                                        echo "\n\t\tonmouseover='parent.parent.showHighlight(" .$x. "," .$y. ")' ";
252                                        echo "\n\t\tonmouseout='parent.parent.hideHighlight()'";
253                                echo ">\n\t\t".$sname." (".$nr.")\n\t</a>";
254                        } else { // keine Koord. gefunden
255                                echo $sname." (".$nr.")"; // nur Anzeige, ohne Link
256                        }
257                        switch ($gfilter) {
258                                case 0: // Kein Filter
259                                        echo " in ".$gemname;
260                                        break;
261                                case 2: // Liste
262                                        echo " in ".$gemname;
263                                        break;
264                        }                       
265                        echo "\n</div>";
266                }
267                echo "\n<hr>";
268
269                // Body
270                // Haeuser zum Strassenschluessel
271                $sql="SELECT min(replace(h.hausnummer,' ','')) AS hsnr, ";
272                if($epsg == "25832") { // Transform nicht notwendig
273                        $sql.="avg (st_x(p.wkb_geometry)) AS x, ";
274                        $sql.="avg (st_y(p.wkb_geometry)) AS y ";               
275                } else { 
276                        $sql.="avg (st_x(st_transform(p.wkb_geometry,".$epsg."))) AS x, ";
277                        $sql.="avg (st_y(st_transform(p.wkb_geometry,".$epsg."))) AS y ";               
278                }
279                $sql.="FROM ap_pto p JOIN alkis_beziehungen v ON p.gml_id = v.beziehung_von ";
280                $sql.="JOIN ax_lagebezeichnungmithausnummer h ON v.beziehung_zu = h.gml_id ";
281                $sql.="WHERE v.beziehungsart='dientZurDarstellungVon' AND p.art = 'HNR' ";
282                $sql.="AND h.land= $1 AND h.regierungsbezirk= $2 AND h.kreis= $3 AND h.gemeinde= $4 AND h.lage= $5 ";
283                $sql.="GROUP BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2) ";
284                $sql.="ORDER BY lpad(split_part(hausnummer,' ',1), 4, '0'), split_part(hausnummer,' ',2);";
285                // Problem: mehrere Koordinaten fÃŒr verschiedene MaßstÀbe der Kartendarstellung
286                // Diese sollten nicht mehrfach gelistet werden. FÃŒr Positionierung "irgendeine" nehmen.
287                // Lösung: ÃŒber GROUP BY in SQL. Alternative Lösungen wÀren:
288                //  1. Gruppenwechsel bei Abarbeitung des Result
289                //  2. Subquery mit LIMIT 1 statt JOIN
290                //  3. Geometrie aus GebÀude-Mittelpunkt statt aus PrÀsentationsobjekt der Hausnummer
291
292                $v=array($land,$regb,$kreis,$gemnd,$nr);
293                $resh=pg_prepare("", $sql);
294                $resh=pg_execute("", $v);
295                #echo "<p class='dbg'>SQL='".$sql."'<br>Array=".$v[]."</p>"; // TEST
296
297                $cnt=0;
298                $count=0;
299                echo "\n<table>";
300                while($rowh = pg_fetch_array($resh)) { // mehrere HsNr je Zeile
301                        if($count == 0){echo "\n<tr>";}
302                        $hsnr=$rowh["hsnr"];
303                        $x=$rowh["x"];
304                        $y=$rowh["y"];
305                        echo "\n\t<td class='hsnr'>";
306                                echo "<a href='";
307                                        echo "javascript:";
308                                        echo "transtitle(\"auf Haus ".$hsnr." 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 "'>".$hsnr."</a>";
314                        echo "</td>";
315                        $cnt++;
316                        $count++;
317                        if($count == 6) {
318                                echo "\n</tr>";
319                                $count = 0;
320                        }
321                }
322                if($count > 0) {echo "\n</tr>";}
323                echo "\n</table>";
324                if ($cnt > 1) {
325                        echo "\n<p class='anz'>".$cnt." Hausnummern</p>";
326                }
327        } else {
328                echo "\n<p class='anz'>Keine Stra&szlig;e</p>";
329        }
330        return;
331}
332// ===========
333// Start hier!
334// ===========
335if(isset($epsg)) {
336        $epsg = str_replace("EPSG:", "" , $_REQUEST["epsg"]);   
337} else {
338        $epsg=$gui_epsg; // aus Conf
339}
340if ($gemeinde == "") {
341        $gfilter = 0; // ungefiltert
342} elseif(strpos($gemeinde, ",") === false) {
343        $gfilter = 1; // Einzelwert
344} else {
345        $gfilter = 2; // Liste
346}
347
348// +++  Zerlegung Eingabe aus "Balken" von Buchauskunft "Lage":
349//                      Numerisch: Gem-Str-Haus-lfd
350
351if ($str_schl != "") { // aus Link
352        $trans="Hausnummern zur Stra&szlig;e";
353        suchHausZurStr(true);
354} elseif($street != "") { // Eingabe in Form
355        if (trim($street, "*,0..9") == "") { // Zahl, ggf. mit Wildcard
356                $trans="Suche Stra&szlig;enschl&uuml;ssel \"".$street."\"";
357                suchStrKey();
358        } else {
359                $trans="Suche Stra&szlig;enname \"".$street."\"";
360                suchStrName();
361        }
362        if(isset($str_schl)) { // Eindeutiges Ergebnis
363                $trans="1 Stra&szlig;e gefunden, Hausnummern";
364                suchHausZurStr(false);
365        }
366}
367// Titel im Kopf anzeigen
368echo "
369<script type='text/javascript'>
370        transtitle ('".$trans."') ;
371</script>";
372
373?>
374
375</body>
376</html>
Note: See TracBrowser for help on using the repository browser.