Map / GPS Koordinaten in Bitmap / Image darstellen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von n1nja.

    Map / GPS Koordinaten in Bitmap / Image darstellen

    Guten Abend,

    ich hab ein kleines Problem.
    Weiß aber mathematisch jetzt nicht genau wie ich das lösen soll.

    Es geht um Koordinaten bzw. Breiten - und Längengrade.

    Ich hab eine Klasse indem die beiden Werte als double festgelegt werden.
    Beispiel:
    52.123456 und 52.654321
    Jetzt möchte ich diese in einen Bild darstellen.
    Wie ist erstmal ziemlich egal.
    Ob eine Linie von A nach B oder zwei Punkte.
    Mir geht es nur darum, wie rechne ich das ganze so um, damit ich das gut darstellen kann.
    Zuerst dachte ich, kein Problem. Ich erstell die Bitmap mit x = 100000 und y = 100000 und teile das ca. auf.
    Geht aber nicht. Da ich keine Bitmap größer erstellen kann als meine Auflösung vom Surface ist. Wieso, keine Ahnung:)

    Dann normal versucht über decimal ooder float mit den 6 Nachkommastellen. Funktioniert auch nicht.

    Gibt es da andere Berechnungen von C# die ich hier verwenden könnte.
    Hab sowas leider noch nie wirklich gebraucht.
    Vielen Dank im Voraus.
    @n1nja Wenn Du die Koordinaten der Eckpunkte Deines Bildes kennst, kannst Du Koordinaten im Innern über den Dreisatz berechnen.
    Wie ist Deine bisherige Herangehensweise?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Na bis jetzt hab ich noch keine Lösung außer die getesteten Sachen im Startpost.

    Dreisatz hab ich bereits schon so ähnlich genommen.

    Aber da kommen ja auch Ergebnisse raus mit mit 6 oder mehr Nachkommastellen.

    Die Werte nimmt die Drawline Methode nicht wirklich an.

    Bzw. es wird nix gezeichnet auf den Bild.
    @n1nja Poste mal Deinen relevanten Code, relevante Daten und ein relevantes Bild.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich mach mir gerade um die Darstellung insofern Gedanken, weil die Erde ja rund ist (ob kugel- oder scheibenförmig, das diskutieren wir bitte nicht aus :P ). Aber ne rechteckige Bitmap wird da wohl nicht ganz so einfach verwendbar sein.
    Aber ne 10000x10000-Bitmap bekomm ich hin:
    Dim TestBitmap = New Drawing.Bitmap(10000, 10000)
    Aber ne 10er-Potenz mehr und es ist aus.
    Bilder
    • BigBitmap.png

      28,09 kB, 704×378, 55 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Aber ne rechteckige Bitmap wird da wohl nicht ganz so einfach verwendbar sein.
    Bei Bildern der Größenordnung einer Stadt, mit weniger als 1 Million Einwohnern sehe ich da keine Probleme.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ah oke.
    Also bei mir ist tatsächlich ab 3000px schon Schluss.
    Weiß aber auch nicht wieso.

    Aber das soll ja auch nicht die Lösung sein.

    Hier mal meine Funktion:

    C#-Quellcode

    1. public static Image DrawImage(string Geo1, string Geo2, string Geo11, string Geo22)
    2. {
    3. Bitmap bmp = new Bitmap(100, 50);
    4. using (var g = Graphics.FromImage(bmp))
    5. {
    6. g.FillRectangle(new SolidBrush(Color.Green), 0, 0, 100, 50);
    7. float p1 = (float)Convert.ToDouble(Geo1.Replace(".", ","));
    8. float p2 = (float)Convert.ToDouble(Geo2.Replace(".", ","));
    9. float p3 = (float)Convert.ToDouble(Geo11.Replace(".", ","));
    10. float p4 = (float)Convert.ToDouble(Geo22.Replace(".", ","));
    11. //g.DrawLine(new Pen(Color.Red, 0.01f), 1, 1, 20, 20);
    12. g.DrawLine(new Pen(Color.Red, 0.01f), p1,p2, p3, p4);
    13. }
    14. bmp.Save("test.bmp");
    15. return bmp;
    16. }


    Und ja ob die Erde jetzt rund oder rechteckig ist.... xD
    Mir geht es nur darum, 2 Standorte visuell darzustellen.
    Ist jetzt auch kein Muss, aber wäre schön:)

    Der Input der Funktion wäre zb. wie folgt:
    Geo1 = 49.347441
    Geo2 = 8.876541
    Geo11 = 49.336879
    Geo22 = 8.914451

    Sind jetzt nur Random zahlen. Aber die Differenz liegt hier bei 0.0001 oder mehr.
    Ich kann jetzt aber in einen Bitmap nicht 0.1 zeichnen. Oder zb. SetPixel verwenden.

    Ne kleine Umrechnung wäre hier nötig. Nur mir fällt nichts mehr ein.

    n1nja schrieb:

    ob die Erde jetzt rund oder rechteckig ist
    Ein Häretiker :!: Er behauptet, sie sei eckig! :P

    Die Kommazahlen werde doch erst richtig relevant, wenn Du diese Genauigkeit in Deiner Bitmap wirklich brauchst. Wenn Deine Koordinaten von -180 bis 180 gehen, dann hast Du ein größeres Problem, als wenn Du nur von 49,3 bis 49,4 gehst. Bei letzterem kannst Du ja erst hochrechnen und dann malen. Dann hast Du viel weniger Kommastellen, um die Du Dich wirklich kümmern musst. Also: Von wo bis wo gehen Deine Koordinaten?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @n1nja Da fehlen ja noch ein paar Daten und ich nehme mal an auch die Grundlagen.
    Also:

    Quellcode

    1. Pixel (0,0) = {GeoA1, GeoB1}
    2. Pixel (0,maxY) = {GeoA1, GeoB2}
    3. Pixel (maxX,0) = {GeoA2, GeoB1}
    4. Pixel (maxX,maxY) = {GeoA2, GeoB2}
    Diese Zahlen brauchen wir.
    Und ein entsprechendes Bild.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Naja brauchen werde ich sie schon.
    Die Range kann ich jetzt nicht genau sagen, aber wenn ich mir die Liste anschauen geht es von 48.5 bis 52.0 und von 6.0 bis 12.5.

    Die Darstellung im Programm ist ja erstmal auch nur in einer Picturebox und diese ist ca. 250 x 110px.

    Wenn es nämlich irgendwie möglich ist, möchte ich auf den Image auch ne Route darstellen wollen.
    Das werd ich dann wahrscheinlich mit DrawPolygon machen.
    Dann hast Du in die eine Dimension eine "Koordinatendifferenz" von 3,5° und bei der anderen 6,5°. Bei einer Bitmap mit 1000x1000 hättest Du also eine Entsprechung von 0,0035° = 1 Pixel und bei der anderen Dimension 0,0065°. Ist die Frage, ob das reicht.
    Bei 250x110 (echt jetzt?) wäre es nur 1px = 0,026° bzw. ca. 0,06°. Also deutlich grober.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Also bei der Darstellung mit einer Linie wird mir das mit Sicherheit reichen.
    Im späteren Verlauf wenn wirklich 10 oder mehr Stationen gezeichnet werden sollen, dann wird das nichts glaub ich.

    Aber ist das normal, das alle Draw Methoden keine Kommastellen nehmen?
    Wenn ich die Linie zeichnen, ob ich jetzt die Dicke vom Stift auf 1f oder 0.1f mache, ändert sich nix am Bild.

    n1nja schrieb:

    DrawPolygon
    nimmste da nicht, arbeite mit GraphicsPath, den kannst Du in Deinen Koordinaten befüllen und dann auf die Pixelkoordinaten abbilden.
    docs.microsoft.com/de-de/dotne…h?view=windowsdesktop-5.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ja so kann man es auch machen.

    Also komme ich womöglich auch nicht drum herum tatsächlich die Größe der Bitmap so hoch wie möglich zu machen.

    Und durchrechnen wenn ich eine Breite von 1000px habe, meine Koordinaten von 48-52 gehen. Wäre hier also 0.004 Pro Pixel.

    Müsste ich tatsächlich erstma alle Funktionen fertig coden und dann mal 4,5 Zeichnen. Ob man es sehen lassen kann:)