Thema: Luftaufnahmen
Einzelnen Beitrag anzeigen
  #29  
Alt 14.11.2013, 21:01
oanavodo oanavodo ist offline
NaviBoard Mitglied
 
Registriert seit: 12.04.2010
Beiträge: 75
Tileserver in CompeGPS Land integrieren V2 (Teil 1)

Tileserver in CompeGPS Land integrieren V2 (Teil 1)

Da ich jetzt immer mehr Tileserver (Luftbilder oder Karten) über Fiddler nach CompeGPS lade und die Handhabung eher eine Bastlerei ist, habe ich mir etwas besseres überlegt. Man muss am Skript nur einmal etwas ändern, und braucht dann nur die COSM-Dateien entsprechend konfigurieren.

Es sind alle Schritte aus der alten Beschreibung nochmal genannt, die geänderten sind mit (neu) gekennzeichnet. Die neue Beschreibung setzt also auf dem Original-Fiddler-Skript auf.

  1. Falls Microsoft .NET Frameworks 4.0 noch nicht auf dem System ist, von http://www.microsoft.com/de-de/downl...aspx?id=177183 downloaden und installieren. Danach Windowsupdate bemühen, um die vorhandenen Updates für das Framework einzuspielen.
  2. Downloaden des Fiddler Web Debugging Proxy von http://fiddler2.com und Fiddler installieren.
  3. Fiddler starten und STRG-R eingeben. Es erscheint ein separates Editorfenster, das ein Script enthält.
  4. (neu) Die Zeile 'static function OnBeforeRequest(oSession: Session) {' im Script suchen und davor folgende Zeilen einsetzen:
    Code:
        // converts x,y,z addressing to quadkey
        static private function quadKey(xs: String, ys: String, zs: String): String {
            var x: int = int.Parse(xs);
            var y: int = int.Parse(ys);
            var z: int = int.Parse(zs);
            var key: String = "";
            for (var i: int = z; i > 0; i--) {
                var digit: char = '0';
                var mask: int = 1 << (i - 1);
                if ((x & mask) != 0) digit++;
                if ((y & mask) != 0) digit += 2;
                key = key + digit.ToString();
            }
            return key;
        }
        static private function convertTileRequest(query: String): String {
            var pos: Int32 = query.LastIndexOf('|');
            if (pos == -1) return query;
            var path: String = query.Substring(0, pos);
            var nums: String[] = query.Substring(pos + 1).Split('.')[0].Split('/');
            if (nums.Length < 3) return path;
            //FiddlerObject.log(String.Format("coords: x={0} y={1} z={2}", nums[1], nums[2], nums[0]));
            var build: System.Text.StringBuilder = new System.Text.StringBuilder();
            var i: Int32 = 0;
            while (i < path.Length) {
                if ((path[i] != '{') || ((i + 4) > path.Length)) {
                    build.Append(path[i]);
                    i++;
                    continue;
                }
                var para: String = path.Substring(i, 4);
                switch(para) {
                case "{$x}":
                    build.Append(nums[1].ToString());
                    break;
                case "{$y}":
                    build.Append(nums[2].ToString());
                    break;
                case "{$z}":
                    build.Append(nums[0].ToString());
                    break;
                case "{$q}":
                    build.Append(quadKey(nums[1], nums[2], nums[0]));
                    break;
                default:
                    build.Append(para);
                    break;
                }
                i += para.Length;
            }
            return build.ToString();
        }
  5. (neu) Hinter die gesuchte Zeile folgende Zeilen einfügen:
    Code:
            // a compegps tile request is detected and converted
            if (oSession.hostname.Equals("example.com")) {
                var pos: Int32 = oSession.PathAndQuery.Substring(1).IndexOf('/') + 1;
                oSession.hostname = (pos > 1) ? oSession.PathAndQuery.Substring(1, pos - 1) : "localhost";
                oSession.PathAndQuery = convertTileRequest(oSession.PathAndQuery.Substring(pos));
            }
  6. Das Script abspeichern und den Editor beenden. Es müsste eine akustische Erfolgsmeldung hörbar sein.
  7. Im Menü unter File prüfen, ob 'Capture Traffic' aktiviert ist und den Fiddler Proxy beenden.
(neu) COSM-Dateien: CompeGPS Land braucht eine cosm-Datei für den entsprechenden Tileserver. Als Vorlage mit man z.b. die cosm-Datei für OpenStreetMap-Mapnik, welche ja von CompeGPS bereitgestellt wird.
Wichtig: OpenStreetMap und deren Ableger werden direkt von CompeGPS Land unterstützt. Dafür braucht man in der cosm-Datei keine spezielle Angabe der Web-Adresse. Das funktioniert auch ohne Fiddler. Aber für Tileserver mit anderer Abfrage-Schnittstelle schon.
  1. Eine Abfrage-URL für ein Tile besteht aus einer Serveradresse und einer Pfadangabe, die die gewünschte Kachel addressiert. In diesem Pfad ist eine X-Koordinate, eine Y-Koordinate und ein Zoomlevel (Z) enthalten. Microsoft-Tileabfragen enthalten einen Quadkey (Q), der alle drei Werte beinhaltet. Herausfinden kann man Adresse und Pfad z.b. durch Mitloggen der HTTP-Requests im Browser. Als Beispiel soll hier ein imaginärer Tileserver gelten:
    Code:
    http://t2.tileserver.com/tiles/v=1000&x=1&y=1&z=10
  2. In der Zeile WEB= der cosm-Datei schreibt man hinter das Gleichheitszeichen als Serveradresse 'http://example.com'. Die eigentliche Serveradresse des Tileservers hängt man, durch '/' getrennt, einfach dahinter (ohne http-prefix). Anhand der Serveradresse example.com (Beispieldomäne von IETF) erkennt das Fiddlerscript, dass es was tun muss.
  3. Hinter die Serveradresse hängt man, mit / getrennt, den Tilepfad an. Die Zahl der X-Koordinate ersetzt man durch '{$x}'. Daran erkennt das Skript, dass hier die X-Koordinate eingesetzt werden muss. Die Zahl der Y-Koordinate ersetzt man durch '{$y}' und die Zahl der Z-Komponente durch '{$z}'. Für einen Quadkey setzt man '{$q}' ein. Wichtig: Hinter dem kompletten Pfad muss noch ein Pipezeichen '|' angehängt werden. Das braucht das Skript als Markierung. Beim Beispiel würde die Zeile dann so aussehen:
    Code:
    WEB=http://example.com/t2.tileserver.com/tiles/v=1000&x={$x}&y={$y}&z={$z}|
  4. In der Zeile FORMAT= sollte noch das vom Tileserver verwendete Bildformat angegeben werden. Das ist entweder PNG oder JPG.
  5. Will man die maximale Zoomstufe verringern (MAXZOOMLEVEL), bitte nicht vergessen, dass dabei auch die entsprechenden Pixelgrößen angepasst werden müssen. Pro Zoomstufe die Werte um Faktor 2 verkleinern und bei PIXWIDTH/PIXHEIGHT, BitmapWidth/BitmapHeight und in <Calibration> auch angleichen.
  6. Die so erstellte Datei kann man mit CompeGPS Land öffnen. Wenn Fiddler parallel läuft, werden die Tiles in Kartenfenster angezeigt, ansonsten kommen rote Fragezeichen.
Servus

Geändert von oanavodo (12.08.2014 um 20:35 Uhr)
Mit Zitat antworten