Wie Karten in eigenes Programm einbinden?

Hallo zusammen,
ich wollte Fragen, wie ich Karten von OpenStreetMap in mein eigenes Programm einbinden könnte.

Also folgendes kann das Programm schon:
Den Längengrad und Breitengrad in Dezimal umrechnen, als auch in das UTM Koordinatensystem mit ihrem Rechts und Hochwert.

Was muss ich alles dabei beachten?
Was muss ich noch umrechnen?

Ich kenne z.B. das GPS Programm gpsdrive, was es kann

Oder gibt es irgendwo eine Website, bei der es erklärt wird

Cu Andy

Hallo Andy und herzlich willkommen im Forum.
Schau doch mal hier vorbei. Eigentlich geht es hier um das einbinden auf Webseiten, aber eventuell kannst du hier Ansätze finden für dein Programm. Code steht dort genug. :slight_smile:
Georg

Danke erst einmal.
Ist zwar hilfreich zum einbinden in eine Website, aber nicht zur gestaltung einer eigenen Software.

Wenn jemand noch einen Tipp hat, wäre ich dankbar für die Infos.

Cu Andy

Hallo Andy,

ebenfalls herzlich willkommen!

Deine Fragen sind noch recht allgemein, daher auch nur eine allgemeine Antwort.

Ich schreibe auch gerade ein Programm (in Java, als RCP-Anwendung (RCP = Rich Client Platform)). Alles was mit Darstellungen in Karten auf OSM-Basis zusammenhaengt, werde ich jedoch nicht direkt in diese Anwendung integrieren. Dazu rufe ich aus meiner Anwendung einen Browser auf und verwende OpenLayers (http://openlayers.org/). Das ist eine maechtige JavaScript-Bibliothek, die u.a. OSM-Karten anzeigt, diverse Controls von der Stange anbietet und ueber Layers andere Informationen als POI, Polygonzuege und Flaechen einblenden kann. Man kann mittels OpenLayers sogar geometrische Objekte in einer Karte editieren.

Auf diese Weise ist die kartenbasierte Darstellung zwar nicht direkt in meine Anwendung integriert, aber ich bin zu dem Schluss gekommen, dass mir dieses Vorgehen viel Arbeit spart, da ich Dinge, die OpenLayers kann, nicht noch einmal erfinden muss. Ach ja, in der RCP ist Jetty als WebServer integriert. Den (oder etwas adaequates) braucht man natuerlich, um OpenLayers mit den Daten zu fuettern, die man auf der Karte anzeigen will. Die Karte selbst wird als “Untergrund” vom OSM-Server geladen.

Fuer alles weitere muesstest Du Deine Anforderungen und Deine technischen Moeglichkeiten etwas mehr konkretisieren.

Noch ein Hinweis zu UTM: OpenLayers verwendet normalerweise Karten in sphaerischer Merkatorprojektion, nicht UTM. Dies scheint wohl ein “Standard” zu sein, den auch Google Maps und andere verwenden. Dafuer gibt es verschiedene Gruende, vgl. die Dokumentation von OpenLayers. Wenn Dir Daten in anderen Koordinaten vorliegen, ist das kein Problem, da OpenLayers die Moeglichkeit bietet, diese auf die sphaerische Merkatorprojektion umzurechnen. Das brauchst Du nicht zu programmieren. Es ist aber gut moeglich, dass OpenLayers auch Karten in anderen Projektionen anzeigen kann.

EDIT: URL als Link dargestellt.

Im Prinzip ist das ganz einfach. Du kannst Dir die Kacheln von Mapnik z.B. einfach aus dem Internet herunterladen. (Cachen für min 7 Tage nicht vergessen).

So sieht eine einzelne Kachel aus: http://a.tile.openstreetmap.org/16/34441/22864.png

So berechnet man die Kachelnummern aus den GPX-Koordinaten: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

Grüße
Dennis

Danke jetzt gehts.

Echt vielen Dank, hätte nie gewusst, wie ich das hinbekomme.
Das es so einfach ist, hätte ich nie gedacht.

Jetzt lädt er zwar die entsprechenden Dateien herunter, aber wie kann man die genau Position setzen, wo man gerade ist?

(Cachen für min 7 Tage nicht vergessen). = ???

An genau so etwas hatte ich uebrigends auch erst gedacht. Und daraus resultieren z.B. folgende Aufwaende/Fragen:

  1. Cachen, wie von Dennis angemerkt.

  2. Die notwendigen Kacheln ausrechnen und laden.

  3. Damit das Laden nicht zu lange braucht, sollten mehrere Threads die Kacheln parallel herunterladen und/oder die Anfragen auf mehrere Server verteilt werden.

  4. Zoom aendern, Karte verschieben,… waere auch zu programmieren.

  5. Brauchst Du Controls?

  6. Willst Du Daten in Form geometrischer Objekte auf der Karte darstellen?

Ich weiss nicht, ob die Kombi OpenLayers / Browser mehrere Threads nutzt, um das Herunterladen zu beschleunigen. Wenn ich mich recht erinnere, werden die Anfragen aber auf mehrere Server verteilt. OL laed auch mehr als die angezeigten Kacheln im Voraus herunter und speichert diese lokal im Browser. Dadurch geht das Verschieben schnell (responsive, wie es Neudeutsch heisst). Nur bei groesseren Verschiebungen muessen neue Kacheln nachgeladen werden.

Jenachdem, was Du (Andy) vorhast (ein bischen spielen und lernen, oder eine “Anwendung” im Sinne von Anwenden schreiben) wirst Du sicher auch auf die eine oder andere dieser Fragen stossen.

Cachen bedeutet, daß Du eine heruntergeladene Kachel auf der Festplatte für mindestens 7 Tage speichern sollst. Wenn Du die gleiche Kachel nochmal brauchst, mußt Du sie von der Festplatte laden. Ziel ist es, keine Kachel innerhalb von 7 Tagen doppelt vom Server herunter zu laden.

Du hast ja GPS-Positionen und rechnest damit die Kachel aus. Wenn Du auf Kachel 1000,5000 zu 492,5000 kommst, dann lädst Du Dir die Kachel 1000/492 vom Server und bist an der Position 0,5/0,5, also genau in der Mitte dieser Kachel. Daraus resultiert dann, wenn Du Kachel 1000,9999 zu 492,9999 ausrechnest, bist Du (fast) genau an der Ecke der Kachel.

Meine Idee, wäre in dein Programm ein Web-Steuerelement (Browser) integrieren und diesem dann mittels permalink an die richtige Stelle schicken. Das Setzen der Position eght natürlich auhc direkt über den html-Code. Damit ersparst du dir das, was schlauchboot und Denis schon geschrieben haben.

Hi Leuts,
erstmal danke für die Antworten.

Also ich lade sepperat 6 Kacheln herunter und setze sie dann dementsprechend im Screen.

Natürlich werden nun Kacheln geladen, die noch nie geladen wurden.
Desweiteren darf erst eine Kachel nach 7 Tagen wieder gedownloadet werden.

Also den Server “auf dem ich zugreife” überlaste ich bestimmt nicht.

Aber eine Frage nocheinmal zur Kachel.

Wenn ich z.B bei http://oms.wff.ch/calc.htm ausrechne,
dann habe ich die Kachel Zoom 16,x = 34144,y = 22923.

Wie aber setze ich jetzt einen Punkt in die Kachel, die long = 7.56198,lat 47.47607 entsprechen?

Das ist das einzigste, was ich noch nicht weiss.

Vielen Dank nochmal an Euch.

Na, das ist doch einfacher Dreisatz.

Beispiel:

Du weisst, das die linke Kachelgrenze lon=7.0 ist und die rechte lon=8.0.

Dann ist 7.56198 bei 56.1 % der Kachelbreite, also wenn die Kachel 256px
breit ist, bei pixel x= 144.

Chris

Die OSM-Kacheln sind mittels spherical Merkator projeziert. Die Zoom-Level-abhängige Vorschrift ergibt sich aus den Beschreibungen, auf die DennisB in Post 5(?) verwiesen hat. Damit solltest Du das umrechnen können (macht OpenLayers z.B. automatisch… ;-))

Also verstehe ich es doch richtig?

7.56198 zwischen long 7.0 und long 8.0
damit wäre ich dann bei 7.56198 = 56,198 %

Wenn jetzt die Kachel 256 breit ist, dann wäre es bei Pixel

256/100*56,1988 = 143,36

für die Höhe das gleiche

47.47607 zwischen lat 47 und lat 48
damit wäre ich dann bei 47.47607 = 47,607%

Wenn jetzt die kachel 256 hoch ist, dann wäre es bei Pixel

256/100*47,607 = 121,87392

Ist dies nur bei Zoom 16 so?
Ich glaube bei anderem Zoom, verändern sich die Abstände

@schlauchboot ich hab es schon so erledigt, ich meine die Umrechnung von long lat in x und y
die kacheln werden auch schon geladen.
Das einzigste ist, den genauen punkt in die kachel zu setzen, wo ich mich gerade befinde

Diese einfache lineare Abbildung kannst Du vermutlich nur in hohen zoom Stufen machen.

Ansonsten gibt es in y-Richtung Abweichungen zur echten mercator projection,
da diese nicht linear ist.

Chris

Mist.
Ich versteh nicht,was ihr gerade meint

Die Zoom-Level ist egal. Wenn Dir ausrechnest, daß Du die Kachel 7643,45 brauchst, dann ist das die Kachel 7643 und Du bist bei 45% der Kachel. Wenn Du Dir ausrechnest, daß Du Kache 7,323453 brauchst, ist das die Kacel 7 und Du bist bei 32,3453& der Kachel.

Das funktioniert fast Perfekt. Denn die Erde ist ja rund und der Monitor Flach. Somit wird die Kugel gerade gezerrt. Und durch diese Verzerrungen bekommst Du leichte Abweichungen diese dürften aber so klein sein, daß Du sie gar nicht bemerkst.

Grüße
Dennis

Ich versteh es immer noch nicht.
Glaube, dass ich aufm Schlauch stehe.
Bin ja nur ein Programmierer.

http://a.tile.openstreetmap.org/16/34144/22923.png

Zoom 16

lon = 7.56198
x = 34144

lat = 47.47607
y = 22923

jetzt wird zwar die Kachel geladen, aber ich weiss nicht, wo genau ich den Punkt auf diese Kachel setzen muss (lon u. lat).

Unter Punkt setzen verstehe ich, wo halt genau die lat und longitude ist

Edit:
Wie sieht es mit dem Vermerk aus, dass die Grafikdaten von openstreetmap stammen, wenn ich es in mein Programm einbaue?

blubb

schau mal im OSM-Wiki unter Lizenz oder Legal.

@Andy123: Ist das “Blubb” nur um das Posting in der zeitlichen Sortierung dieses Forums neu nach oben zu schieben? Und das schon nach < 1 Tag? Was hälst Du denn von Nachkommastellen bei X und Y?