Offline Map / Live Koordinaten abfrage

  • C

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Offline Map / Live Koordinaten abfrage

    Hallo, ich habe eine Frage bezüglich Maps.

    Ich habe nun das ganze Internet danach durchsucht und bin zwar auf einige Dinge gestoßen wie :

    - GMap mit Cache...
    - OpenStreetmap usw...

    Ich suche eine Karte die Offline verfügbar ist (Grobe Landschaft) für ein Simulator Projekt.

    Ich Empfange Daten Lat/Lon in eine Textbox was mit dem Simulator alle Sekunde abgerufen wird. Nun möchte ich gleichzeitig diese Daten in der Map nutzen.
    Eine "Moving Map" Interaktive Karte zum Anzeigen wo sich der Flieger befindet für groben Sichtflug.

    Welche karten kann man Offline nutzen (ohne großen Aufwand) bin mit c# (Anfänger)
    Ich habe Google Maps mal eingefügt und mit „ServerAndCache“ getestet was aber nur bis 32MB Kartenmaterial läd.

    Das mit dem Tiles verstehe ich allgemein nicht ganz wie das ganze geht.

    Ich habe Zoom auf 8 gestellt was Vollkommen reicht als Weltkarte das man größere Städte lesen kann.

    Die „tiles“ sind auch offline Nutzbar?

    Nico0 schrieb:

    Die „tiles“ sind auch offline Nutzbar?


    Warum sollten die nicht offline nutzbar sein. Es handelt sich um Bilder, die kannste ganz einfach speichern. Warum sollten die danach nicht Offline verwenderbar sein?

    Nico0 schrieb:

    Das mit dem Tiles verstehe ich allgemein nicht ganz wie das ganze geht.


    Also hier ist zu sehen, wie du die Tile-Koordinaten errechnen kannst lat und lng sind dir ja bekannt, Tile-Koordinaten brauchst du um eine URL zu bilden, wenn du da was nicht versteht, sag was du nicht verstehst, da du noch neu bist, vermute ich(ja bin frech) du kannst den JS code nicht zu VB übersetzen.

    Quellcode

    1. var TILE_SIZE = 256;
    2. function fromLatLngToPoint(latLng) {
    3. var mercator = -Math.log(Math.tan((0.25 + latLng.lat() / 360) * Math.PI));
    4. return {
    5. x: TILE_SIZE * (latLng.lng() / 360 + 0.5),
    6. y: TILE_SIZE / 2 * (1 + mercator / Math.PI)
    7. };
    8. }
    9. function fromLatLngToTileCoord(latLng, zoom) {
    10. var point = fromLatLngToPoint(latLng);
    11. var scale = Math.pow(2, zoom);
    12. return {
    13. x: Math.floor(point.x * scale / TILE_SIZE),
    14. y: Math.floor(point.y * scale / TILE_SIZE),
    15. z: zoom
    16. };
    17. }


    Schau mal die 3 0 in dieser Url vom Beispiel, deren Bedeutung: Zoom = 0, X = 0, Y = 0

    "https://www.googleapis.com/tile/v1/tiles/0/0/0?session=session token&key=YOUR_API_KEY"

    so wird dir die ganze Welt angezeigt. Da musst du die URL anpassen, errechne die Tile-Koordinaten und passe die URL an.

    Nochmal kurz und knapp:
    ->Api Key besorgen falls noch nicht geschehen
    ->Einen session-token erstellen, den brauchst du, wie auch den API-Key um die Tiles downloaden zu können
    ->Lade alle Tiles runter die du brauchst, aber vorsicht, du musst die Tiles noch zuordnen können. Das kannst du z.B. mit einem entsprechenden Dateinamen machen.

    ZoomLevel_X_Y.png oder jpg.
    Wobei ZoomLevel, X und Y durch die jeweiligen Werte zu ersetzen sind. So kannst du dann wieder die Tile Kooridnaten errechnen und das Bild laden, ähnlich wie bei der URL, musst du dann den Dateinamen bilden. Beachte auch das du weitere parameter verwenden kannst, wie z.B. orientation, hängste einfach passend an die URL an, also (&parametername=wert, beachte der erste parameter wird mir einem ?parametername=wert bekannt gemacht, alle weiteren werden mit &parametername=wert angehängt). Das muss auch im Dateinamen drin sein, sonst gibt es Chaos.

    ->Dann kannste rendern. Ist ein Tile zu klein für den ViewPort, renderst du die Tiles die daneben gehöhren auch. Das Tile zur aktuellen Position in der Mitte, die anderen rundherum.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Ich dachte mir das auszuprobieren, stellte fest als ich angemeldet war, das nicht alle so einfach Zugang zu den TileServern von google bekommen. Hast du denn nun was probiert? Wenn du bei Google auch festgestellt haben solltest, das du keinen Zugang bekommst, wäre es gut gewesen das hier zu schreiben! Es ist nicht gerade einfach an Tiles zu kommen, die meisten kostenlosen TileServer wie z.B. von OpenStreetMap erlauben keine Bulk downlaods. Heisst, lädst du zu viel, kann deine IP geblockt werden.

    Hab sogar selbst einen TileServer aufgesetzt, aber der Aufwand war imens und dauerte, vorallem das importieren der Daten in die DB, wobei ich nur die OSM Daten von deutschland genommen hab. Ich fand dann aber auch eine sehr einfache Lösung um an Tiles zu kommen. Dieses Programm:
    maperitive.net/

    Legt man Bounds auf der Karte fest, kann man diese Tiles selbst rendern(ohne bounds wird der bereich in der View genutzt, glaub nur im aktuellen zoomlevel), man kann auch eigene Regeln festlegen oder wie z.B. Google Maps regeln verwenden, gibt welche zur auswahl. Aber es ist besser eine eigene Map anzulegen, bounds auf Weltkarte markieren, und die OSM daten runterladen(nicht zu grosse bounds, server spielen sonst nicht mit, da musste dann ohne runterladen rendern). Die Weltkarte löschen, die eigene map als .OSM datei speichern. Wenn man das machst, geht das rendern schneller, weil die Daten schon runtergeladen sind und nicht beim rendern noch geladen werden müssen.

    Hier ist auch erklärt was es mit den DateiNamen/Pfaden auf sich hat: (und auch einige codebeispiele um Tile koordinaten zu berechnen und mehr und diversen Sprachen)
    wiki.openstreetmap.org/wiki/Slippy_map_tilenames


    Wenn du bounds gesetzet hast schreib das in die COmmand-textBox und bestätige. Je nach größe der Region, kann das eine ganze Weile dauern, besonders in den hohen zommleveln. Bei mir kamen(alle Zoomlevel) rund 1GB an Bilder raus, rund 143000 Stück.
    generate-tiles minzoom=1 maxzoom=18 tilesdir=Tiles\Nameregion

    Im ProgrammOrdner/Tiles findest du die Bilder.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Takafusa“ ()