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

Revision 197, 13.0 KB checked in by frank.jaeger, 11 years ago (diff)

Kommentare zu Tabellen im Schema, Berechtigungen setzen für Buchauskunft und Nav, Vereinfachung bei Nav-Suche nach Hausnummern zur Straße

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