Karte automatisch laden ?

Hallo,
wir haben da ein Studiumprojekt am laufen in dem wir einen Empfänger orten wollen und auf der jeweiligen Umgebungskarte darstellen wollen.

Dazu wollen wir je nach den Empfängerdaten, also Längegrad,Breitegrad usw. automatisch die jeweilige Karte von OpenStreetMap mit maximaler Zoom-Stufe Herunterladen und dann in nem programm weiterverarbeiten.

Meine frage nun, wie kann man das realisieren, das man aus gegebenen Längen-und Breitengrad ne anfrage an OSM schickt und man darauf die gewünschte Karte erhält ?

Du brauchst eine Implementierung der Google-Projektion. Damit kannst Du lat/lon Koordinaten in Tile-Nummern umrechnen. Mit den Tilenummern kannst du über dieselbe URL, die auch die Open-Layers Online-Karten verwenden, die einzelnen Kacheln von OSM runterladen.

bye
Nop

Im Wiki steht ein bisschen Pseudo-Code (und Code in einigen, gängigen Programmiersprachen) dazu:
http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#lon.2Flat_to_tile_numbers

Vielleicht ist dies ein Lösungsansatz:

<iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://www.openstreetmap.org/export/embed.html?bbox=2.291805,48.856802,2.297229,48.859845&layer=mapnik&marker=48.85825,2.29450" style="border: 1px solid black"></iframe>

Die Koordinaten des Marker kann man mit einem Script so anpassen, dass es die GPS-Koordinaten zugreift. Sobald man das iframe neu lädt (auch das kann man automatisieren, dass es z.b. alle 5 Sekunden neu geladen wird).
Und die Koordinaten des bbox kann man dann auch anhand der GPS-Koordinaten errechnen…

Hmm, danke für Eure Antworten aber iwie steig ich da noch net ganz durch.

Also mit Skript Sprachen hab ich nicht viel erfahrung, kann ich aus nem C++ Programm heraus irgendwie
die OSM-Seite ansprechen und mir ohne selbst auf der Homepage rumklicken zu müssen eine Karte in nen Lokalen Ordener Laden ?

Wenn ja wie ? (kleiner C++ Code wär nice)

PS: Bitte so detailiert wie möglich beschreiben. Danke :slight_smile:

Hab ich doch schon beschrieben :slight_smile:

Du brauchst eine Implementierung der Google-Projektion. Vielleicht findest Du im Web den Code. Ich habe für meine Zwecke eine Python-Version nach Java portiert. Damit kannst Du lat/lon Koordinaten in Tile-Nummern umrechnen.

Dann brauchst Du einen URL-Download. Mit den Tilenummern kannst du über dieselbe URL, die auch die Open-Layers Online-Karten verwenden, die einzelnen Kacheln von OSM runterladen.

Also z.B. http://a.tile.openstreetmap.org/9/265/173.png

Die erste Zahl ist der Zoomlevel, die zweite und dritte die Tilenummern, die Du aus der Google-Projektion bekommst.

Eigentlich nicht weiter schwer.

bye
Nop

Aber dazu muss ich ja die URL extra in den URL-Downloader kopieren, also wieder per Hand oder lässt sich das auch iwie autom. bzw über C++ Befehle regeln ?

Hallo Nop

Könnte es sein, dass ihr aneinander vorbei redet?
Ich glaube Namenloser sucht eher so etwas wie eine Implementierung die Slippy-Map.

Edbert (EvanE)

Kommt auf die Plattform an. Das Runterladen einer URL von C aus ist unter Windows ein Einzeiler, woanders mußt Du halt schauen was dort an libs geboten ist.

bye
Nop

Nö, ich glaube er sucht Code, um die Tiles lokal runterzuladen, so ähnlich wie z.B. JOSM es für die Auswahl des DL-Bereichs tut.

bye
Nop

Jo also ich hab Windows 7 aufm rechner mit Visual Studio 2008, also wahlweise C,C++ oder C#.

Ja also mein Ziel ist es einfach zu gegebenen Positionsdaten die dazu gehörige umgebungskarte runter zu laden und in einem Lokal Verzeichnis zu Speicher, aus dem ich das Bild dann in ne Anwendung in ne Bitmap laden kann und darin arbeiten(also die genaue Position z.B für die ich die karte angefordert hab einzeichnen).

Falls wer zufällig den Code parat hat um ne Grafik über URL runterzuladen für eine der 3 oben genannten Programmiersprachen, wäre das sehr nice. Danke

Hallo Nop

Nach seinem Post um 18:08 sieht das auch für mich so aus.
Seine erste Anfrage war in der Hinsicht nicht ganz so klar.

Edbert (EvanE)

Daten speichern… hmm… somit ist also auch mein Vorschlag nicht zu gebrauchen… (Empfänger orten oder die GPS-Daten speichern ist ein Unterschied…)… Die Postings von Nop und E-Malte helfen Dir also sicher weiter.

Hallo Namenloser

Dir sind hoffentlich mehrere Dinge über die Tiles (gerenderte Bilder der Karte) klar:

  • Die Tiles sind 256x256 Pixel groß.
  • Es gibt 18 Zoomstufen und entsprechend viele Tiles (Z18 = kleinste Gebiete)
  • Je nach Zoomstufe wir ein unterschiedlich großes Gebiet in einem Tile dargestellt.
  • Abhängig von der Zoomstufe werden unterschiedliche Details dargestellt/weggelassen.
  • Je nachdem wo sich deine Koordinate in einem Tile befindet (Mitten-/Rand-/Eckbereich)
    brauchst 1/2/4 Tiles um die Umgebung anzuzeigen.

PS: Informationen über Tiles findest du bei http://wiki.openstreetmap.org/wiki/Tiles

Edbert (EvanE)

Nehmen wir an, Du stehst auf dem Kölner DOM mit Deinem GPS Gerät. Du hast also die Koordinaten N 50.941111° E 6.9572222°

Somit rechnest Du Dir die Kachelnummern aus und kommst auf folgende Zahlen:
Zoom = 18 — X = 136138,83 — Y = 87827,88

Deine Kachel ist dann im Internet erreichbar unter:
http://a.tile.openstreetmap.org/18/136138/87827.png

Die Nachkommastellen kannst Du nutzen um ein Fadenkreuz zu zeichnen.

Sicher wirst Du um etwas mehr sehen zu können 12 oder 20 Kacheln runterladen und anzeigen müssen. Denke bitte an die Regeln zum Download von Kacheln: Deine Software muss die Kacheln Cachen.

Wie man jedoch ein PNG-File mit c++ runter lädt und auf dem Monitor anzeigt, weiß ich nicht. Da bist Du sicher ein einem C++ -Forum aufgehoben.

Als Ergänzung wäre ein Blick auf OpenLayers vielleicht noch sinnvoll.
Das kann schliesslich Informationen auf einer OSM-Karte darstellen.
Als ein Beispiel für OpenLayers sei die OpenLinkMap genannt. (Karte)

Edbert (EvanE)

Hmm also das mit den kacheln is ja doof, wenn man da dann meherer braucht.

Wenn ich auf OSM Seite einfach bei der Karte z.B an das Universitätsgelände so na ran zoom das ich noch das ganze gelände im Überblick (Grade von 48.52794-58.52086 und 13.35812-13.36902) hab dann kann ich mir doch die karte Manuell durch klick auf Export so runter laden und abspeichern.

Und genau das will ich einfach durch ne Anweisung machen, also ohne das ich da Manuell ran zoomen und dann Export klicken muss.

Die freien Karten basieren auf Kacheln. Da wirst Du also nicht drumherum kommen, eine Software zu schreiben welche Dir aus z.B. 20 Kacheln ein Bild zusammensetzt. Die Exportfunktion auf www.openstreetmap.org arbeitet genau so. Anders kannst Du ja keine PNG-Files auf dem Server speichern, die auch Verschiebbar sind.

Du könntest natürlich auch schauen, ob Du herausfindest, welche HTTP-Requests die Export-Funktion verwendet und die von Deinem Programm aus verwenden. Das wäre dann aber keine offizielle Funktion und die wird mit dem nächsten Update an der Export-Funktion evtl. nicht mehr funktionieren. Daher rate ich davon ab.

Mal für Poesiealbum:
Das Leben ist eines der schwersten und selten so einfach, wie man es gerne hätte.

Du hast jetzt zwei Möglichkeiten:

  • Die statische Variante:
    Sieh dir im Seitenquelltext an, wie die Export-Funktion realisiert ist.
    Bilde die Teile, die du brauchst, in deiner bevorzugten Programmiersprache nach.
    Dann musst du dich natürlich mit dem ganzen Internet-Gedöns rumplagen.
    Die exportiete Karte ist und bleibt so, wie du sie einmal exportiert hast.
    Die Sache mit dem Internet-Gedöns ist sicher eine gute Übung. ;-(

  • Die dynamische Variante:
    Verwende OpenLayers. Dann musst du dich mit JavaScript, den Eigenheiten
    von OSM und vielem anderen auseinandersetzen. Dafür bekommst du eine
    Karte, die du zoomen und verschieben kannst. Deine Marker wandern mit
    der Karte mit. Es sollte auch möglich sein, die Kare auf einen neu hinzugefügten
    Marker zu zentrieren. Die Verwaltung der Marker und welche Informationen
    neben den Koordinaten dort enthalten sein sollen, musst du natürlich selber
    programmieren.

Welche Variante besser zu deiner Aufgabenstellung passt, kannst nur du
(oder dein Prof) entscheiden.

PS: Dir ist hoffentlich klar, dass du je nachdem wo sich dein Objekt befindet,
in der höchsten Zoomstufe eventuell nur eine leere Fläche oder einen Wald
oder, oder, oder, … finden wirst. Es ist nicht alles so dicht gemappt wie
die deutschen Innenstädte.
Beispiel: http://www.openstreetmap.org/?lat=50.74478&lon=7.07109&zoom=17&layers=B000FTFT

Edbert (EvanE)

Ok, wenn ich nun davon ausgehe das die Karte aber nicht verschiebbar sein muss, sondern das ich einfach nur einmal einen festen Karteausschnitt Runterladen will, also so wie man es per Hand über den Export-Button machen kann, gibt es dann ne andere Möglichkeit ?