geografische Koordinaten als Pixel abbilden

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.

mfg

marvel

hi,

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 :slight_smile:

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.

Viel Erfolg!

Gerhard

hallo gary,

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 :smiley:

hi,

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.

ciao

gerhard

hi gary,

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.

mfg
marvel

hallo marvel,

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

ciao

gerhard

hello again,

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 :smiley:

mfg

marvel

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 :smiley: 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)…

Gruß
Paul

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. :wink:
Chris

hi 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 :slight_smile:

mfg

marvel

Ah? Ich dachte das wäre nur ne Umrechnung wie von °C nach Fahrenheit … :wink:
Aber wie groß kann die Verzerrung schon sein? Bzw. wie groß ist der Ausschnitt den du brauchst und unbedingt (!) entzerren musst?

Sonst hilft dir vielleicht die Seite…unten sind paar Formeln:
http://www.vermessung-wolf.de/wissen/etrs.html

nun, da das ganze für ein navigationssystem konzepiert wird sollte eine geringe verzerrung vorliegen.

beispiel :

navigieren von düsseldorf flughafen nach dortmund flughafen.

.

Nahmd,

Ich empfehle, das “int” wegzulassen, weil:

xmin ≤ x < xmax → 0 ≤ (x-xmin)/(xmax-xmin) <1

Und damit int ((x-xmin)/(xmax-xmin)) = 0.

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.

Gruß Wolf

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?

ich hab da mal ein “richtiges” svg draus gemacht:


<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000pt" height="500pt" viewBox="-7600 -5100 15200 10200" version="1.1">
<polyline fill="none" stroke="red" stroke-width="5" points=" 7148,-524 7310,108 7435,732 7482,981 7489,1155 7427,1303 7325,1421 6975,1564 5437,2211 5025,2373 3849,2579 3636,2581 3457,2482 3273,2261 2499,949 2092,298 1913,159 1743,99 1076,-49 843,-176 624,-319 8,-917 -1216,-2242 -1494,-2549 -1632,-2589 -2042,-2579 -2238,-2557 -2485,-2479 -3290,-2264 -4010,-2204 -4274,-2194 -5273,-2107 -6340,-1995 -6906,-1927 -7171,-1878 -7461,-1752 -7495,-1652 -7397,-342 "/>
</svg>

und das sieht dann so aus:
http://osm.wno-edv-service.de/DataServer/osm/forum/komisches_svg.png

Und wo soll diese Linie jetzt hin?

Gruss
walter

Noch ne Zusatzfrage: Woher kommen eigentlich diese SVG-Ways und was sollen die bedeuten?

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.

lat= maxlat - (y-ymin)/(ymax-ymin) * (maxlat-minlat)
lon= minlon + (x-xmin)/(xmax-xmin) * (maxlon-minlon)

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…

Edit: minlonlatmax verwehcselt

Marvel.

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.

LG,

-moenk

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.

Gruss
walter