/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }