Google Maps

    • VB.NET

    Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Patrick1993.

      Google Maps

      Hallo Leute,
      ich hab heute mal aus Langeweile gegooglet unter dem Begriff "Google Maps API .Net" das Ergebnis war überraschend:
      Eine (2! ;)) DLL mit der man Landkarten aus Google Maps anzeigen kann. Sogar eine Suche nach Orten ist möglich.
      Das ganze in ein Projekt zu verpacken war keine Schwierigkeit mehr ;)
      Die DLLs findet ihr im Anhang.
      Das Beispielprojekt findet ihr im Anhang.
      Ihr könnt ein Beispielprojekt & DLL (das allerdings nicht ganz funktioniert und in C# ist :() hier herunterladen. ^^

      Solltet ihr die "Static Maps" direkt aufrufen wollen und es ohne DLL machen wollen, schaut mal hier vorbei ;)

      Na gut. Dann an die Arbeit.
      1. Schritt: DLLs herunterladen
      Ladet euch die DLLs im Anhang oder auf der Website herunter.
      ( Solltet ihr die DLLs auf der Website heuntergeladen haben, müsst ihr das Projekt vorher erstellen um die Dlls zu finden.)

      2.Schritt: Projekt anlegen
      Legt ein neues Projekt (Windows Forms Anwendung) an.
      Framework: mind 2.0 ( Bei 2.0 kommt bei der Einbindung der DLL "Newtonsoft.Json" eventuell ein Hinweis, dass eine höhere Frameworkstufe benötigt wird. Bestätige den Dialog - Es funktioniert trotzdem wunderbar :) )

      3.Schritt: Verweise hinzufügen
      Fügt einen Verweis auf beide DLLs hinzu (Ansicht -> Projektmappenexplorer -> Alle Dateien Anzeigen aktivieren -> Verweise -> Rechtsklick -> Verweis hinzufügen... -> Durchsuchen -> [Dateien auswählen] -> OK)

      4.Schritt: Benutzeroberfläche gestalten

      Legt im Designer eine Benutzeroberfläche wie diese an:

      Die Einträge der ComboBox sind wie folgt:

      Quellcode

      1. Straße
      2. Satellit
      3. Hybrid
      4. Erde

      Die rote Schrift zeigt den Namen des Steuerelements an, die blaue wurde nur bei der Picturebox hinzugefügt um Verwechslungen mit anderen Controls (wie etwa dem Panel) zu vermeiden - sie sind keine Labels oder sonst irgend ein Teil der UI. ;)

      5.Schritt: Imports-Anweisungen

      Welchselt in den Quelltext (F7) und schreibt in die erste Zeile (vor der Klassendefinition) folgende Anweisung:

      VB.NET-Quellcode

      1. Imports Google.Api.Maps.Service.StaticMaps
      2. Imports Google.Api.Maps.Service.Geocoding


      6.Schritt:
      Für das weitere Projekt sind folgende Codeabschnitte noch nodwendig:

      Einige Variablen für die Ansicht und die Karte selber. ( Ändert nicht die Reihenfolge der Array!!!)

      VB.NET-Quellcode

      1. Private ReadOnly Ansichten As String() = New String() {"roadmap", "satellite", "hybrid", "terrain"}
      2. Public Karte As New StaticMap


      Die Funktion zum herunterladen eines Bildes (leider geht ImageLocation der PB nicht :( :(

      VB.NET-Quellcode

      1. Function Getimg(ByVal uri As Uri) As Image
      2. Dim wc As New Net.WebClient
      3. Dim tmp = IO.Path.GetTempFileName
      4. wc.DownloadFile(uri.AbsoluteUri, tmp)
      5. Return Image.FromFile(tmp)
      6. End Function


      Die Funktion RefreshMap zum zeichnen des Bildes:

      VB.NET-Quellcode

      1. Sub RefreshMap() Handles cb_ansicht.SelectedIndexChanged, tb_zoom.ValueChanged
      2. Karte.Zoom = tb_zoom.Value
      3. Karte.Size = pb_karte.Size.Width & "x" & pb_karte.Size.Height
      4. If cb_ansicht.SelectedIndex <> -1 Then
      5. Karte.MapType = Ansichten(Me.cb_ansicht.SelectedIndex)
      6. End If
      7. Karte.Sensor = "false"
      8. 'Bild zeichen
      9. pb_karte.Image = Getimg(Karte.ToUri)
      10. End Sub

      Der Code sollte bis auf weiteres klar sein.
      (Warum Sensor auf false gesetzt werden muss ist mir unklar, aber ohne funktioniert es nicht :( )
      Das besondere Augenmerk sollte auf Karte.ToUri gerrichtet sein. Diese Funktion gibt die URL des Bildes das angezeigt werden muss zurück :D

      Die Klasse GeoResult (die eigentlich nicht viel tut, und nur dazu gut ist einen schönen Text in der Listbox anzuzeigen ;) )

      VB.NET-Quellcode

      1. Public Class GeoResult 'Wird angelgt, nur um ToString zu überschreiben
      2. Inherits GeocodingResult
      3. Public Overrides Function ToString() As String
      4. Return MyBase.FormattedAddress
      5. End Function
      6. Shared Function Kovert(ByVal obj As GeocodingResult) As GeoResult
      7. Dim gs As New GeoResult()
      8. gs.Components = obj.Components
      9. gs.FormattedAddress = obj.FormattedAddress
      10. gs.Geometry = obj.Geometry
      11. gs.Types = obj.Types
      12. Return gs
      13. End Function
      14. End Class


      7. Schritt:
      Das Load-Event der Form sollte wie folgt belegt sein:

      VB.NET-Quellcode

      1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      2. 'Ansicht auf "Straße" stellen
      3. cb_ansicht.SelectedIndex = 0
      4. 'Center auf 0
      5. Karte.Center = "0,0"
      6. RefreshMap()
      7. End Sub


      8.Schritt: Die Suchen-Funktion

      VB.NET-Quellcode

      1. Private Sub btn_suchen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_suchen.Click
      2. Dim request As New GeocodingRequest() 'Neue Suchanfrage
      3. request.Address = tb_suchbegriff.Text 'Suchbegriff festlegen
      4. request.Sensor = "false"
      5. Dim result = GeocodingService.GetResponse(request) 'Suche durführen
      6. Select Case result.Status
      7. Case Is = Google.Api.Maps.Service.ServiceResponseStatus.Ok
      8. 'Listbox füllen
      9. lb_suchergebnisse.Items.Clear()
      10. For Each res In result.Results
      11. lb_suchergebnisse.Items.Add(GeoResult.Kovert(res))
      12. Next
      13. Case Is = Google.Api.Maps.Service.ServiceResponseStatus.ZeroResults
      14. MessageBox.Show("Die Suche ergab keine Ergebnisse", "Ort suchen", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
      15. Case Else
      16. MessageBox.Show("Es trat ein Fehler bei der Suche auf!", "Ort suchen", MessageBoxButtons.OK, MessageBoxIcon.Error)
      17. End Select
      18. End Sub

      Es ist zwar nicht unbedigt logisch, aber die Google-API Programmierer wollten diesen Aufbau :rolleyes: .
      ( Wieder ist Sensor auf false)

      Naja. Ganz fertig sind wir noch nicht: Schließlich sollte der Ort den man dann ausgewählt hat auch auf der Karte erscheinen.
      Dazu ist folgende Funktion notwendig:

      VB.NET-Quellcode

      1. Sub SelectPosition(ByVal pos As GeoResult)
      2. 'ACHTUNG: Der Beistrich der Dezimalzahl muss ersetzt werden!!!
      3. Dim lat = Replace(pos.Geometry.Location.Latitude, ",", ".")
      4. Dim lon = Replace(pos.Geometry.Location.Longitude, ",", ".")
      5. Karte.Center = lat & "," & lon
      6. Karte.Markers = Karte.Center
      7. RefreshMap()
      8. End Sub

      Mehrere Markers werden mit einem "|" getrennt ;)
      Und ihr Aufruf:

      VB.NET-Quellcode

      1. Private Sub lb_suchergebnisse_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles _
      2. lb_suchergebnisse.SelectedIndexChanged
      3. SelectPosition(lb_suchergebnisse.SelectedItem)
      4. End Sub


      Fertig. :)
      Dateien

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Memo“ ()

      Hi,
      weisst du zufällig, wie es mit den Lizenzbedingungen von Seiten Google steht?
      Das man irgenwo Google erwähnen muss und/oder nicht in kommerziellen Projekten verwenden darf??
      --- Zurzeit inaktiv ---
      Stürtzt beim Zoomen ab!

      Wie Functioniert die Suche nach Firmen wie in echten Google Maps auf der Website??

      Wen ich KKH-Wilhelmstift eingebe, Dann kommt keine Treffer gefunden! Wen ich Wilhelmstift eingebe wieder keine Treffer gefunden!
      Hallo,

      Ich habe ein großes problem hiermit, ich kann das ganze eigentlich gar nicht verwenden, denn sobald ich debugge treten Fehler und Wahrnungen auf:

      Warnungen:

      Quellcode

      1. Warnung1Der Primärverweis "Google.Api.Maps.Service, Version=0.9.2.21393, Culture=neutral, processorArchitecture=MSIL" konnte nicht aufgelöst werden, da er eine indirekte Abhängigkeit von der Frameworkassembly "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" aufweist, die im derzeit als Ziel angegebenen Framework nicht aufgelöst werden konnte. ".NETFramework,Version=v2.0". Zur Beseitigung des Problems muss entweder der Verweis "Google.Api.Maps.Service, Version=0.9.2.21393, Culture=neutral, processorArchitecture=MSIL" entfernt oder die Anwendung erneut als Ziel für eine Frameworkversion verwendet werden, die "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" enthält.GoogleMapsTest
      2. Warnung 2 Der Primärverweis "Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL" konnte nicht aufgelöst werden, da er eine indirekte Abhängigkeit von der Frameworkassembly "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" aufweist, die im derzeit als Ziel angegebenen Framework nicht aufgelöst werden konnte. ".NETFramework,Version=v2.0". Zur Beseitigung des Problems muss entweder der Verweis "Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL" entfernt oder die Anwendung erneut als Ziel für eine Frameworkversion verwendet werden, die "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" enthält. GoogleMapsTest
      3. Warnung 3 Der Primärverweis "Google.Api.Maps.Service, Version=0.9.2.21393, Culture=neutral, processorArchitecture=MSIL" konnte nicht aufgelöst werden, da er eine indirekte Abhängigkeit von der Frameworkassembly "System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" aufweist, die im derzeit als Ziel angegebenen Framework nicht aufgelöst werden konnte. ".NETFramework,Version=v2.0". Zur Beseitigung des Problems muss entweder der Verweis "Google.Api.Maps.Service, Version=0.9.2.21393, Culture=neutral, processorArchitecture=MSIL" entfernt oder die Anwendung erneut als Ziel für eine Frameworkversion verwendet werden, die "System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" enthält. GoogleMapsTest
      4. Warnung 4 Der Primärverweis "Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL" konnte nicht aufgelöst werden, da er eine indirekte Abhängigkeit von der Frameworkassembly "System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" aufweist, die im derzeit als Ziel angegebenen Framework nicht aufgelöst werden konnte. ".NETFramework,Version=v2.0". Zur Beseitigung des Problems muss entweder der Verweis "Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL" entfernt oder die Anwendung erneut als Ziel für eine Frameworkversion verwendet werden, die "System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" enthält. GoogleMapsTest
      5. Warnung 5 Der in Imports "Google.Api.Maps.Service.StaticMaps" angegebene Namespace oder Typ enthält keine öffentlichen Member oder kann nicht gefunden werden. Stellen Sie sicher, dass der Namespace oder der Typ definiert ist und mindestens einen öffentlichen Member enthält und dass der importierte Elementname keine weiteren Aliase enthält. C:\Users\Martin Pfeiffer\Desktop\GoogleMapsTest\GoogleMapsTest\Form1.vb 1 9 GoogleMapsTest
      6. Warnung 6 Der in Imports "Google.Api.Maps.Service.Geocoding" angegebene Namespace oder Typ enthält keine öffentlichen Member oder kann nicht gefunden werden. Stellen Sie sicher, dass der Namespace oder der Typ definiert ist und mindestens einen öffentlichen Member enthält und dass der importierte Elementname keine weiteren Aliase enthält. C:\Users\Martin Pfeiffer\Desktop\GoogleMapsTest\GoogleMapsTest\Form1.vb 2 9 GoogleMapsTest


      Das waren nur die Warnungen, da ist dann klar das noch viele Fehler auftreten da ja ein Fehler beim Importieren bzw. bei den Verweisen ist.


      Bitte dringend um Hilfe.
      Mfg: Gather
      Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


      Leider kann ich die Warnungen und Fehler nicht nachvollziehen...
      Ich habe schon ein Konto zum Testen des Projektes und der Anwendung angelegt. Leider kommen bei mir keine Fehler.

      Das Suchen nach Unternehmen ist, nach meinem Wissen, nicht möglich.
      Ich habs alles 1 zu 1 Übernommen um es in mein Programm einzubauen aber es geht nicht so richtig.
      Wenn ich was eingebe (tb_suchbegriffe) bekomme ich keine Anzeige

      Ich hatte die Class in die Class gepackt anstatt die extra zu machen aber nun gehts

      Hallo,

      danke für diesen tollen Code. Bin völliger VB Anfänger und habs durch deine Anleitung hinbekommen das Programm zum laufen zu bringen.

      Ich arbeite momentan an einem Projekt, welches mir eine Flugstatistik ausgibt. Hierzu würde ich gerne alle Orte auf der Weltkarte wo ich schon war, markieren. Weiß jemand wie ich das am besten machen kann?

      Gruß

      Edit: Ich muss noch dazu sagen das ich aus einer mdb Datenbank Flugahfencodes (z.B. MUC=Flughafen München) auslese und diese alle auf der Weltkarte anzeigen möchte.

      *Beiträge zusammengefügt*

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

      Vielen Dank! Hätte mir deinen Beitrag genauer anschauen sollen.
      Soweit funktioniert bei mir alles nur würde ich gerne die Karte per Mausklick verschieben können (Mousemove). Muss ich hierfür immer neue Koordinaten abfragen oder gibt es eine Standardlösung um das Google Steuerkreuz anzuzeigen?

      API ändern oder nicht?

      Hallo!
      Ich denke doch dass in den .dll irgendwo eine Google API versteckt sein wird. Diese begrenzt die möglichen Zugriffe pro 24 Stunden. Da würde ich natürlich gerne meine API nutzen, ich weiß nicht wieviele Menschen diese .dll´s nutzen aber so 1000 Zugriffe sind doch bestimmt rasch erreicht. :?:
      Kann man irgendwie die Zoomoption beinflussen ??
      Denn ich habe vor den Zoom ein wenig zu vergrößern so das man quasi direkt aufs hausdacht kuken kann und nicht einfach nur die Strasse sieht sondern das gaesamte haus.