source: trunk/var/www/info/alkis/alkislage.php @ 78

Revision 78, 16.4 KB checked in by frank.jaeger, 12 years ago (diff)
Line 
1<?php
2/*      alkislage.php
3
4        ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
5        Kann die 3 Arten von Lagebezeichnung anzeigen und verbundene Objekte verlinken
6
7        Version:         15.09.2010  Function "buchungsart" durch JOIN ersetzt
8        01.10.2010  Flaeche umgruppiert
9        14.12.2010  Pfad zur Conf
10        17.12.2010  Astrid Emde: Prepared Statements (pg_query -> pg_prepare + pg_execute)
11        01.02.2011  *Left* Join - Fehlertoleranz bei unvollstaendigen Schluesseltabellen
12*/
13ini_set('error_reporting', 'E_ALL & ~ E_NOTICE');
14session_start();
15$gkz=urldecode($_REQUEST["gkz"]);
16require_once("alkis_conf_location.php");
17if ($auth == "mapbender") {
18        // Bindung an Mapbender-Authentifizierung
19        require_once($mapbender);
20}
21include("alkisfkt.php");
22?>
23<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
24<html>
25<head>
26        <meta name="author" content="F. Jaeger krz" >
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 Lagebezeichnung</title>
32        <link rel="stylesheet" type="text/css" href="alkisauszug.css">
33        <link rel="shortcut icon" type="image/x-icon" href="ico/Lage_mit_Haus.ico">
34        <style type='text/css' media='print'>
35                .noprint {visibility: hidden;}
36        </style>
37</head>
38<body>
39<?php
40$gmlid=urldecode($_REQUEST["gmlid"]);
41$ltyp=urldecode($_REQUEST["ltyp"]); // 3 Arten Lage-Typ
42switch ($ltyp) {
43        case "m": // "Mit HsNr"     = Hauptgebaeude
44                $tnam = "ax_lagebezeichnungmithausnummer";
45        break;
46        case "p": // "mit PseudoNr" = Nebengebaeude
47                $tnam = "ax_lagebezeichnungmitpseudonummer";
48        break;
49        case "o": //"Ohne HsNr"    = Gewanne oder Strasse
50                $tnam = "ax_lagebezeichnungohnehausnummer";
51        break;
52        default:
53                $ltyp = "m";
54                $tnam = "ax_lagebezeichnungmithausnummer";
55        break;
56}
57$id = isset($_GET["id"]) ? $_GET["id"] : "n";
58if ($id == "j") {
59        $idanzeige=true;
60} else {
61        $idanzeige=false;
62}
63$keys = isset($_GET["showkey"]) ? $_GET["showkey"] : "n";
64if ($keys == "j") {
65        $showkey=true;
66} else {
67        $showkey=false;
68} $con = pg_connect("host=".$dbhost." port=" .$dbport." dbname=".$dbname." user=".$dbuser." password=".$dbpass);
69if (!$con) echo "<p class='err'>Fehler beim Verbinden der DB</p>\n";
70
71// Lagebezeichnung
72$sql ="SELECT s.bezeichnung AS snam, g.bezeichnung AS gnam, l.land, l.regierungsbezirk, l.kreis, l.gemeinde, l.lage, ";
73switch ($ltyp) {
74        case "m": // "Mit HsNr"
75                $sql.="l.hausnummer ";
76        break;
77        case "p": // "mit PseudoNr"
78                $sql.="l.pseudonummer, l.laufendenummer ";
79        break;
80        case "o": //"Ohne HsNr"
81                $sql.="l.unverschluesselt ";
82        break;
83}
84$sql.="FROM ".$tnam." l ";
85
86// Gemeinde entschluesseln
87$sql.="LEFT JOIN  ax_gemeinde g ON l.kreis=g.kreis AND l.gemeinde=g.gemeinde ";
88
89// Strasse entschluesseln
90$sql.="LEFT JOIN ax_lagebezeichnungkatalogeintrag s ";
91// Besonderheit: unterschiedliche Feldformate und Fuellungen!!!
92
93switch ($ltyp) {
94        case "o": //"Ohne HsNr"
95                // hier beide .lage als Char(5)
96                //  in ax_lagebezeichnungKatalogeintrag mit fÃŒhrenden Nullen
97                //  in ax_lagebezeichnungOhneHausnummer jedoch ohne fÃŒhrende Nullen
98                $sql.="ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND l.lage=trim(leading '0' from s.lage) ";
99        break;
100        default: // "Mit HsNr" + "mit PseudoNr"
101                // ax_LagebezeichnungKatalogeintrag.lage   ist char,
102                // ax_LagebezeichnungMitHausnummer.lage    ist integer,
103                // ax_lagebezeichnungMitPseudonummer.lage  ist integer,
104                $sql.="ON l.kreis=s.kreis AND l.gemeinde=s.gemeinde AND to_char(l.lage, 'FM00000')=s.lage ";
105        break;
106}
107$sql.="WHERE l.gml_id= $1;";
108
109$v = array($gmlid);
110$res = pg_prepare("", $sql);
111$res = pg_execute("", $v);
112
113if (!$res) echo "\n<p class='err'>Fehler bei Lagebezeichnung\n<br>".$sql."</p>\n";
114
115if ($row = pg_fetch_array($res)) {
116        $land =$row["land"];
117        $regbez=$row["regierungsbezirk"];
118        $kreis=$row["kreis"];
119        $gem  =$row["gemeinde"];
120        $gnam =$row["gnam"];
121        $lage =$row["lage"]; // Strassenschluessel
122        $snam =$row["snam"]; //Strassennamen
123        $unver=$row["unverschluesselt"]; // Gewanne
124        $kennz=$land."-".$regbez."-".$kreis."-".$gem."-".$lage."-";
125
126        switch ($ltyp) {
127
128                case "m": // "Mit HsNr"
129                        $hsnr=$row["hausnummer"];
130                        $kennz.=$hsnr;
131                        $untertitel="Hauptgeb&auml;ude mit Hausnummer";
132                        // Balken
133                        echo "<p class='lage'>ALKIS Lagebezeichnung mit Hausnummer ".$kennz."&nbsp;</p>\n"; // Balken
134                break;
135
136                case "p": // "mit PseudoNr"
137                        $pseu=$row["pseudonummer"];
138                        $lfd=$row["laufendenummer"];
139                        $kennz.=$pseu."-".$lfd;
140                        $untertitel="NebengebÀude mit laufender Nummer (Lagebezeichnung mit Pseudonummer)";
141                        // Balken
142                //      echo "<p class='lage'>ALKIS Lagebezeichnung mit Pseudonummer ".$kennz."&nbsp;</p>\n"; // Balken
143                        echo "<p class='lage'>ALKIS Lagebezeichnung NebengebÀude ".$kennz."&nbsp;</p>\n"; // Balken
144                break;
145
146                case "o": //"Ohne HsNr"
147                        if ($lage == "") {
148                                $kennz=" - ".$unver;
149                        } else {
150                                $kennz.=$unver;                         }                         $untertitel="Stra&szlig;e ohne Hausnummer und/oder Gewanne (unverschl&uuml;sselte Lage)";
151                        // Balken
152                        echo "<p class='lage'>ALKIS Lagebezeichnung Ohne Hausnummer ".$kennz."&nbsp;</p>\n"; // Balken
153                break;
154        }
155 } else {
156        echo "<p class='err'>Fehler! Kein Treffer fuer gml_id=".$gmlid."</p>";
157}
158
159echo "\n<h2><img src='ico/Lage_mit_Haus.ico' width='16' height='16' alt=''> Lagebezeichnung</h2>\n";
160
161echo "<p>Typ: ".$untertitel."</p>";
162
163echo "\n<table class='outer'>\n<tr>\n\t<td>";
164        // Tabelle Kennzeichen
165        // ToDo: !! kleiner, wenn ltyp=0 und die Schluesselfelder leer sind
166        echo "\n\t<table class='kennzla' title='Lage'>";
167                echo "\n\t<tr>";
168                        echo "\n\t\t<td class='head'>Land</td>";
169                        echo "\n\t\t<td class='head'>Reg.-Bez.</td>";
170                        echo "\n\t\t<td class='head'>Kreis</td>";
171                        echo "\n\t\t<td class='head'>Gemeinde</td>";
172                        echo "\n\t\t<td class='head'>Stra&szlig;e</td>";
173                        switch ($ltyp) {
174                                case "m": // "Mit HsNr"
175                                        echo "\n\t\t<td class='head'>Haus-Nr</td>";
176                                break;
177                                case "p": // "mit PseudoNr"
178                                        echo "\n\t\t<td class='head'>Haus-Nr</td>";
179                                        echo "\n\t\t<td class='head'>lfd.-Nr</td>";
180                                break;
181                                case "o": //"Ohne HsNr"
182                                        echo "\n\t\t<td class='head'>unverschl&uuml;sselte Lage</td>";
183                                break;
184                        }
185                echo "\n\t</tr>";
186                echo "\n\t<tr>";
187                        echo "\n\t\t<td title='Bundesland'>".$land."</td>";
188                        echo "\n\t\t<td title='Regierungsbezirk'>".$regbez."</td>";
189                        echo "\n\t\t<td title='Kreis'>".$kreis."</td>";
190                        echo "\n\t\t<td title='Gemeinde'>";
191                        if ($showkey) {
192                                echo "<span class='key'>".$gem."</span><br>";
193                        }
194                        echo $gnam."</td>";
195                        echo "\n\t\t<td title='Stra&szlig;e'>";
196                        if ($showkey) {
197                                echo "<span class='key'>".$lage."</span><br>";
198                        }
199                        echo $snam."</td>";
200                        switch ($ltyp) {
201                                case "m":
202                                        echo "\n\t\t<td title='Hausnummer und Zusatz'><span class='wichtig'>".$hsnr."</span></td>";
203                                break;
204                                case "p":
205                                        echo "\n\t\t<td title='Pseudonummer - Nebengeb&auml;ude zu dieser Hausnummer'>".$pseu."</td>";
206                                        echo "\n\t\t<td title='Laufende Nummer Nebengeb&auml;ude'><span class='wichtig'>".$lfd."</span></td>";
207                                break;
208                                case "o":
209                                        echo "\n\t\t<td title='Gewanne'><span class='wichtig'>".$unver."</span></td>";
210                                break;
211                        }
212                echo "\n\t</tr>";
213        echo "\n\t</table>";
214
215        echo "\n\t</td>\n\t<td>";
216
217        // Kopf Rechts: weitere Daten?
218        // z.B. hier Ausgabe von "georeferenzierte GebÀudeadresse" ?
219        if ($idanzeige) {linkgml($gkz, $gmlid, "Lage"); }
220
221echo "\n\t</td>\n</tr>\n</table>";
222// Ende Seitenkopf
223
224// F L U R S T U E C K E
225if ($ltyp <> "p") { // Pseudonummer linkt nur GebÀude
226        echo "\n\n<a name='fs'></a><h3><img src='ico/Flurstueck.ico' width='16' height='16' alt=''> Flurst&uuml;cke</h3>\n";
227        echo "\n<p>mit dieser Lagebezeichnung.</p>";
228        // ax_Flurstueck  >weistAuf>  ax_LagebezeichnungMitHausnummer
229        // ax_Flurstueck  >zeigtAuf>  ax_LagebezeichnungOhneHausnummer
230        switch ($ltyp) {
231                case "m":
232                        $bezart="weistAuf";
233                break;
234                case "o":
235                        $bezart="zeigtAuf";
236                break;
237        }
238        $sql="SELECT g.gemarkungsnummer, g.bezeichnung, ";
239        $sql.="f.gml_id, f.flurnummer, f.zaehler, f.nenner, f.regierungsbezirk, f.kreis, f.gemeinde, f.amtlicheflaeche ";
240        $sql.="FROM ax_flurstueck f ";
241        $sql.="JOIN alkis_beziehungen v ON f.gml_id=v.beziehung_von ";
242        $sql.="LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer ";
243        $sql.="WHERE v.beziehung_zu= $1 "; // id Lage
244        $sql.="AND v.beziehungsart= $2 ";
245        $sql.="ORDER BY f.gemarkungsnummer, f.flurnummer, f.zaehler, f.nenner;";
246
247        $v = array($gmlid,$bezart);
248        $resf = pg_prepare("", $sql);
249        $resf = pg_execute("", $v);
250
251        if (!$resf) {echo "<p class='err'>Fehler bei Flurst&uuml;ck<br><br>".$sql."</p>\n";}
252
253        echo "\n<table class='fs'>";
254        echo "\n<tr>"; // Kopfzeile der Tabelle
255                echo "\n\t<td class='head'>Gemarkung</td>";
256                echo "\n\t<td class='head'>Flur</td>";
257                echo "\n\t<td class='head' title='Flurst&uuml;cksnummer (Z&auml;hler / Nenner)'>Flurst.</td>";
258                echo "\n\t<td class='head fla'>Fl&auml;che</td>";
259                echo "\n\t<td class='head nwlink noprint' title='Link: weitere Auskunft'>weit. Auskunft</td>";
260        echo "\n</tr>";
261        $j=0;
262        while($rowf = pg_fetch_array($resf)) {
263                $flur=str_pad($rowf["flurnummer"], 3, "0", STR_PAD_LEFT);
264
265                //$fskenn=str_pad($rowf["zaehler"], 5, "0", STR_PAD_LEFT);
266                //if ($rowf["nenner"] != "") {$fskenn.="/".str_pad($rowf["nenner"], 3, "0", STR_PAD_LEFT);}
267
268                $fskenn=$rowf["zaehler"]; // Bruchnummer (ohne fuehrende Nullen)
269                if ($rowf["nenner"] != "") {
270                        $fskenn.="/".$rowf["nenner"];
271                }
272
273                $flae=number_format($rowf["amtlicheflaeche"],0,",",".") . " m&#178;";
274                echo "\n<tr>";                         echo "\n\t<td>";
275                        if ($showkey) {
276                                echo "<span class='key'>".$rowf["gemarkungsnummer"]."</span> ";
277                        }
278                        echo $rowf["bezeichnung"]."</td>";
279                        echo "\n\t<td>".$flur."</td>";
280                        echo "\n\t<td><span class='wichtig'>".$fskenn."</span>";
281                                if ($idanzeige) {linkgml($gkz, $rowf["gml_id"], "Flurst&uuml;ck");}
282                        echo "</td>";
283                        echo "\n\t<td class='fla'>".$flae."</td>";
284                        echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
285                                echo "\n\t\t<a href='alkisfsnw.php?gkz=".$gkz."&amp;gmlid=".$rowf["gml_id"]."&amp;eig=n";
286                                if ($idanzeige) {echo "&amp;id=j";}
287                                if ($showkey)   {echo "&amp;showkey=j";}
288                                echo "' title='Flurst&uuml;cksnachweis'>Flurst&uuml;ck <img src='ico/Flurstueck_Link.ico' width='16' height='16' alt=''></a>";
289                        echo "\n\t\t</p>\n\t</td>";
290                echo "\n</tr>";
291                $j++;
292        }
293        echo "\n</table>";
294}
295
296// L A G E
297// andere Lage mit gleicher Hausnummer suchen
298if ($ltyp <> "o") { // nicht bei Gewanne (Ohne HsNr)
299        echo "\n\n<a name='lage'></a><h3><img src='ico/Lage_mit_Haus.ico' width='16' height='16' alt=''> Lage</h3>\n";
300        echo "\n<p>andere Lagebezeichnungen zur gleichen Hausnummer.</p>";
301        $whereclaus="WHERE land= $1 AND regierungsbezirk= $2 AND kreis= $3 AND gemeinde= $4 AND lage= $5 ";
302        $url=$self."gkz=".$gkz."&amp;id=".$id."&amp;gmlid="; // Basis
303
304        switch ($ltyp) {
305                case "m": // aktuell Hausnummer gefunden
306                        // dazu alle NebengebÀude suchen
307                        echo "\n<p>Nebengeb&auml;ude: ";
308                        $sql ="SELECT l.gml_id, l.laufendenummer FROM ax_lagebezeichnungmitpseudonummer l ";
309                        $sql.=$whereclaus."AND lage= $6 AND pseudonummer= $7 ORDER BY laufendenummer;";
310                // pseudonummer character varying(5), laufendenummer character varying(2),
311
312                        $v = array($land,$regbez,$kreis,$gem,$lage,$lage,$hsnr);
313                        $res = pg_prepare("", $sql);
314                        $res = pg_execute("", $v);
315
316                        if (!$res) echo "\n<p class='err'>Fehler bei Nebengeb&auml;ude.<br>".$sql."</p>\n";
317                        while($row = pg_fetch_array($res)) {
318                                echo "\n\t<a href='".$url.$row["gml_id"]."&amp;ltyp=p'>lfd.-Nr ".$row["laufendenummer"]."</a>&nbsp;&nbsp;";
319                        }
320                        echo "\n</p>";
321                break;
322
323                case "p": // aktuell NebengebÀude: Haupt- und NebengebÀude suchen
324                        echo "\n<p>Hauptgeb&auml;ude: ";
325                        $sql ="SELECT l.gml_id FROM ax_lagebezeichnungmithausnummer l ";
326                        $sql.=$whereclaus."AND hausnummer= $6;";
327
328                        $v = array($land,$regbez,$kreis,$gem,$lage,$pseu);
329                        $res = pg_prepare("", $sql);
330                        $res = pg_execute("", $v);
331
332                        if (!$res) echo "<p class='err'>Fehler bei Hauptgeb&auml;ude.<br>".$sql."</p>\n";
333                        while($row = pg_fetch_array($res)) {
334                                echo "\n\t<a href='".$url.$row["gml_id"]."&amp;ltyp=m'>Haus-Nr ".$pseu."</a>&nbsp;&nbsp;";
335                        }
336                        echo "\n</p>";
337
338                        echo "\n<p>weitere Nebengeb&auml;ude: ";
339                        $sql ="SELECT l.gml_id, l.laufendenummer FROM ax_lagebezeichnungmitpseudonummer l ";
340                        $sql.=$whereclaus."AND pseudonummer= $6 AND laufendenummer <> $7 ORDER BY laufendenummer;";
341
342                        $v = array($land,$regbez,$kreis,$gem,$lage,$pseu,$lfd);
343                        $res = pg_prepare("", $sql);
344                        $res = pg_execute("", $v);
345
346                        if (!$res) echo "\n<p class='err'>Fehler bei Nebengeb&auml;ude.<br>".$sql."</p>\n";
347                        while($row = pg_fetch_array($res)) {
348                                echo "\n\t<a href='".$url.$row["gml_id"]."&amp;ltyp=p'>lfd.-Nr ".$row["laufendenummer"]."</a>&nbsp;&nbsp;";
349                        }
350                        echo "\n</p>";
351                break;         }
352}
353
354// G E B A E U D E
355
356// Mittelfristig ist zu ueberlegen, ob hier weitere Einzelheiten dargestellt werden,
357// oder ob nicht besser ein eigenes Modul alkisgebaeude.php dies uebernehmen sollte.
358// Dort sollten auch diese Relationen abgebildet werden:
359//  ax_gebaeude >gehoertZu> ax_gebaeude  (ringförmige Verbindung GebÀudekomplex)
360//  ax_gebaeude (umschliesst) ax_bauteil
361//  ax_gebaeude >gehoert> ax_person  (Ausnahme)
362
363if ($ltyp <> "o") { // OhneHsNr linkt nur Flurst.
364        echo "\n\n<a name='geb'></a><h3><img src='ico/Haus.ico' width='16' height='16' alt=''> Geb&auml;ude</h3>";
365        echo "\n<p>mit dieser Lagebezeichnung.</p>";
366        switch ($ltyp) {
367                case "p":
368                        $bezart="hat";
369                        break;
370                case "m":
371                        $bezart="zeigtAuf";
372                        break;
373        }
374        $sql ="SELECT g.gml_id, g.gebaeudefunktion, g.description, g.name, g.lagezurerdoberflaeche, g.bauweise, g.anzahlderoberirdischengeschosse AS aog, g.grundflaeche, g.individualname, g.zustand, ";
375        $sql.="round(area(g.wkb_geometry)::numeric,2) AS flaeche, h.bauweise_beschreibung, u.bezeichner ";
376        $sql.="FROM ax_gebaeude g ";
377        $sql.="JOIN alkis_beziehungen v ON g.gml_id=v.beziehung_von ";
378        $sql.="LEFT JOIN ax_gebaeude_bauweise h ON g.bauweise = h.bauweise_id ";
379        $sql.="LEFT JOIN ax_gebaeude_funktion u ON g.gebaeudefunktion = u.wert ";
380        $sql.="WHERE v.beziehung_zu= $1 ";
381        $sql.="AND   v.beziehungsart= $2 ;";
382
383        $v = array($gmlid,$bezart);
384        $res = pg_prepare("", $sql);
385        $res = pg_execute("", $v);
386
387        if (!$res) echo "<p class='err'>Fehler bei Gebaeude.<br>".$sql."</p>\n";
388        $i=0;
389        while($row = pg_fetch_array($res)) { // Only You!
390                echo "<p>";
391                        if ($idanzeige) {linkgml($gkz, $row["gml_id"], "Geb&auml;ude");}
392                echo "</p>";
393                echo "\n<table>";
394
395                        echo "\n\t<tr><td>Funktion:</td><td>";
396                        if ($showkey) {
397                                echo "<span class='key'>".$row["gebaeudefunktion"]."</span> ";
398                        }
399                        echo $row["bezeichner"]."</td></tr>"; // integer
400
401                        if (!$row["description"] == "") {
402                                echo "\n\t<tr><td>Beschreibung:</td><td>".$row["description"]."</td></tr>"; // integer - EntschlÃŒsseln!
403                        }
404
405                        if (!$row["name"] == "") {
406                                echo "\n\t<tr><td>Name:</td><td>".$row["name"]."</td></tr>"; // char(25)
407                        }
408
409                        if (!$row["lagezurerdoberflaeche"] == "") {
410                                echo "\n\t<tr><td>Lage zur Erdoberfl&auml;che:</td><td>".$row["lagezurerdoberflaeche"]."</td></tr>";
411                        } // integer - EntschlÃŒsseln!
412
413                        if (!$row["bauweise"] == "") {
414                                echo "\n\t<tr><td>Bauweise:</td><td>";
415                                if ($showkey) {
416                                        echo "<span class='key'>".$row["bauweise"]."</span> ";
417                                }
418                                echo $row["bauweise_beschreibung"]."</td></tr>"; // integer
419                        }
420
421                        if (!$row["aog"] == "") {
422                                echo "\n\t<tr><td>Anz. der oberird. Geschosse:</td><td>".$row["aog"]."</td></tr>"; //
423                        }
424
425                        if (!$row["grundflaeche"] == "") {
426                                echo "\n\t<tr><td>Grundfl&auml;che:</td><td title='Buchfl&auml;che'>".$row["grundflaeche"]."</td></tr>"; // integer
427                        }
428
429                        echo "\n\t<tr><td>Geometrische Fl&auml;che:</td><td title='berechnete Fl&auml;che'>".$row["flaeche"]." m&#178;</td></tr>";
430
431                        if (!$row["individualname"] == "") {
432                                echo "\n\t<tr><td>Individualname:</td><td>".$row["individualname"]."</td></tr>"; // char(7)
433                        }
434
435                        if (!$row["zustand"] == "") {
436                                echo "\n\t<tr><td>Zustand:</td><td>".$row["zustand"]."</td></tr>"; // integer
437                        }
438
439                echo "\n</table>";
440        }
441}
442
443?>
444
445<form action=''>
446        <div class='buttonbereich noprint'>
447        <hr>
448                <input type='button' name='back'  value='&lt;&lt;' title='Zur&uuml;ck'  onClick='javascript:history.back()'>&nbsp;
449                <input type='button' name='print' value='Druck' title='Seite Drucken' onClick='window.print()'>&nbsp;
450                <input type='button' name='close' value='X' title='Fenster schlie&szlig;en' onClick='window.close()'>
451        </div>
452</form>
453
454<?php footer($gkz, $gmlid, $idumschalter, $idanzeige, $_SERVER['PHP_SELF']."?", $hilfeurl, "&amp;ltyp=".$ltyp , $showkey); ?>
455
456</body>
457</html>
458
Note: See TracBrowser for help on using the repository browser.