hi community,
ich möchte die geografischen Koordinaten (Breiten- und Längengrade) von OpenStreetMap in einem Koordinatensystem auf dem PC abbilden. Ich möche also eine solche node :
analysieren und entsprechend den wert lat und lon exportieren und damit weiterarbeiten. wie stelle ich am besten diese geografischen koordinaten in einem pc dar, da ja in pixel gearbeitet wird.
nach dem Einlesen musst du dir deinen “Bereich” berechnen oder ausdenken, den du darstellen möchtest. Und dann kommt der Dreisatz zum Vorschein, von dem man dachte, dass man ihn nieeee brauchen würde
maxLon maxLat minLat maxLat seien also gegeben
nun hast du z.B. 1000x1000 pixel, die du als grafik darstellen möchtest
x_pixel = int ( (lon-minLon) / (maxLon-minLon) * 1000)
y_pixel = int ( (lat-minLat) / (maxLat-minLat) * 1000)
ggf. solltest du die grafikgröße anpassen, um verzerrungen zu vermeiden. kannst du auch einen faktor ausrechnen mit den min und max Werten.
ich kann deinen lösungsansatz nicht wirklich verstehen, vllt hab ich das ganze auch zu ungenau formuliert. im eigentlichen sinne habe ich gps daten vorliegen.
ein beispiel würde so aussehen :
Geografische Koordinaten (WGS84)
o 13° 44’ 29,00"E
o 51° 02’ 55,00"N
nun möchte ich diese daten auf dem pc abbilden, also muss ich erstmal per projektion ein raster der erdkugel erstellen. dazu habe ich mir das utm-koordinatensystem ausgesucht, welches wohl weit verbreitet ist. im folgenden muss ich also die geografischen daten in ein utm format bringen was dann so aussieht :
UTM-Koordinaten (WGS84)
* Zone 33-Nord
* Rechtswert 411.777,6 m
* Hochwert 5.655.984,3 m
jetzt habe ich die erdkugel in viele zonen eingeteilt und betrachte jede zone als ein eigenständiges kartesisches koordinatensystem (x/y). der rechtswert soll auf x und der hochwert auf y abbgebildet werden. nun stelle ich mir die frage wie ich das koordinatensystem einteilen soll, denn die zahlen sind recht groß was eine einteilung schwierig macht. das ganze in km umrechnen würde die zahl verkleinern, aber vllt zu ungenau dargestellt. nun ich hoffe ihr versteht mein problem und habt ne lsg. ist bestimmt nur ein denkfehler von mir
ok, von angaben in graden und utm war ja nicht die rede. du hast in osm files koordinaten in dezimalen grad, und mehr brauchst du auch nicht. wenn du zwei umwege machen willst, ok.
die letzte koordinatentransformation geschieht aber dennoch auch in utm wie oben beschrieben.
ps: es gibt schon einiges an fertigen programmen und modulen, die du benutzen kannst. sieh mal im wiki unter osm.pm und osmgraph.pm nach. die programme (in perl) leisten all das schon. da kannst du punkte und linien ganz wie du willst in png und svg files erzeugen (unter angabe von koordinaten). für ergebnisse siehe die die beispiele bei osmgraph.pm an. noch ein tipp für windows nutzer: evtl dran denken, eine virtuelle linux maschine zu installieren. da hat man es im kontext osm etwas leichter.
ich arbeite mich gerade ganz frisch in die materie ein und habe ehrlich gesagt noch wenig plan davon. ich wollte die utm projektion nutzen, weil man diese in einem kartesischen koordinatensystem benutzen kann laut meiner recherchen. ich möchte nämlich ein OpenSource Navigationsystem für die Luftfahrt (segelflieger etc) entwickeln und kann mir sonst nicht vorstellen wie ich vektordaten vernüftig auf pixeln abbilde. ich weiß nicht ob ich richtig liege, deswegen habe ich mich auch an die liebe community gewendet, denn es fällt mir im moment schwer das ganze sich vorzustellen wie sowas aufgebaut ist.
ich habe bisher folgeneden lösungsansatz :
gehen wir mal davon aus das ich laut utm einteilung in verschiedene zonen lediglich eine darstellen will und innerhalb dieser auch navigieren möchte. ich lese also alle geodaten aus den osm file aus, rechne diese in utm um und stelle sie dann im pc dar.
jetzt renderer benutzen oder selber schreiben für die darstellung der map ?
welcher maßstab wäre das und wie kann ich ihn verändern ?
wie gesagt, ich bin totaler anfänger. wäre sehr nett wenn du mir das mal mit nem einfachen beispiel erklären könntest wie man sowas macht :D. danke im vorraus und weiterhin viel spass mit osm.
ich schlage dir ernsthaft vor, erst mal sehr viel kleinere brötchen zu backen. sonst gibt es keine erfolgserlebnisse!!!
du kannst auch andere koordinatensysteme sehr einfach zum teil so transformieren, dass du eine sehr reelle darstellung bekommst.
nochmal, das mit utm muss nicht sein! warum auf diese kacheln beschränken? mein ansatz oben ist allgemeiner.
der maßstab ergibt sich aus den lon/lat-deltas und den pixeln in x/y richtung (und deiner monitorgöße, um genau zu sein). kann man alles ausrechnen (pixel / km oder km / pixel)
einfaches bsp:
minLon = 0
maxLon = 10
minLat = 0
maxLat = 10
pixel x = 1000
pixel y = 1000
→ 1 Grad = 100 Pixel
nun möchtest du den punkt (1/5) darstellen. also erhalten wir pixX = 1 * 100 = 100, pixY = 5*100 = 500 → (100/500)
obige Formel zum Umrechnen benutzen
ist aber noch keine transformation berücksichtigt, von wegen die erde ist keine scheibe und so. muss man im einfachsten fall noch einen cosinus oder so einbauen. siehe entsprechende formaln im web oder in meinem osm.pm / osmgraph.pm
ich habe die anforderungen nochmal zusammengefasst :
die anwendung muss in der lage sein aus den bezogenen geodaten eine vektorbasierte grafik zu erstellen und diese darzustellen. es muss die möglichkeit bestehen die kartendarstellung zu verschieben, zu skalieren und zu rotieren. grafische und textuelle elemente müssen unabhängig voneinadner zeichenbar sein
ich setz mich gerade mit deinem beispiel auseinander
Wieso nimmst du nicht die OSM Koordinaten? Ist doch total simpel…
Dein Beispielsatz: lat=“53.0749616” lon=“8.7867913”
Zum Rendern selber: du legst für dein Fenster in dem du zeichnest eine Größeß fest…z.b. 200x400 Pixel entsprechen 1000 x 2000 Meter. Nun legst du irgendeinen startpunkt fest (aktuelle GPS-Koordinate wäre ja sinnvoll) und nimmst diese als Mitte des Bildschirms…von dieser ziehst du jetzt 500 meter ab in der horizontalen und 1000 meter in der vertikalen und schon hast du die koordinate für deine linke obere ecke…die rechte untere durch zuzählen von 500 und 1000 Metern…
Beispiel: GPS Koordinate bei 52.750000 / 9.400000
52.75 abzgl. 500 Meter = 52.745000 9.400000 abzgl. 1000 Meter = 9.390000
Rechte unter Ecke: 52.755000 und 9.410000
Das Zeichnen ist total simpel…wenn du jetzt eine Koordinate hast die in diesem viereck liegt und du die zeichnen willst:
wo liegt die Koordinate in der Breite (Prozentual)? Wo liegt diese vertikal? (Prozentual) …dann die entsprechende Prozentzahl anhand der Pixel ausrechnen…z.B. 25 % von 200 Pixel und 50 % von 400 Pixel = bei X=50 unc Y=200 zeichnen…
Also rein von der Theorie her Ich mach mich selbst erst am WE da dran…aber habe schon diverse Graphen und Vektorgrafiken selbst per Code gezeichnet.
Dann musst du nur noch eine Zoom-Funktion einbauen die diese 1000x2000 meter vergrößert oder verkleinert…
Maßstabgetreu kannst du nur etwas machen wenn du die Display-Größe in Millimetern kennst (Usereingabe)…
Naja kommt halt auf die Größe des abzubildenden Gebiets an. Die einfache lineare lat-lon
Abbildung bringt natürlich mehr Verzerrungen als Mercator und Co.
Chris
genau das war auch meine sorge das die lineare abbildung eventuell zu große verzerrungen verursacht. deshalb habe ich auch zu anfang gedacht das die utm projektion eine alternative wäre. die lineare abbildung habe ich dank gary jetzt nachvollziehen können. schön das es foren gibt in denen man über sowas diskutieren kann
Ah? Ich dachte das wäre nur ne Umrechnung wie von °C nach Fahrenheit …
Aber wie groß kann die Verzerrung schon sein? Bzw. wie groß ist der Ausschnitt den du brauchst und unbedingt (!) entzerren musst?
Bei der üblicherweise verwendeten Merkator-Projektion ist der berechnete Wert für lon richtig, der Wert für lat aber nur in der Nähe von ymin und ymax, also am unteren und oberen Rand richtig, dazwischen weicht er vom korrekten Wert ab. Wenn Deine Bahnstrecke ein paar Dutzend Kilometer lang ist, hält sich der Fehler in Grenzen. Führt sie quer durch Deutschland, ist er signifikant.
Das kommt darauf an, wie groß das Gebiet ist und wie genau die Punkte in lat/lon stimmen sollen.
Grob gesagt: Wenn man in die Pixel-Darstellung ein Koordinaten-Gitter einzeichnen würde, sollten die Gitterlinien in der gewünschten Auflösung parallel zu den Außenrändern verlaufen.
Übrigens: SVG ist ein Vektor-Format, das erst durch das Anzeigeprogramm auf Bildschirmpixel abgebildet wird. Die originalen SVG-Koordinaten sollten eigentlich genauer als die Bildschirm-Pixel sein, muss man allerdings aus der Original-SVG-Datei herausfieseln.
Da mußt und wirst du wohl scheitern - es sei denn, du hast noch weitere Informationen.
Dieses SVG-Polygon beschreibt einen Weg in einem fiktiven Koordinatensystem (Darstellungsfläche des SVG-Files?) ohne Verbindung zu einer realen geographischen Lage (z.B. 0,0 ist bei lon/lat 12.3,45.8), ohne Maßstab und ohne Projektionsmethode. Wie soll das denn an der richtigen Stelle und in der richtigen Größe oberhalb einer OSM-Karte dargestellt werden?
Du müsstest übrigens die Vorzeichen bei der Breitengradberechnung umdrehen. Das Koordinatensystem von SVG hat (0,0) in der oberen linken Ecke und geht dann positiv nach rechts und nach unten. Geografische Koordinaten gehen positiv nach oben.
Wie oben schon erwähnt: minlon, maxlon, minlat und maxlat musst dir natürlich noch irgendwie besorgen. Und am besten auch noch eine Info zur Projektion, um den Fehler abschätzen zu können.
Grüße, Max
PS: Sind deine SVG immer so einfach wie das Beispiel? Die können sehr schnell sehr kompliziert werden und dürften dann nicht mehr so einfach einzulesen sein…
den ganzen Kram mit selber berechnen um Punkte auf dem Bildschirm darzustellen kannst Du Dir eigentlich sparen. Es gibt fertige Sachen wie Openlayers fürs Web oder Klassen für Java mit denen man sowas machen kann. Punkte in Lat/Lon kommen da rein und die werden auf einer OSM-Karte dargestellt.
lies mal, was er am Anfang geschrieben hat:
“ich will den umgekehrten Weg gehen. Ich habe ein SVG File mit einer eingezeichneten Bahnstrecke. Die Pixel-koodinaten will ich in geograph. Koordinaten haben.”
Ist zwar ne komische Aufgabenstellung, die mir absolut unsinnig erscheint, aber wenn er unbedingt will …
Ich fragte ihn ja, woher er diese Bahnstrecken hat und was das soll, aber er hat noch nicht geantwortet.