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

Revision 330, 14.7 KB checked in by frank.jaeger, 10 years ago (diff)

Umstellung von PostNAS 0.7 auf PostNAS 0.8, ohne Tabelle "alkis_beziehungen".

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