Home > Artikel > Ausgabe 3/2016 > Google- und Bing-Maps im Formular

Google- und Bing-Maps im Formular

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Adressen sind in Datenbanken allgegenwärtig. Access [basics] macht da keine Ausnahme. Sie möchten auf einer Karte sehen, wo sich eine Adresse befindet? Dann bedienen Sie sich etwa Google-Maps oder Bing-Maps im Webbrowser. Wenn Ihnen das aber zu umständlich ist, so bauen Sie doch einfach den Geo-Support direkt in ihre Datenbank ein! Wir zeigen im Beitrag, wie das geht, und wie die Maps unmittelbar in einem Formular angezeigt und angesteuert werden können.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1603_GoogleMaps.accdb

Google- und Bing-Maps

Beide Dienste ähneln sich und weisen ähnliche Features auf. Bei der Flexibilität hat Google die Nase vorn, bei der Vogelperspektive und, nach unseren Erfahrungen, hinsichtlich der Performance, ist Bing etwas interessanter. Ansonsten ist es sicher Geschmackssache, welche Methode Sie bevorzugen.

In die Eingabefelder der Maps geben Sie die gewünschte Adresse oder Koordinaten ein. Im Erfolgsfall wird der Ort nun angezeigt. Wählen können Sie unter verschiedenen Ansichten, wie Karte, Satellit oder 3D. Features, wie Verkehr, Radrouten oder Öffentliche Verkehrsmittel sind nun zusätzlich einstellbar.

Lässt sich das fernsteuern? Sie brauchen keine Fernsteuerung des Browsers über SendKeys oder ähnliche fehleranfällige Programmierung, und auch keine JavaScripte. Denn zum Glück lassen sich verschiedene Parameter der Dienste direkt in der aufrufenden URL mitgeben. Dazu gehören auch die Adresse und einige Ansichtseinstellungen. Aufgabe dieses Beitrags ist die Lösung, die sattsam bekannten Adressen der Beispieldatenbank unmittelbar als Karte im Formular anzuzeigen.

Webbrowser

Da es sich um Webdienste handelt, benötigen wir natürlich zwingend einen Webbrowser zur Darstellung der Karten. Seit einigen Generationen von Access ist dieser bereits als Steuerelement in Formulare integrierbar. Es gibt zwei Alternativen: Entweder Sie verwenden des eingebaute Webbrowser-Steuerelement, oder Sie fügen den Internet-Explorer als ActiveX-Steuerelement in ein Formular ein (Ribbon|Entwurf| Steuerelemente|ActiveX-Steuerelemente ... Microsoft Webbrowser). Beides kommt so ziemlich auf das Gleiche heraus. Der Unterschied besteht darin, dass sich der eingebaute Browser direkt an ein Feld der Datenherkunft des Formulars binden lässt. Das muss ein Textfeld sein, welches den Link für die anzuwählende URL enthält. Beim Navigieren durch die Datensätze des Formulars wird dann automatisch jeweils die entsprechende Seite im Browser angezeigt. Andererseits legt der eingebaute Browser nicht komplett die Schnittstelle zum darunterliegenden InternetExplorer offen. Wenn hier mehr Interaktion mit dem Objektmodell über VBA benötigt wird, dann ist das ActiveX-Steuerelement besser geeignet. Vor allem dann, wenn auf eine Datenbindung verzichtet werden kann.

Beide Steuerelemente lassen sich ansonsten auf ähnliche Weise ansteuern, und auch das Verankern-Feature von Access bei Größenänderungen des Formulars funktioniert bei beiden anstandslos. Wir verwenden für dieses Beispiel das eingebaute Webbrowser-Steuerelement und zeigen kurz, wie die Sache prinzipiell läuft.

Datengebundener Browser

Die Tabelle tblURLs ist die Basis für das Formular frmMaps, welches den Webbrowser als einziges Steuerelement enthält. Sie hat einen bescheidenen Aufbau. Neben der nebensächlichen Autowert-ID für jeden Datensatz sind im Feld URL die Internetadressen gespeichert, welche vom Browser angesteuert werden sollen. Also ist im Formular der Steuerelementinhalt des Browsers an dieses Feld gebunden.

Die Tabelle enthält im Auslieferungszustand drei Datensätze. Die erste Internet-Adresse lautet about:blank. Das führt dazu, dass das Formular beim Öffnen nur eine leere Seite im Browser-Steuerelement anzeigt. Das ist sinnvoll, denn ohne irgendeine URL zeigt der Browser eine unerwünschte Seite mit der Meldung Adresse ungültig an. about:blank vermeidet dies.

Der zweite Eintrag in der Tabelle ist

https://www.google.de/maps/

Das ist die Startseite von Google Maps. Öffnen Sie zum Test das Formular. Klicken Sie in der Navigationsleiste auf den nächsten Datensatz. Leider entspricht das Ergebnis nicht den Erwartungen (Bild 1). Google scheint sich nicht mit dem Webbrowser-Steuerelement anfreunden zu können. Es hat einige Nachforschungen erfordert, um diesem Verhalten, das Microsoft Bing übrigens nicht aufweist, auf die Schliche zu kommen. Die Ursache liegt darin begründet, dass das Webbrowser-Steuerelement, wie auch das ActiveX-Pendant, den Google-Servern die Version 7 des Internet-Explorers melden, obwohl etwa auf dem Windows-System der Internet-Explorer 9 installiert ist. Seit geraumer Zeit akzeptiert Google Maps diese Version jedoch nicht mehr und zeigt deshalb die angezeigte Meldung. Endstation?

Google Maps akzeptiert das Webbrowser-Steuerelement nicht als Browser

Bild 1: Google Maps akzeptiert das Webbrowser-Steuerelement nicht als Browser

Tatsächlich lässt sich über die Registry einstellen, wie sich das WebControl verhalten soll. Über einen bestimmten Schlüssel im Zweig HKEY_CURRENT_USER, also dem Benutzerzweig der Registry, kann angegeben werden, dass das WebControl immer mindestens die Version 9 ausgibt. Die Routine SetWebControlAsIE9 im Modul mdlWebControl der Beispieldatenbank übernimmt das Setzen des entsprechenden Werts in der Registry.

Dazu sind keine Administratorrechte nötig, weil jeder Benutzer auf seinen Zweig HKEY_CURRENT_USER Zugriff hat. Allerdings erfordert das Ändern dieses Werts einen Neustart von Access. Auf eine Beschreibung der nicht so trivialen Prozedur sehen wir hier ab. Verwenden Sie das Modul auf analoge Weise, nachdem Sie es in eine Ihrer Datenbanken importiert haben, wenn Sie dort Google Maps im Formular benötigen.

In der Beispieldatenbank wird die Prozedur vom Intro-Formular aufgerufen. Alternativ ginge das natürlich auch über ein AutoExec-Makro. Zusätzlich sollte noch die Routine ChangeWebControlFeature durchlaufen werden, die weitere Bedingungen für das Webbrowser-Steuerelement über eine API-Funktion setzt, damit sich dieses genauso verhält, wie der externe Browser. SetWebControlAsIE9 überprüft übrigens zuerst, ob der gewünschte IE9-Modus bereits gesetzt ist und macht dann weiter nichts. Andernfalls werden Sie über eine Meldung darüber informiert, dass ein Neustart von Access und der Datenbank nötig ist. Die Prozedur RestartAccess übernimmt das Neustarten selbst. Sie brauchen also nichts manuell zu veranlassen. Eine neue Instanz von Access wird in der Routine mit dem Pfad der aktuellen Datenbank per Shell-Anweisung gestartet, und die offene Instanz wird geschlossen. Wenn Sie die Beispieldatenbank zu ersten Mal öffnen, werden Sie mit einiger Sicherheit mit diesem Vorgang konfrontiert (siehe Bild 2).

Diese Meldung zeigt unsere Datenbank beim ersten Start

Bild 2: Diese Meldung zeigt unsere Datenbank beim ersten Start

Ohne diese Modifikation der Registry ist leider nichts zu machen. Sie brauchen aber keine Befürchtungen zu haben: Der entsprechende Eintrag ist erstens im sicheren Benutzerzweig und hat, zweitens, keinerlei Auswirkungen auf das System. Er betrifft ausschließlich das Webbrowser-Control.

Nachdem diese Änderungen vorgenommen wurden, klappt es auch tatsächlich mit der Anzeige von Google Maps im Formular, wie Bild 3 beweist.

Nach Modifikation der Registry zeigt sich Google Maps im Webbrowser-Steuerelement ordnungsgemäß, aber etwas eingeschränkt

Bild 3: Nach Modifikation der Registry zeigt sich Google Maps im Webbrowser-Steuerelement ordnungsgemäß, aber etwas eingeschränkt

Beim Weiterschalten zum nächsten Datensatz kommt eine URL zum Einsatz, die dem externen Browser entstammt. Dazu wurde Google Maps aufgerufen und als Adresse Berlin eingegeben. Zumindest im Firefox ändert sich nach dem Anzeigen des Orts in der Karte die Adresszeile des Browsers. Im Internet Explorer ist das nicht so. Die so erzeugte Adresse wurde in den Datensatz kopiert. Wird sie dem Webbrowser-Control spendiert, so zeigt es die Karte nun auf genau die gleiche Weise. Fast!

Denn wenn Sie die Abbildung genauer inspizieren, wird Ihnen möglicherweise der unscheinbare Blitz am rechten unteren Rand auffallen. Ein Klick auf ihn fördert die Informationen in Bild 4 zutage. Google ist also noch immer nicht mit dem Browser zufrieden und benutzt den sogenannten Lite-Modus, in dem einige Features, wie die Fotos am unteren Rand oder Street View nicht verfügbar sind. Das macht aber gar nichts, weil diese für unsere Lösung zum Anzeigen von Adressen ohnehin eher stören würden. Das Verschieben, Zoomen der Karte mit der Maus, oder auch das Setzen von Markern per Rechtsklick und das anschließende Routen, funktionieren indessen problemlos. Über das Menü-Symbol können auch die Einstellungen zur Kartenansicht geöffnet werden. Das Ergebnis ist wie gewünscht. Störend sind nur die doch etwas groß geratenen Flächen zu Adresseingabe oder des Menüs. Setzen Sie deshalb die Abmessungen des Webbrowser-Steuerelements im Formular auf geeignete Dimensionen. Und geben Sie für die Verankern-Eigenschaft am besten den Modus Quer und nach unten Dehnen an, damit es sich beim Maximieren des Formulars entsprechend vergrößert.

Google Maps schaltet sich in den Lite-Modus

Bild 4: Google Maps schaltet sich in den Lite-Modus

URL-Parameter für Google Maps

Ziel war es ja, Google Maps nicht nur im Webbrowser-Control anzuzeigen, um dort eine Adresse für einen Ort manuell einzugeben, sondern dies über VBA-Programmierung zu erreichen. Ein Link, ähnlich, wie der im dritten Datensatz der Tabelle tblURLs, muss nun über String-Verarbeitung künstlich aus einer Datenbankadresse erzeugt werden.

Das ist nicht weiter schwierig. Sie hängen die Adresse einfach an die folgende URL an:

https://www.google.com/maps/place/

Für die Suche nach dem Ort Bayreuth, Königsallee kommt damit dies heraus:

https://www.google.com/maps/place/Bayreuth, Königsallee

Zu früheren Zeiten scheiterte eine solche Suche, da weder Leerzeichen in einer URL erlaubt sind, noch Umlaute oder andere Sonderzeichen. Google ist aber schließlich für seine intelligenten Suchmaschinen bekannt, und so findet es die Adresse inzwischen dennoch, weil es den wahrscheinlichsten Ort heraussucht. Das klappt fast immer.

Die Reihenfolge von Ort, Land und Straße samt Hausnummer sind weitgehend egal, und das Komma als Trennzeichen kann ebenfalls meist entfallen.

Fragt sich noch, ob auch die Darstellung der Karte bereits über einen URL-Parameter zu beeinflussen ist? Das ist zu bejahen, auch wenn die Angelegenheit im Vergleich zu den früheren Versionen von Google Maps deutlich undurchsichtiger geworden ist und außerdem leider nicht von Google dokumentiert. Versuch und Irrtum machen jedoch klug, und so fanden einige Leute heraus, dass die Steuerparameter für die Darstellung sich in einem data-Block verstecken. Hängen Sie etwa zusätzlich diesen String an die bisherige Such-URL an:

/data=!5m1!1e0

Das führt zur normalen Kartendarstellung. Mit

/data=!3m1!1e3

jedoch kommt es zur Satellitenansicht. Voll ausgeschrieben:

https://www.google.com/maps/place/Bayreuth, Königsallee/data=!3m1!1e3

Zu weiteren Möglichkeiten später mehr.

Kundenadressen mit Landkarte im Formular

Nachdem wir die Essentials ermittelt haben, kann es an die Gestaltung des Formulars mit Kundenadressen und eingebauter Google Maps-Karte gehen. Bild 5 zeigt die Entwurfsansicht des Formulars frmKunden.

Entwurfsansicht des Kundenformulars frmKunden mit Webbrowser

Bild 5: Entwurfsansicht des Kundenformulars frmKunden mit Webbrowser

Neben den Adressfeldern und der Combobox rechts oben zur Navigation durch die Datensätze ist im unteren Bereich das Browser-Steuerelement ctlWebX untergebracht. Seine Verankern-Eigenschaft steht auf Quer und nach unten dehnen, damit es sich bei Größenänderungen des Formulars entsprechend ausdehnt. Der Steuerelementinhalt ist an das Feld MapsURL gebunden. Dieses Feld ist der Tabelle tblKunden hinzugefügt worden. Ihr Feldaufbau sieht so aus:

ID Long (Autowert)

IDAnrede Long

Vorname Text

Nachname Text

Straße Text

PLZ Text

IDOrt Long

MapsURL Text

BingURL Text

IDAnrede ist mit der Nachschlagetabelle tblAnreden verknüpft, IDOrt mit tblOrte. In MapsURL soll später der Link zur Google Maps-Karte gespeichert werden, in BingURL der Link zur Bing Maps-Karte im Browser. Beide Textfelder haben den Standardwert "about:blank", damit bei einem neuen Datensatz der Browser keine Fehlermeldung anzeigt, sondern eine leere Fläche. Diese Felder werden erst dann gefüllt, wenn die Maps-Dienste den Ort bereits ermittelt haben.

Das geschieht indessen nicht automatisch, sondern wird durch Auswahl des Eintrags (Google Maps Link speichern) in der Navigationscombo oben rechts ausgelöst. Deren Datenherkunft besteht aus der andernorts bereits beschriebenen UNION-Abfrage, die auf der Tabelle tblKunden basiert und den künstlichen Einträgen (Neuer Datensatz) und (Datensatz löschen), dem die erwähnte Zeile mit der ID -2 hinzugefügt wurde.

Das Erstellen des Such-Strings für Google Maps übernimmt die Ereignisprozedur Beim Anzeigen (Form_Current) des Formulars. Das bedeutet, dass bei Navigation zu einem Kundendatensatz sogleich die Maps-URL produziert und dem Browser-Steuerelement zugewiesen wird. Also zeigt im Idealfall das Formular, wie in Bild 6, immer eine Karte der Adresse des Orts an. Die Ereignisprozedur testet dabei zunächst, ob das Feld MapsURL bereits einen gespeicherten Link enthält:

Das Kundenformular mit in Google Maps gefundenem Ort zur Laufzeit

Bild 6: Das Kundenformular mit in Google Maps gefundenem Ort zur Laufzeit

If Me!MapsURL <> "about:blank" Then

     ...(Such-String erzeugen)

End If

Da der Standardwert des Felds auf about:blank steht, ist das ein Kriterium dafür, ob bereits ein Link gespeichert wurde, denn dann sieht sein Inhalt anders aus. In diesem Fall tut die Routine weiter nichts, denn das Steuerelement ist ja an den Link gebunden und zeigt ihn im Browser automatisch an.

Das Zusammensetzen des Such-Strings ist als Teil der Prozedur in Listing 1 abgebildet. In sURL steht die Basis-URL für Google Maps, in sLoc der Adressteil des Links. Ist das Feld IDOrt ungleich Null, also mit einem Wert belegt, so wird der Fokus auf das Kombinationsfeld cbOrt gesetzt, damit sein angezeigter Text ausgelesen werden kann. Wir brauchen ja den Text und nicht die ID des Orts. Den Text einer Combobox aber kann man nur dann auslesen, wenn der Fokus des Formulars auf ihm liegt. Andernfalls kommt es zu einer VBA-Fehlermeldung.

     Dim sURL As String

     Dim sLoc As String

     ....

         sURL = "https://www.google.com/maps/place/"

         If Not IsNull(Me!IDOrt) Then

             Me!cbOrt.SetFocus

             sLoc = Me!cbOrt.Text

         End If

         If Not IsNull(Me!PLZ) Then sLoc = Me!PLZ & " " & sLoc

         If Not IsNull(Me!Strasse) Then sLoc = Me!Strasse & ", " & sLoc

         sLoc = Trim(sLoc)

         sLoc = Replace(sLoc, " ", "%20")

         

         If Len(sLoc) > 0 Then

             ctlWeb.Navigate2 sURL & sLoc & "/data=!5m1!1e0"

         Else

             ctlWeb.Navigate2 "about:blank"

         End If

...

Listing 1: Zusammenbasteln des Such-Strings für Google Maps aus den Datenfeldern des Formulars und anschließendes Aktivieren dieser im Browser ctlWeb

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!