Esempio n. 1
0
        /// <summary><para>Die Funktion transformiert den internen generischen Schlüssel den Google Maps Schlüssel.
        /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
        ///
        /// <param name="tile">Ein <see cref="MapService.Info.MapServiceInternalMapTile"/>-Objekt mit dem internen Schlüssel.</param>
        /// <returns>Ein <see cref="MapService.Info.MapServiceGoogleMapsTile"/>-Objekt mit den Zugriffsdaten auf das Satellitenbild.</returns>
        internal MapService.Info.MapServiceGoogleMapsTile InternalToGoogle(MapService.Info.MapServiceInternalMapTile tile)
        {
            string key = tile.Key;
            int    zoom = key.Length - 1;
            int    iExp = key.Length - 1;
            int    x = 0; int y = 0;

            for (int i = 1; i < key.Length; i++)
            {
                iExp -= 1;
                string s = key.Substring(i, 1);
                if (s == "r")
                {
                    x += (int)Math.Pow(2, iExp);
                }
                ;
                if (s == "t")
                {
                    y += (int)Math.Pow(2, iExp);
                }
                ;
                if (s == "s")
                {
                    x += (int)Math.Pow(2, iExp); y += (int)Math.Pow(2, iExp);
                }
                ;
            }

            return(new MapService.Info.MapServiceGoogleMapsTile(x, y, zoom));
        }
Esempio n. 2
0
        /// <summary><para>Die interne Funktion berechnet den X/Y Bildpunkt auf einem Satellitenbild (Tile),
        /// der den geographischen Koordinaten im übergebenen <see cref="GeoUtility.GeoSystem.Geographic"/>-Objekt entspricht.
        /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
        ///
        /// <param name="tail">Ein <see cref="GeoUtility.GeoSystem.MapService.Info.MapServiceInternalMapTile"/>-Objekt.</param>
        /// <param name="size">Größe des Satellitenbildes (i.d.R. 256 Pixel)</param>
        /// <returns>Bildpunkt auf dem Satellitenbild als <see cref="GeoUtility.GeoSystem.Helper.GeoPoint"/>-Objekt, der den Koordinaten entspricht.</returns>
        internal GeoPoint WGSPixel(MapService.Info.MapServiceInternalMapTile tail, int size)
        {
            string key = tail.Key;                                  // Restkey, der nur die Pixelverschiebung im Bild enthält
            double left = 0, top = 0;
            double dsize = Convert.ToDouble(size);

            for (int i = 0; i < key.Length; i++)
            {
                double shift = dsize / (Math.Pow(2.0, i + 1));
                if ((key[i] == 's') || (key[i] == 't'))
                {
                    top += shift;
                }
                if ((key[i] == 'r') || (key[i] == 's'))
                {
                    left += shift;
                }
            }
            top  = Math.Round(top, 0);
            left = Math.Round(left, 0);
            return(new GeoPoint((int)left, (int)top));
        }
Esempio n. 3
0
        /// <summary><para>Die Funktion berechnet den neuen internen Schlüssel für das Satellitenbild (Tile),
        /// welches durch die Verschiebung in die angegebene Richtung ausgewählt wird. Die Funktion wird von der
        /// <see cref="MapService"/>-Klasse verwendet, und sollte nur über deren Methoden verwendet werden.
        /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
        ///
        /// <param name="tile">Interne generische Repräsentation des Schlüssels.</param>
        /// <param name="dir">Richtung der Verschiebung.</param>
        /// <returns>Den internen generischen Schlüssel im <see cref="MapService.Info.MapServiceInternalMapTile"/>-Objekt.</returns>
        internal MapService.Info.MapServiceInternalMapTile MapMove(MapService.Info.MapServiceInternalMapTile tile, MapService.Info.MapDirection dir)
        {
            char[] keyArray = tile.Key.ToCharArray();
            switch (dir)
            {
            case (MapService.Info.MapDirection.North):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 's')
                    {
                        keyArray[i] = 'r';
                        break;
                    }
                    else if (keyArray[i] == 't')
                    {
                        keyArray[i] = 'q';
                        break;
                    }
                    else if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 's';
                    }
                    else if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 't';
                    }
                }
                ;
                break;

            case (MapService.Info.MapDirection.Northeast):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 't')
                    {
                        keyArray[i] = 'r';
                        break;
                    }
                    else if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 's';
                    }
                    else if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 't';
                    }
                    else if (keyArray[i] == 's')
                    {
                        keyArray[i] = 'q';
                    }
                }
                ;
                break;

            case (MapService.Info.MapDirection.East):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 'r';
                        break;
                    }
                    else if (keyArray[i] == 't')
                    {
                        keyArray[i] = 's';
                        break;
                    }
                    else if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 'q';
                    }
                    else if (keyArray[i] == 's')
                    {
                        keyArray[i] = 't';
                    }
                }
                ;
                break;

            case (MapService.Info.MapDirection.Southeast):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 's';
                        break;
                    }
                    else if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 't';
                    }
                    else if (keyArray[i] == 's')
                    {
                        keyArray[i] = 'q';
                    }
                    else if (keyArray[i] == 't')
                    {
                        keyArray[i] = 'r';
                    }
                }
                ;
                break;

            case (MapService.Info.MapDirection.South):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 's';
                        break;
                    }
                    else if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 't';
                        break;
                    }
                    else if (keyArray[i] == 's')
                    {
                        keyArray[i] = 'r';
                    }
                    else if (keyArray[i] == 't')
                    {
                        keyArray[i] = 'q';
                    }
                }
                ;
                break;

            case (MapService.Info.MapDirection.Southwest):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 't';
                        break;
                    }
                    else if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 's';
                    }
                    else if (keyArray[i] == 's')
                    {
                        keyArray[i] = 'q';
                    }
                    else if (keyArray[i] == 't')
                    {
                        keyArray[i] = 'r';
                    }
                }
                ;
                break;

            case (MapService.Info.MapDirection.West):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 'q';
                        break;
                    }
                    else if (keyArray[i] == 's')
                    {
                        keyArray[i] = 't';
                        break;
                    }
                    else if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 'r';
                    }
                    else if (keyArray[i] == 't')
                    {
                        keyArray[i] = 's';
                    }
                }
                ;
                break;

            case (MapService.Info.MapDirection.Northwest):
                for (int i = keyArray.Length - 1; i >= 0; i--)
                {
                    if (keyArray[i] == 's')
                    {
                        keyArray[i] = 'q';
                        break;
                    }
                    else if (keyArray[i] == 'q')
                    {
                        keyArray[i] = 's';
                    }
                    else if (keyArray[i] == 'r')
                    {
                        keyArray[i] = 't';
                    }
                    else if (keyArray[i] == 't')
                    {
                        keyArray[i] = 'r';
                    }
                }
                ;
                break;
            }

            StringBuilder key = new StringBuilder();

            foreach (char c in keyArray)
            {
                key.Append(c.ToString());
            }

            return(new MapService.Info.MapServiceInternalMapTile(key.ToString()));
        }
        /// <summary><para>Die Funktion berechnet die linke untere Ecke und die Breite und Höhe des
        /// aktuellen Satellitenbilds (Tiles) aus dem übergebenen internen Schlüssel.
        /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
        ///
        /// <param name="tile">Ein <see cref="MapService.Info.MapServiceInternalMapTile"/>-Objekt mit dem internen generischen Schlüssel.</param>
        /// <returns>Koordinaten (linke untere Ecke), Größe und Mittelpunkt des Luftbilds.</returns>
        internal GeoRect MapDimension(MapService.Info.MapServiceInternalMapTile tile)
        {
            string key = tile.Key;

            if ((key == null) || (key.Length == 0) || (key.Substring(0, 1) != "t"))
            {
                throw new ErrorProvider.GeoException(new ErrorProvider.ErrorMessage("ERROR_MAPDIMENSION"));
            }

            double geoLaenge  = -180;   // geographische Länge
            double gridLaenge = 360;    // Breite des jeweiligen Quadranten
            double geoBreite  = -1;     // geographische Breite
            double gridHoehe  = 2;      // Höhe des jeweiligen Quadranten

            for (int i = 1; i < key.Length; i++)
            {
                gridLaenge /= 2;
                gridHoehe  /= 2;
                string c = key.Substring(i, 1);
                switch (c)
                {
                case "s":
                    geoLaenge += gridLaenge;
                    break;

                case "r":
                    geoBreite += gridHoehe;
                    geoLaenge += gridLaenge;
                    break;

                case "q":
                    geoBreite += gridHoehe;
                    break;

                case "t":
                    break;

                default:
                    throw new ErrorProvider.GeoException(new ErrorProvider.ErrorMessage("ERROR_MAPDIMENSION"));
                }
            }

            // Konvertierung nach Grad
            gridHoehe += geoBreite;
            gridHoehe  = (2 * Math.Atan(Math.Exp(Math.PI * gridHoehe))) - (Math.PI / 2);
            gridHoehe *= (180 / Math.PI);

            geoBreite  = (2 * Math.Atan(Math.Exp(Math.PI * geoBreite))) - (Math.PI / 2);
            geoBreite *= (180 / Math.PI);

            gridHoehe -= geoBreite;

            if (gridLaenge < 0)
            {
                geoLaenge  = geoLaenge + gridLaenge;
                gridLaenge = -gridLaenge;
            }

            if (gridHoehe < 0)
            {
                geoBreite = geoBreite + gridHoehe;
                gridHoehe = -gridHoehe;
            }

            return(new GeoRect(geoLaenge, geoBreite, gridLaenge, gridHoehe));
        }
Esempio n. 5
0
 /// <summary><para>Die interne Funktion berechnet den X/Y Bildpunkt auf einem Satellitenbild (Tile),
 /// der den geographischen Koordinaten im übergebenen <see cref="GeoUtility.GeoSystem.Geographic"/>-Objekt entspricht.
 /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
 ///
 /// <param name="tail">Ein <see cref="GeoUtility.GeoSystem.MapService.Info.MapServiceInternalMapTile"/>-Objekt.</param>
 /// <returns>Bildpunkt auf dem Satellitenbild als <see cref="GeoUtility.GeoSystem.Helper.GeoPoint"/>-Objekt, der den Koordinaten entspricht.</returns>
 internal GeoPoint WGSPixel(MapService.Info.MapServiceInternalMapTile tail)
 {
     return(WGSPixel(tail, 256));
 }
Esempio n. 6
0
        /// <summary><para>Die Funktion konvertiert den internen generischen Schlüssel in das Virtual Earth Format.
        /// <para>Die Funktion ist nur für interne Berechnungen bestimmt.</para></para></summary>
        ///
        /// <param name="tile">Ein <see cref="MapService.Info.MapServiceInternalMapTile"/>-Objekt mit dem internen Schlüssel.</param>
        /// <returns>Ein <see cref="MapService.Info.MapServiceVirtualEarthMapsTile"/>-Objekt mit den Zugriffsdaten auf das Satellitenbild.</returns>
        internal MapService.Info.MapServiceVirtualEarthMapsTile InternalToVirtualEarth(MapService.Info.MapServiceInternalMapTile tile)
        {
            string key   = tile.Key;
            string earth = "a";

            for (int i = 1; i < key.Length; i++)
            {
                switch (key.Substring(i, 1))
                {
                case "q": earth += "0"; break;

                case "r": earth += "1"; break;

                case "t": earth += "2"; break;

                case "s": earth += "3"; break;
                }
            }

            return(new MapService.Info.MapServiceVirtualEarthMapsTile(earth));
        }