Klickbare Bundesländer auf Landkarte

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Klickbare Bundesländer auf Landkarte

    Hallo liebe Leut.

    Ich wollte für meine EDV-Kollegen ein kleines Progrämmchen schreiben. Je mehr ich mich in die Aufgabe reingedacht habe, desto größer gestaltet sich schon mein Grundsatzproblem.
    Wie das so ist googelt man natürlich erstmal. Dieser Herr hier hat das Problem schon recht gut beschrieben. Wie das aber so ist, gibt es genau zu der eigenen Problemstellung keine Antworten.

    Kurz nochmal zu meinem Szenario:

    Ich möchte die Deutschland-Karte sehen.
    Je nachdem in welches Bundesland ich klicke soll dann ein Textfenster aufploppen in welchem etwas geschrieben steht.
    Am Liebsten wäre mir ja noch, würde den Grenzen des Bundeslandes "fett" werden, je nachdem ich welchem man sich befindet. Oder das Textfenster würde aus dem Nichts "nach vorn fahren". Aber das sind letztendlich nur Schönheiten.
    Das Problem ist grundsätzlich erstmal: Wie kann ich die ja bekanntlich unregelmäßigen Bundesländergrenzen erkennen?

    Hat da jemand mit wesentlich mehr Erfahrung eine Idee die für einen Semi-Laien umsetzbar ist?

    Wenn noch Fragen sind, immer her damit.

    Viele Grüße und Danke schonmal.
    Nicht

    Kelariel schrieb:

    erkennen
    sondern wissen.
    Möglich wäre eine zweite Karte, in der die Grenzen der Länder eingezeichnet sind und in der jedes Bundesland seine eigene Farbe hat bzw. ausschließlich aus dieser Farbe besteht.
    Überträgst Du den Klick-Punkt der "Generalkarte" auf die "Schattenkarte", hast Du anhand der Farbe sofort das entsprechende Bundes- oder Ausland.
    Feddich.
    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!
    Die Idee ist sehr gut.
    Ich habe diese beiden Karten genommen:

    Farbig
    Neutral

    Die sollten eigentlich gut funktionieren.
    Ich habe es nun so gemacht, dass ich das farbige Bild als Hintergrundbild der Form eingestellt.
    Das Neutrale habe ich als Picturebox eingestellt mit der Größe der Form.

    Über einen Timer habe ich immer Live die aktuellen Mauskoordinaten:

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    2. MPX = MousePosition.X - MyBase.Left - 8
    3. MPY = MousePosition.Y - MyBase.Top - 29
    4. end Sub


    Die Werte sehen sehr krüplig aus, da ich damit nur die Koordinaten des Bildschirms bekomme und nicht die der Form. Naja..

    Jetzt schaffe ich es aber patu nicht, die Background-Farbe bei einem Click zu ermitteln..
    Ich habe hier zwar im Forum folgende beiden Zeilen gefunden:

    VB.NET-Quellcode

    1. Private Function GetColor(Location As Point) As Color
    2. Return New Bitmap(PictureBox1.Image).GetPixel(Location.X, Location.Y)
    3. End Function
    4. Private Sub PictureBox1_MouseDown(...) Handles PictureBox1.MouseDown
    5. Dim FarbeUnterDemMauszeiger As Color = GetColor(e.Location)
    6. End Sub


    Die "..." in der Sub reißen mich gerade um, da ich nicht weiß, was da rein soll. ( ByVal e AS ????? ).

    Wenn ich die RGB Farbe habe, möchte ich sie einfach mit einer IF THEN Abfrage mit hinterlegten RGB Farben vergleichen.
    Verbales Beispiel:

    Bayern = RGB(241, 159, 193)
    Wenn Farbauslese = Bayern then Textbox1.visible = true

    Leider komme ich nunmehr einfach nicht weiter und google, oder gar die Microsoft Hilfeseite konnte mir einfach nicht helfen.

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Kelariel schrieb:

    Return New Bitmap(PictureBox1.Image).GetPixel(Location.X, Location.Y)
    Diese Bitmap hat nix in einer PictureBox verloren, pack die über die Laufzeit in eine Bitmap: Bei Dir müllst Du nämlich den Speicher zu, weil Du pei jeder Mausbewegung ne neue Bitmap-Instanz erstellst.
    Und Du musst noch die Grenzen bearbeiten, dass sie einem Bundesland zugeordnet werden.
    Also pack beide Bilder in Deine Ressourcen und dann dies:

    VB.NET-Quellcode

    1. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    2. Dim col = My.Resources.deutschland_politsch_farbig.GetPixel(e.X, e.Y)
    3. Me.Label1.Text = col.ToString
    4. End Sub
    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!
    Herrlich. Ich danke dir. Das ist bedeuten einfacher und kompakter als das, was ich mir da zusammengeschrieben habe.
    Und vorallem - es funktioniert jetzt so wie es soll.

    Jetzt kümmer ich mich noch etwas um die Schönheiten.
    1. Eine Darstellung des Textes pro Bundesland als eine Art Tabelle mit 2 Spalten und 1 Zeile. Also, dass der Inhalt der 2. Spalte immer an der gleichen Höhe beginnt. Das Nutzen einer Tabelle ist etwas umständig zu programmieren denke ich. Daher habe ich bisher nur eine Textbox
    2. Eventuell die Möglichkeit, dass sich die Textbox aus dem Nichts bis zur festgelegten Größe aufspannt und nicht nur so "plöpp" da ist. Da hätt ich schon eine Idee: Eine Schleife mit bezug auf die Höhe und Breite die bis zu einem Limit die Form des Feldes erweitert.

    Nunja.
    Ich danke dir recht herzlich für die Hilfe.
    Wenn du noch Lust hast, kannst du mir vielleicht zu Punkt 1 eine Lösung nennen und sagen, ob du die Idee für Punk2 sinnvoll findest.

    Viele Grüße

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Da gibt es glaub ich eine Systemeinstellung, so was wie animierte Menüs.
    Was soll denn alles in der Tabelle stehen?
    Mach Dir ein Dictionary(Of Color, String).
    Und: In Deinem Farbbild haben Brandenburg und Baden-Württemberg dieselbe Farbe, da musst Du eins umfärben. Bei mir sieht das nun so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Länder As New Dictionary(Of Color, String)
    3. Public Sub New()
    4. Me.InitializeComponent()
    5. Me.ClientSize = New Size(640, 640) ' damit die Koordinaten übereinstimmen
    6. Me.Länder.Add(Color.FromArgb(229, 220, 197), "Schleswig-Holstein")
    7. Me.Länder.Add(Color.FromArgb(241, 157, 160), "Mecklenburg-Vorpommern")
    8. Me.Länder.Add(Color.FromArgb(199, 142, 120), "Hamburg")
    9. Me.Länder.Add(Color.FromArgb(242, 148, 0), "Bremen")
    10. Me.Länder.Add(Color.FromArgb(197, 147, 190), "Niedersachsen")
    11. Me.Länder.Add(Color.FromArgb(251, 203, 140), "Sachsen-Anhalt")
    12. Me.Länder.Add(Color.FromArgb(146, 167, 136), "Brandenburg")
    13. Me.Länder.Add(Color.FromArgb(60, 137, 196), "Berlin")
    14. Me.Länder.Add(Color.FromArgb(247, 176, 78), "Nordrhein-Westfahlen")
    15. Me.Länder.Add(Color.FromArgb(202, 212, 216), "Thüringen")
    16. Me.Länder.Add(Color.FromArgb(225, 202, 224), "Sachsen")
    17. Me.Länder.Add(Color.FromArgb(143, 199, 151), "Hessen")
    18. Me.Länder.Add(Color.FromArgb(208, 223, 153), "Saarland")
    19. Me.Länder.Add(Color.FromArgb(255, 245, 154), "Rheinland-Pfalz")
    20. Me.Länder.Add(Color.FromArgb(241, 159, 193), "Bayern")
    21. Me.Länder.Add(Color.FromArgb(0, 128, 192), "Baden-Württemberg")
    22. Me.Länder.Add(Color.FromArgb(254, 254, 254), "Ausland, Wasser")
    23. End Sub
    24. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    25. Dim col = My.Resources.deutschland_politsch_farbig.GetPixel(e.X, e.Y)
    26. If Me.Länder.ContainsKey(col) Then
    27. Me.Text = Me.Länder(col)
    28. Else
    29. Me.Text = col.ToString
    30. End If
    31. End Sub
    32. End Class


    Zitat entfernt. ~Thunderbolt
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Ich hab das jetzt erstmal so:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Kontrollwert As String
    3. Public Ausserhalb As String
    4. Public SH As String
    5. Public SHi As String
    6. Public MV As String
    7. Public MVi As String
    8. Public BB As String
    9. Public BBi As String
    10. Public BE As String
    11. Public BEi As String
    12. Public HH As String
    13. Public HHi As String
    14. Public HB As String
    15. Public HBi As String
    16. Public NI As String
    17. Public NIi As String
    18. Public SN As String
    19. Public SNi As String
    20. Public ST As String
    21. Public STi As String
    22. Public SL As String
    23. Public SLi As String
    24. Public RP As String
    25. Public RPi As String
    26. Public NW As String
    27. Public NWi As String
    28. Public TH As String
    29. Public THi As String
    30. Public HE As String
    31. Public HEi As String
    32. Public BY As String
    33. Public BYi As String
    34. Public BW As String
    35. Public BWi As String
    36. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    37. PictureBox1.Left = 0
    38. PictureBox1.Top = 0
    39. PictureBox1.Height = Me.Height
    40. PictureBox1.Width = Me.Width
    41. TextBox1.Width = 1
    42. TextBox1.Height = 1
    43. Variablenzuweisung()
    44. End Sub
    45. Public Sub Variablenzuweisung()
    46. 'Farbzuweisung und Wertzuweisung zur Region
    47. Ausserhalb = ("Color [A=1, R=0, G=0, B=0]")
    48. SH = ("Color [A=58, R=141, G=101, B=0]")
    49. MV = ("Color [A=98, R=219, G=0, B=8]")
    50. BB = ("Color [A=255, R=0, G=0, B=0]")
    51. BE = ("Color [A=195, R=0, G=101, B=178]")
    52. HH = ("Color [A=135, R=149, G=42, B=0]")
    53. HB = ("Color [A=255, R=242, G=148, B=0]")
    54. NI = ("Color [A=108, R=118, G=0, B=102]")
    55. SN = ("Color [A=53, R=111, G=0, B=106]")
    56. ST = ("Color [A=115, R=246, G=140, B=0]")
    57. SL = ("Color [A=102, R=138, G=175, B=0]")
    58. RP = ("Color [A=101, R=255, G=230, B=0]")
    59. NW = ("Color [A=177, R=243, G=141, B=0]")
    60. TH = ("Color [A=53, R=0, G=48, B=67]")
    61. HE = ("Color [A=112, R=0, G=128, B=18]")
    62. BY = ("Color [A=96, R=218, G=0, B=90]")
    63. BW = ("Color [A=119, R=21, G=66, B=0]")
    64. 'Textzuweisung zur Region
    65. 'Gekürzte Fassung
    66. SHi = "Darstellung Schleswig-Holstein
    67. Gerät 1: Adresse
    68. Gerät 2: Adresse
    69. Gerät 3: Adresse
    70. Gerät 4: Ohne Adresse"
    71. End Sub
    72. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    73. Dim col = My.Resources.deutschland_politsch_farbig_195780_alpha_neu.GetPixel(e.X, e.Y)
    74. Kontrollwert = col.ToString
    75. If TextBox1.Visible = True Then
    76. TextBox1.Visible = False
    77. TextBox1.Width = 1
    78. TextBox1.Height = 1
    79. Else
    80. If Kontrollwert = Ausserhalb Then
    81. Label3.Text = ""
    82. Label3.Visible = False
    83. TextBox1.Text = ""
    84. TextBox1.Visible = False
    85. End If
    86. 'Gekürzte Fassung
    87. If Kontrollwert = SH Then
    88. Label3.Text = "Schleswig-Holstein"
    89. Label3.Visible = True
    90. TextBox1.Text = SHi
    91. TextBox1.Visible = True
    92. Timer1.Enabled = True
    93. End If
    94. End If
    95. End Sub
    96. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    97. While TextBox1.Width < 300 And TextBox1.Height < 150
    98. TextBox1.Width = TextBox1.Width + 10
    99. TextBox1.Height = TextBox1.Height + 5
    100. End While
    101. Timer1.Enabled = False
    102. End Sub
    103. End Class


    Wie du siehst soll in der Textbox eine Liste an Geräten mit entsprechenden IP Adressen sein. Aufgrund der Wortlänger der Geräte fängt natürlich die IP immer auf einer anderen Höhe an. Ich hätte die Höhe der IP's gern einheitlich. Mittelts Tab-Stops im String klappt das leider nicht.
    Das mit den gleichen Farben von BW und BB ist mir leider auch schon aufgefallen. Ich hab die Farbe von BB einfach in Schwarz geändert. Danach war es eindeutig.
    Das Aufspannen des Textfeldes habe ich jetzt über den Timer mit einem Intervall von 1 gelöst. Das sieht schön flüssig aus.

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Kelariel schrieb:

    Wie du siehst
    Ich seh gar nix, nur einen Haufen unnützer Variablen. :/
    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!
    Sollte ich den Sarkasmus in deiner Aussage nicht verstanden haben, dann Asche über mein Haupt. Andernfalls - warum auch immer du nicht mehr als die Variablen siehst, habe ich es hier als Bild zusammengefasst:
    (Natürlich sind es sicher viel zu viele unnütze Variablen. Wie man an deinem Code sieht, geht es auch viel einfacher. Aber so habe ich es als Laie für mich verständlich zusammengeschrieben)



    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Was soll denn passieren bei Mouse_Click und Timer_Tick?
    Ob das tatsächlich passiert, werden wir dann sehen.

    Zitat entfernt. ~Thunderbolt
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Kurzer Umriss:
    Das Programm startet und die Karte ist zu sehen.
    Man klickt auf ein Bundesland. Auf der Karte wird label3 mit dem Namen des Bundeslandes versehen.
    Dann wird der Textbox den für das Land hinterlegten Text eingeflöst und sichtbar gemacht ( hat aber natürlich erstmanoch nur eine größe von 1x1 ).
    Danach wird in den Timer gesprunger, welcher die Textbox so lang vergrößert bis sie die vorgegebene Größe erreicht hat. Danach wird der Timer deaktiviert.
    Man sieht nun also über der Karte die Textbox mit den Landesspezifischen Informationen.
    Klickt man nun irgendwo anders hin wird die Textbox ausgeblendet und wieder auf eine Größe von 1x1 gesetzt.
    Nun kann man wieder ein anderes Land anklicken und die Prozedur beginnt von vorn.

    Soweit funktioniert das auch bei mir.

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Warum erfindest Du ein eckiges Rad neu, wenn Du bei mir ein rundes vorgefunden hast?

    Zitat entfernt. ~Thunderbolt
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Ja, da hast du schon recht.
    Muss mich in deins nur nochmal reinarbeiten inwieweit ich Werte abgreife und in weitere Funktionen ableite.
    Aber ich danke dir schonmal dafür. Das hat mir schon sehr geholfen.

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()