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

Revision 339, 14.8 KB checked in by frank.jaeger, 10 years ago (diff)

Rückbau von "substring(gml_id)" in Views und Programmen.
Namensänderung von Schlüsseltabellen von ax_* auf v_*.

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