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

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

Views um Thema "Bodenschätzung" erweitert, Mapbender-Nav korrigiert, sichten.sql wurde geteilt

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