{"id":55000670,"date":"2009-06-01T00:00:00","date_gmt":"2020-05-22T22:23:59","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=670"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Google_Earth_ferngesteuert_Teil_II","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/","title":{"rendered":"Google Earth ferngesteuert, Teil II"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg02.met.vgwort.de\/na\/8e61108837884f0fb3a5fd64fbdada6d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Google Earth in Ihrer eigenen Anwendung &#8211; angezeigt in einem ganz normalen Formular, das Sie nach Belieben mit Steuerelementen best&uuml;cken k&ouml;nnen, um durch die Gegend zu schwirren, Orte zu suchen, Details anzuzeigen oder gar Grafiken oder Texte unterzubringen Ja, das geht. Wir zeigen, wie es funktioniert und was Sie beim Einsatz des ben&ouml;tigten ActiveX-Steuerelements beachten m&uuml;ssen.<\/b><\/p>\n<p>Vor einiger Zeit haben wir gezeigt, wie Sie Google Earth aus Access heraus automatisieren. Mithilfe der COM-Schnittstelle lassen sich Orte anfliegen, Daten auslesen, Ortsmarken setzen und vieles mehr. Auch mit den neueren Versionen der Software funktioniert diese L&ouml;sung nach wie vor. Die damals ge&auml;u&szlig;erte Mutma&szlig;ung, Google werde im Laufe der Zeit das Objektmodell erweitern, hat sich aber leider nicht best&auml;tigt. Stattdessen gibt es seit einigen Monaten ein Browser-Plugin von Google Earth, das Sie als ActiveX-Steuerelement in Access-Formulare einbinden und fernsteuern k&ouml;nnen.<\/p>\n<p>Die Beispieldatenbank zum Beitrag <b>Google Earth ferngesteuert<\/b> (Shortlink 457) &ouml;ffnet Google Earth im Webbrowser und steuert es &uuml;ber die Automationsschnittstelle fern. Eine solche L&ouml;sung l&auml;sst sich vielseitig einsetzen, um etwa Orte zu Kundendaten anzuzeigen. Das gro&szlig;e Handicap der L&ouml;sung besteht jedoch darin, dass die zwei separaten Anwendungen &#8211; Access und Google Earth &#8211; viel Platz ben&ouml;tigen und ein sinnvolles Arbeiten somit eigentlich nur mit zwei Monitoren m&ouml;glich ist.<\/p>\n<p>Im Fr&uuml;hsommer erschien die erste Beta des Google Earth-Plugins V 4.3 &#8211; die Versionsnummer lehnt sich jeweils an die Version der Standalone-Anwendung an. Dabei handelt es sich um ein Steuerelement, das f&uuml;r den Einsatz in Webseiten gedacht ist und &auml;hnlich arbeitet, wie die Satellitenansicht von Google-Maps. W&auml;hrend jene aber ein statisches 2D-Erscheinungsbild liefert, l&auml;sst sich die 3D-Weltkugel oder -karte im Plugin &uuml;ber Maus und Tastatur in gleicher Weise bewegen wie in der Google Earth-Anwendung.<\/p>\n<p><b>Installation<\/b><\/p>\n<p>Ger&auml;t man auf eine Webseite wie [1], die das Plugin eingebaut hat, so ist zun&auml;chst nichts Weltbewegendes zu sehen. Stattdessen fordert eine Grafik mit hinterlegtem Link dazu auf, das Plugin herunterzuladen. Tats&auml;chlich ist dies die einzige M&ouml;glichkeit, das Plugin zu installieren; eine direkte Download-URL gibt es nicht.<\/p>\n<p>Der Grund hierf&uuml;r ist, dass Google eine kleine <b>Setup.exe <\/b>zwischenschaltet, die erst &uuml;berpr&uuml;ft, ob sich eine Version des Plugins bereits auf dem System befindet und ob es sich um eine m&ouml;glicherweise veraltete Version handelt. Nur diese <b>Setup.exe <\/b>kennt den Ort des aktuellen Pakets im Web, das dann im Folgenden automatisch heruntergeladen und installiert wird. <\/p>\n<p>Nach einem Refresh der Webseite zeigt sich Google Earth im Plugin-Fenster. Im Internet-Explorer erscheint zuvor wahrscheinlich in der Meldungsleiste die Nachfrage, ob man das ActiveX-Steuerelement zulassen will. Diese Nachfrage f&uuml;hrt auch schon zur Erkenntnis, dass es sich bei dem Plugin nur um ein ActiveX-Steuerelement handeln kann und nicht etwa um ein JavaScript-Geb&auml;ude wie bei Google-Maps.<\/p>\n<p><b>Technik<\/b><\/p>\n<p>Das ActiveX-Steuerelement selbst &uuml;bernimmt nur einen kleinen Teil der Arbeit. Im Hintergrund werkelt eine vollst&auml;ndige Installation von Google Earth (<b>geplugin.exe<\/b>), die aber gegen&uuml;ber der Standalone-Anwendung modifiziert ist. Das ActiveX-Control fungiert lediglich als Host f&uuml;r die eigentliche Anwendung.<\/p>\n<p>Diese Arbeitsteilung ist n&ouml;tig, damit das Plugin unabh&auml;ngig von Browser und Plattform eingesetzt werden kann. So kommt etwa im Firefox ein anderes Plugin zum Einsatz, welches auf QWidgets statt ActiveX basiert. Auch dieses verwendet jedoch die gleiche Google Earth-Engine im Hintergrund.<\/p>\n<p>Die Aufgabe des Plugins besteht also darin, die Interaktion zum Benutzer und zur Webseite (JavaScript) sicherzustellen sowie die 3D-Daten der Engine per DirectX zu rendern. Damit es per Scriptsprache steuerbar ist, muss es wohl eine Schnittstelle enthalten, die Anweisungen an die Google Earth-Engine weiterleitet. F&uuml;r ein ActiveX-Control ist das die eingebaute Typbibliothek, welche sich in die Verweise eines VBA-Projekts einbinden lassen k&ouml;nnen sollte.<\/p>\n<p>Wo aber befindet sich das ActiveX-Steuerelement Beim St&ouml;bern durch die Verzeichnisse der Plugin-Installation &#8211; standardm&auml;&szlig;ig <b>C:\\Programme\\Google\\Google Earth Plugin <\/b>&#8211; findet man einen Zweig <b>IE<\/b>, der die Datei <b>plugin_ax.dll <\/b>enth&auml;lt. Und die ist das gesuchte ActiveX-Steuerelement.<\/p>\n<p><b>Plugin im Access-Formular<\/b><\/p>\n<p>Was als ActiveX-Control in Webseiten funktioniert, das sollte man auch in Access-Formularen im Entwurf &uuml;ber das Men&uuml; <b>Einf&uuml;gen | ActiveX-Steuerelement&#8230; <\/b>verwenden k&ouml;nnen. Die Frage ist nur, wie das Steuerelement wohl hei&szlig;t. Den Ausdruck <b>Google&#8230;<\/b> sucht man in der Liste der Steuerelemente vergeblich &#8211; das Control nennt sich etwas kryptisch <b>GEPluginCoClass Object<\/b>.<\/p>\n<p>Das Einf&uuml;gen ins Formular erfolgt problemlos. Das Steuerelement zeigt sich im Entwurf als wei&szlig;e Fl&auml;che mit dem Schriftzug <b>ATL 8.0<\/b>, was lediglich den Schluss zul&auml;sst, dass es wahrscheinlich mit Visual Studio C++ 2005 entwickelt wurde.<\/p>\n<p>Wer das Formular nun &ouml;ffnet, wird zun&auml;chst entt&auml;uscht. Das Steuerelement zeigt lediglich eine schwarze Fl&auml;che ohne Erdkugel. So einfach scheint es Google uns offenbar nicht machen zu wollen. Tats&auml;chlich ben&ouml;tigt das Control erst Initialisierungscode, bevor es das tut, was wir von ihm erwarten.<\/p>\n<p>Da die Schnittstelle des Controls in keiner Weise dokumentiert ist, da es schlie&szlig;lich f&uuml;r die Verwendung in Webseiten vorgesehen ist, die es &uuml;ber von Google eingeklinkte komplizierte JavaScripts steuert, hat das Ausklam&uuml;sern eines funktionierenden Initialisierungscodes speziell f&uuml;r die neue, Anfang April erschienene Version 5 etwas Kopfzerbrechen bereitet &#8211; dazu sp&auml;ter mehr.<\/p>\n<p><b>Lizenzfragen<\/b><\/p>\n<p>An dieser Stelle muss darauf hingewiesen werden, dass der Einsatz des Controls unter Access nicht ganz im Sinne von Google ist. Es gibt eine Webseite [2], die Terms of Service, mit ausf&uuml;hrlichen Informationen dar&uuml;ber, unter welchen Umst&auml;nden Google Earth verwendet werden kann und darf.<\/p>\n<p>Das dort angesprochene Google Earth API [3] besteht aus einem umfangreichen Satz von JavaScripts, die nach Angabe eines Keys von den Google-Servern nachgeladen werden und damit in eigene Webseiten integriert werden k&ouml;nnen.<\/p>\n<p>Diesen Key bekommt man aber nur nach Registrierung des APIs bei Google, wenn auch kostenlos. Ein Key ist dabei immer einer bestimmten Domain oder einem Unterverzeichnis derselben zugeordnet. &Uuml;ber diese Kombination kann Google dann Nutzungsstatistiken erheben, und das ist wohl der Gegenwert, den Google f&uuml;r die freie Verwendung des Systems erwarten.<\/p>\n<p>Nun braucht man unter Access aber kein JavaScript zur Steuerung des Plugins und damit entf&auml;llt auch die sonst notwendige Angabe eines Keys. Die Daten, welche die Google Earth-Engine von den Servern zieht, k&ouml;nnen damit nicht mehr dem Nutzer zugeordnet werden. Schlimmstenfalls ist die IP des Rechners bekannt. <\/p>\n<p>Auch wenn f&uuml;r diese Situation keine klaren Handlungsanweisungen in den Terms of Service zu finden sind, kann man davon ausgehen, dass eine kommerzielle Nutzung ausgeschlossen ist. Google bietet jedoch eine Enterprise-Lizenz f&uuml;r Google Earth an, die gegebenenfalls zu erwerben w&auml;re. Wie viel das kostet, ist offenbar Verhandlungssache, denn konkrete Preisangaben sucht man vergeblich.<\/p>\n<p>Es ist also grunds&auml;tzlich wichtig, sich die Lizenzbestimmungen genauer anzusehen und selbst zu entscheiden, wie und unter welchen Umst&auml;nden man das Plugin einsetzen m&ouml;chte und darf.<\/p>\n<p><b>Objektmodell<\/b><\/p>\n<p>Wenn ein ActiveX-Steuerelement in ein Formular oder einen Bericht eingebaut wird, dann setzt Access bekanntlich automatisch einen Verweis auf die zust&auml;ndige Objektbibliothek. F&uuml;r das Google Earth-Steuerelement lautet der Name der Bibliothek <b>GEPlugin<\/b>. &Ouml;ffnen Sie einfach den VBA-Objektkatalog (<b>F2 <\/b>im VBA-Editor) und w&auml;hlen Sie diesen Eintrag aus dem linken oberen Kombinationsfeld aus.<\/p>\n<p>War die KML-Bibliothek (<b>Earthlib 1.0<\/b>) f&uuml;r Google Earth so, wie sie im erw&auml;hnten Beitrag vorgestellt wurde, noch recht &uuml;berschaubar, wird man hier von der F&uuml;lle der Schnittstellen und Methoden der GEPlugin-Library geradezu erschlagen.<\/p>\n<p>Die Funktionalit&auml;t erstreckt sich &uuml;ber Dutzende Klassen mit zahllosen Methoden und Eigenschaften. Das ist einerseits erfreulich, verspricht es doch ausgefeilte Steuerungsm&ouml;glichkeiten des Plugins, andererseits verwirrend, weil es keinerlei Dokumentation f&uuml;r das Objektmodell gibt.<\/p>\n<p>Das jedoch ist auch nicht ganz richtig, wie sich herausstellte. Das Objektmodell ist eng an das des JavaScript-APIs gekoppelt, welches Sie sich unter [3] zu Gem&uuml;te f&uuml;hren k&ouml;nnen. Sowohl die Klassenbezeichnungen als auch die Methodennamen sind weitgehend identisch mit jenen im API.<\/p>\n<p>Ihr besonderes Augenmerk sollte lediglich solchen Methodennamen gelten, die einen abschlie&szlig;enden Unterstrich aufweisen. Hier handelt es sich ausnahmslos um Funktionen, die spezifisch f&uuml;r das ActiveX-Plugin und nicht dokumentiert sind.<\/p>\n<p>Das komplette Objektmodell von Google Earth zu erl&auml;utern, w&uuml;rde diesen Beitrag sprengen. Dazu brauchte man gut und gerne ein ganzes Buch. Daher der Verweis auf die API-Dokumentation [3] und auch auf die KML-Referenz [4], die im Gegensatz zum API genauer erkl&auml;rt, wie die einzelnen Objekte einzusetzen und zu kombinieren sind.<\/p>\n<p>Wer im Aufbau von KML-Dateien bewandert ist, einem Google Earth-spezifischen XML-Schema, der wird das Objektmodell schneller verstehen. Die in der Beispieldatenbank <b>GoogleEarther5.mdb <\/b>enthaltenen Routinen sollten dar&uuml;ber hinaus hinreichend Ausgangsmaterial f&uuml;r die weitere Programmierung und Erforschung des Steuerelements enthalten.<\/p>\n<p><b>Plugin vs. Google Earth-Automatisierung <\/b><\/p>\n<p>Eingangs wurde bereits der gr&ouml;&szlig;te Vorzug genannt: Man braucht mit dem Plugin nicht mehr zwei Anwendungen, die sich den Monitor teilen oder gar Umschalten notwendig machen, sondern hat nur noch ein Access-Formular vor sich. Das enthaltene GE-Steuerelement l&auml;sst sich, je nach Anforderungen, auch per Code auf beliebige Abmessungen bringen (<b>Width<\/b>, <b>Height<\/b>).<\/p>\n<p>Was im ferngesteuerten Google Earth nur mit Verrenkungen m&ouml;glich war, etwa das Setzen von Ortsmarken oder das Zeichnen von Polygonen, l&auml;sst sich nun per Objektmodell erledigen. Fr&uuml;her musste zu diesem Zweck erst langwierig ein XML-String zusammengesetzt werden. Nun bildet sich dessen Hierarchie in Klassen und Eigenschaften ab, die man setzen sowie ab- und aufrufen kann.<\/p>\n<p>Der absolute Clou ist jedoch die M&ouml;glichkeit, auf Ereignisse des Steuerelements zu reagieren. Das ist mit der Fernsteuerl&ouml;sung schlicht unm&ouml;glich. Sowohl die Erdoberfl&auml;che wie auch jedes angelegte Objekt auf ihr ruft Mausereignisse hervor, die abgefangen und behandelt werden k&ouml;nnen. Ein Klick auf eine gesetzte Ortsmarke ruft eben ein <b>Click<\/b>-Ereignis hervor, das Bewegen der Maus &uuml;ber die Oberfl&auml;che zeitigt <b>MouseMove<\/b>-Ereignisse und der Fortschritt des Renderns l&ouml;st ein <b>Frame<\/b>-Ereignis aus.<\/p>\n<p>Und schlie&szlig;lich l&auml;sst sich ein Screenshot des Plugins in einem Formular auch leichter bewerkstelligen als in einer Fremdanwendung.<\/p>\n<p><b>Plugin-Demo<\/b><\/p>\n<p>Die neue Anwendung <b>GoogleEarther5.mdb <\/b>orientiert sich zun&auml;chst an jener des eingangs erw&auml;hnten Beitrags. Sie finden hier ein gleichartiges Kundenformular, das die Kunden der Nordwind-Datenbank anzeigt. Statt des seinerzeit eingesetzten <b>MSForms<\/b>-Bildsteuerelements kommt nun aber das Google Earth-Steuerelement ins Spiel, das im <b>Current<\/b>-Ereignis unmittelbar zur Adresse des Kundendatensatzes navigiert.<\/p>\n<p>Daneben gibt es noch ein Formular namens <b>frmGEPlugin<\/b>, das einige der m&ouml;glichen Features des Steuerelements demonstrieren soll. Beim Start der Datenbank wird aber zun&auml;chst automatisch das Formular <b>frmStart <\/b>geladen. Es hat die Aufgabe zu ermitteln, ob das Plugin &uuml;berhaupt schon in korrekter Version auf dem Rechner installiert ist. Sollte das der Fall sein, dann schlie&szlig;t es sich sang-und klanglos wieder, bevor es &uuml;berhaupt sichtbar wurde.<\/p>\n<p>Andernfalls meldet es, wie die notwendige Installation erfolgen kann (siehe Bild 1). Die Anwendung erwartet zwingend die neue Version 5 (April 2009), weil die Objektbibliothek nicht mehr kompatibel zur Version 4 (Mai 2008) ist. Sollten Sie bereits irgendwann Version 4 installiert haben, so ist es ratsam, diese zuerst &uuml;ber die Systemsteuerung zu deinstallieren, bevor die neue Version aufgespielt wird. Der Startcode im Formular ist ziemlich simpel:<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/GoogleEarth2-web-images\/frmStart_opt.jpeg\" alt=\"frmStart.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: Das Startformular erscheint, falls das Plugin nicht in der entsprechenden Version installiert ist.<\/span><\/b><\/p>\n<pre>Dim objGE As Object\r\nSet objGE = &micro;\r\nCreateObject(&quot;GEPluginCoClass.GEPluginCoClass&quot;)<\/pre>\n<p>Hier wird &uuml;ber <b>late binding <\/b>versucht, eine Instanz des Plugins zu erhalten. Dazu bedarf es noch gar keines im Formular enthaltenen ActiveX-Steuerelements, das ohnehin zur Fehlermeldung <b>Dieses Formular enth&auml;lt kein Steuerelement<\/b> beim &Ouml;ffnen f&uuml;hren w&uuml;rde.<\/p>\n<p>L&auml;sst sich eine Instanz erstellen, dann ist das Plugin offensichtlich installiert. Im n&auml;chsten Schritt erfolgt jedoch noch eine &Uuml;berpr&uuml;fung auf die passende Version, was diese Zeilen erreichen:<\/p>\n<pre>strVersion = objGE.getPluginVersion\r\nIf Val(strVersion) &lt; 5 Then...<\/pre>\n<p>Das Objekt <b>GEPluginCoClass <\/b>kennt eine Funktion <b>getPluginVersion<\/b>, welche die Dateiversionsnummer der <b>plugin_ax.dll <\/b>zur&uuml;ckgibt &#8211; aktuell etwa <b>5.0.11655.6079<\/b>. Wichtig ist nur die erste Zahl, die die Hauptversion wiedergibt und daher einfach mit <b>Val() <\/b>ermittelt wird. Waren die Tests erfolgreich, dann &ouml;ffnet der weitere Code das Formular <b>frmGEPlugin<\/b>.<\/p>\n<p>Bis dieses sichtbar geladen ist, d&uuml;rfte aber noch einige Zeit verstreichen, die mit einem in die Beispieldatenbank integrierten Meldungsformular &uuml;berbr&uuml;ckt wird.<\/p>\n<p>Diese Zeit ben&ouml;tigt das Plugin n&auml;mlich f&uuml;r seine Initialisierung. Machen Sie sich bewusst, dass dazu im Hintergrund ein komplettes Google Earth geladen werden muss, welches in Gestalt der <b>geplugin.exe <\/b>im Hauptverzeichnis des Plugins zu finden ist. Die Initialisierung geht zwar schneller vonstatten als bei der Standalone-Version, auf 5-10 Sekunden m&uuml;ssen Sie sich aber schon einrichten.<\/p>\n<p>Interessant ist der Sachverhalt, dass nach Schlie&szlig;en des Formulars <b>frmGEPlugin <\/b>und erneutem &Ouml;ffnen die Initialisierung blitzschnell abl&auml;uft. Sie m&uuml;ssen also nicht bef&uuml;rchten, dass bei jedem &Ouml;ffnen des Formulars eine Wartepause einzulegen ist. Einfache Erkl&auml;rung: Ein Schlie&szlig;en des Plugins f&uuml;hrt noch nicht automatisch zum Beenden der Engine <b>geplugin.exe <\/b>im Hintergrund. Eine neue Instanz des Plugins kann daher schnell auf den noch bestehenden Prozess zugreifen. Das zeigt sich auch darin, dass bei erneutem &Ouml;ffnen nicht etwa wieder die Erdkugel erscheint, wie in Bild 2, sondern der zuletzt im Plugin angezeigte Ort.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/GoogleEarth2-web-images\/frmDemo1_opt.jpeg\" alt=\"frmDemo1.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Demoformular zum Google Earth-Plugin <\/span><\/b><\/p>\n<p>Das Entladen der <b>geplugin.exe <\/b>geschieht nach meinen Erfahrungen erst nach ca. 30-40 Sekunden. Einfluss hat man darauf nicht. Die <b>geplugin.exe <\/b>arbeitet also in der Art eines autonomen zeitgesteuerten Services. Das Demo-Formular (siehe Bild 2) enth&auml;lt zahlreiche Steuerelemente, &uuml;ber die auf das Plugin eingewirkt werden kann. <\/p>\n<p>Dabei enth&auml;lt die Formularklasse nur relativ wenig Code. Der gr&ouml;&szlig;te Teil ist n&auml;mlich in die Klasse <b>clsGEPlugin <\/b>ausgelagert, die einen Wrapper f&uuml;r das Steuerelement darstellt. Ein solches Klassenmodul ist empfehlenswert, weil die direkte Programmierung des Controls doch etwas aufwendig ist. Einmal erstellt, kann es in beliebige Anwendungen integriert werden und h&auml;lt den restlichen ben&ouml;tigten Code in Grenzen.<\/p>\n<p>In der aktuellen Ausbaustufe der Wrapper-Klasse ist nicht viel mehr als das Notwendigste implementiert. Einige umfangreichere Prozeduren verdeutlichen zus&auml;tzlich, wie &uuml;ber das Objektmodell in Anlehnung an das KML-Schema neue Objekte auf die Erdoberfl&auml;che gebracht werden k&ouml;nnen.<\/p>\n<p><!--30percent--><\/p>\n<p>Sie k&ouml;nnen die Klasse aber f&uuml;r Ihre Zwecke gern aufbohren. Anregungen dazu bietet die API-Dokumentation [3] gen&uuml;gend. Im Folgenden sollen einige der Prozeduren der Wrapper-Klasse n&auml;her beleuchtet werden.<\/p>\n<p><b>Wrapper clsGEPlugin<\/b><\/p>\n<p>Damit eine Instanz der Klasse mit einem <b>GEPlugin <\/b>in einem Formular kommunizieren kann, besitzt es eine Objektreferenz in Form der Variablen <b>objGE<\/b>. Sie ist modulweit g&uuml;ltig und das entscheidende Objekt der Klasse. Sie wird &uuml;ber die Klasseneigenschaft <b>GEObject <\/b>gesetzt:<\/p>\n<pre>Property Set GEObject(obj As GEPluginCoClass)\r\nSet objGE = obj\r\nEnd Property<\/pre>\n<p>Nennt sich das Steuerelement im Formular etwa <b>ctlGEPlugin <\/b>und die Instanz des Wrappers <b>objGEC<\/b>, dann lautet eine Zuweisung so:<\/p>\n<pre>Set objGEC.GEObject = Me!ctlGEPlugin.Object<\/pre>\n<p>Damit ist freilich noch nichts gewonnen. Das zun&auml;chst schwarze Plugin f&uuml;llt sich erst mit Leben, nachdem die Prozedur <b>InitializeGE <\/b>aufgerufen wurde. Der Trick bei der Initialisierung des Steuerelements ist das Timing, mit welchem bestimmte Methoden abgesetzt und abgefragt werden. <\/p>\n<p>Die erste ben&ouml;tigte Methode lautet:<\/p>\n<pre>objGE.start_(&quot;&quot;)<\/pre>\n<p>Ohne diese Anweisung geschieht rein gar nichts. Ebenso obligatorisch ist die folgende Initialisierungsmethode <b>objGE.SetMainDatabase<\/b>. Sie ist in Version 5 neu und gibt einige R&auml;tsel wegen der enthaltenen Parameter auf:<\/p>\n<pre>Sub setMainDatabase_(mainDatabaseURL As String, &micro;\r\n    userName As String, password As String)<\/pre>\n<p>Hier war zun&auml;chst vermutet worden, dass Google nunmehr irgendwelche Zugangsschranken eingebaut h&auml;tte, denn egal, was f&uuml;r die (unbekannten) Parameter eingesetzt wurde, der Methodenaufruf l&ouml;ste immer einen Fehler aus.<\/p>\n<p>Tats&auml;chlich ist aber nicht der Inhalt der Parameter daf&uuml;r verantwortlich, sondern der Zustand der Engine im Hintergrund. Diese nimmt die Methode offenbar erst ab einem unklaren Zustand entgegen, daf&uuml;r dann jedoch erfreulicherweise mit schn&ouml;den Leerstrings als Parameter. Der Erfolg des Aufrufs wird daher in einer Zeitschleife abgefragt.<\/p>\n<p>Auch dann ist das Steuerelement aber noch nicht bereit. Erst, wenn die Funktion <b>objGE.testEarthFullyInitialized_ <\/b>den Wert <b>0 <\/b>zur&uuml;ckgibt, k&ouml;nnen weitere Methoden an das Steuerelement abgesetzt werden. Versucht man das schon fr&uuml;her, dann wird man regelm&auml;&szlig;ig mit der Fehlermeldung <b>Die Methode &#8230; des Objekts _GePluginCoClass schlug fehl<\/b> konfrontiert.<\/p>\n<p>Im Anschluss setzt <b>InitializeGE <\/b>noch einige Eigenschaften des Plugins wie etwa die Sichtbarkeit:<\/p>\n<pre>    objGE.GetWindow.setVisibility 1<\/pre>\n<p>Unterbleibt dies, ist im Steuerelement n&auml;mlich ebenso nichts zu sehen. Setzen Sie sp&auml;ter <b>setVisibility <\/b>auf <b>0<\/b>, dann wird die Erdkugel wiederum ausgeblendet.<\/p>\n<p>Es wurde erw&auml;hnt, dass das Steuerelement auch Ereignisse ausl&ouml;sen kann. Das geschieht jedoch nicht standardm&auml;&szlig;ig. Jedes Ereignis muss grunds&auml;tzlich erst aktiviert werden:<\/p>\n<pre>    objGE.getGlobe.onMousemoveEventEnabled 1<\/pre>\n<p>Hier wird angewiesen, dass die Erdkugel beim &Uuml;berfahren mit der Maus Ereignisse ausgeben soll. Das entspricht etwa dem, was Sie auch schon von Access kennen: Ein Steuerelement erzeugt erst dann ein <b>MouseMove<\/b>-Ereignis, wenn dessen Eigenschaft <b>OnMouseMove <\/b>auf den String-Wert <b>[Event Procedure] <\/b>gesetzt wurde. Ein anderes n&uuml;tzliches Ereignis ist dieses:<\/p>\n<pre>    objGE.onFrameendEventEnabled 1<\/pre>\n<p>Das aktiviert die Fortschrittsereignisse beim Rendern der Erdoberfl&auml;che. Um den prozentualen Fortschritt zu erhalten, muss dazu allerdings noch eine Eigenschaft in der ausgel&ouml;sten Ereignisprozedur abgefragt werden:<\/p>\n<pre>    Debug.Print objGE.getStreamingPercent<\/pre>\n<p>&Uuml;brigens zeigt sich w&auml;hrend des gesamten Initialisierungsvorgangs optional die oben erw&auml;hnte Wartemeldung. Verantwortlich daf&uuml;r ist das Formular <b>frmMsg<\/b>, welches von der Routine anfangs ge&ouml;ffnet wird. <\/p>\n<p>Nachdem <b>InitializeGE <\/b>durchlaufen ist, sollte im Plugin-Fenster die Weltkugel erscheinen. Das Plugin ist nun bereit, um weitere Anweisungen entgegenzunehmen.<\/p>\n<p><b>Anfliegen<\/b><\/p>\n<p>K&uuml;mmern wir uns nun darum, wie man einen beliebigen Ort der Erde ansteuern kann. Die einfachste Variante besteht in der &Uuml;bergabe von Breiten- und L&auml;ngengrad an die Funktion <b>GotoLoc <\/b>der Wrapper-Klasse.<\/p>\n<p>Welcher Ausschnitt der Erde im Plugin-Fenster zu sehen ist, das bestimmt eine Kamera, welche als <b>KmlCameraCoClass <\/b>ihre Entsprechung im Objektmodell findet. Leider kann man nicht einfach die Parameter <b>Latitude <\/b>und <b>Longitude <\/b>dieser Kamera einstellen. Genau genommen gibt es noch nicht mal eine &ouml;ffentlich zugreifbare Kamera, sondern nur ein Kopieobjekt &uuml;ber das <b>View<\/b>-Objekt des Plugins:<\/p>\n<pre>    Dim objCam As KmlCameraCoClass\r\n    Set objCam = objGE.getView.copyAsCamera(1)<\/pre>\n<p>Die Eigenschaften dieses Objekts k&ouml;nnen nun gesetzt werden:<\/p>\n<pre>    objCam.setLatitude &lt;Breitengrad, Double&gt;\r\n    objCam.setLongitude &lt;L&auml;ngengrad, Double&gt;\r\n    objCam.setAltitude &lt;H&ouml;he &uuml;ber Erdboden, Double&gt;<\/pre>\n<p>Da es sich bislang nur um ein Objekt im Speicher handelt, steuert das Setzen dieser Eigenschaften noch nicht die Plugin-Kamera selbst. Das muss man explizit veranlassen, indem die Kamerakopie dem Plugin zugewiesen wird:<\/p>\n<pre>    objGE.getView.setAbstractView objCam<\/pre>\n<p><b>Adressen finden<\/b><\/p>\n<p>Nun werden L&auml;ngen- und Breitengrad einer Adresse meist nicht bekannt sein. In der Google Earth-Standalone-Anwendung gibt es das <b>SearchController<\/b>-Objekt, &uuml;ber das man aus einem Adresstext die Koordinaten eines Feature-Objekts ermitteln kann &#8211; Google Earth bedient sich dabei offenbar des gleichen Servers wie Google Maps.<\/p>\n<p>Dieses Objekt fehlt dem Plugin leider. Suchanfragen zum Ermitteln eines Ortes m&uuml;ssen deshalb anderweitig gehalten werden. Zum Gl&uuml;ck bietet Google einen freien Webservice an, der genau das &uuml;bernimmt: den <b>Google Geocoding Service <\/b>[6]. Um ihn abzufragen, braucht es nur wenige Zeilen VBA-Code, der im Wrapper-Modul in der Prozedur <b>GetAddressCoord <\/b>untergebracht ist.<\/p>\n<p>Der Vorgang besteht darin, an die Service-URL ein paar Parameter in Textform anzuh&auml;ngen, sie abzuschicken und auf das zur&uuml;ckgesandte Ergebnis zu lauschen, welches die Koordinaten in w&auml;hlbarem Format pr&auml;sentiert. Eine komplette Anfrage sieht etwa so aus:<\/p>\n<pre>    http:\/\/maps.google.de\/maps\/geoq= Bundesallee+89,12161+Berlin,+Germany &amp;output=csv<\/pre>\n<p>Der <b>output<\/b>-Parameter l&auml;sst die Wahl zwischen den Formaten <b>xml<\/b>, <b>kml<\/b>, <b>csv <\/b>und <b>json <\/b>f&uuml;r die R&uuml;ckgabe zu. F&uuml;r VBA d&uuml;rfte ein kommaseparierter R&uuml;ckgabe-String (<b>csv<\/b>) wegen der einfachen Weiterverarbeitung die g&uuml;nstigste Alternative darstellen. Zu beachten ist noch: Leer- und Sonderzeichen sind im Adressen-String nicht erlaubt oder setzen die Erkennungsgenauigkeit herab. Statt Leerzeichen sollten Plus-Zeichen (+) verwendet und Umlaute wie in HTML maskiert werden. Aus <b>&auml;<\/b> wird <b>&amp;auml;<\/b>. Allerdings ist der Service meist intelligent genug, auch solche kleineren Unp&auml;sslichkeiten zu identifizieren und zu umschiffen.<\/p>\n<p>Technisch l&auml;uft die Kommunikation mit dem Service &uuml;ber die MSXML-Bibliothek und ein <b>XMLHTTP<\/b>-Objekt ab. Daf&uuml;r ist nicht mal ein Verweis n&ouml;tig:<\/p>\n<pre>    strRequest = &quot;http:\/\/maps.google.de\/maps\/geoq... &quot;\r\n    Set oHTTP = CreateObject(&quot;MSXML2.XMLHTTP&quot;)\r\n    oHTTP.Open &quot;GET&quot;, strRequest, False\r\n    oHTTP.send\r\n    If oHTTP.status = 200 Then strResult = &micro;\r\n    oHTTP.responseText<\/pre>\n<p>Die R&uuml;ckgabe, nun in <b>strResult<\/b> gespeichert, besteht aus vier kommagetrennten Teilen:<\/p>\n<pre>    200, 8, 50.5421799, 7.2519273<\/pre>\n<p>Teil 3 und 4 entsprechen dem Breiten- und L&auml;ngengrad im Double-Format. Teil 1 ist der Service-R&uuml;ckgabestatus, wobei nur der Wert <b>200 <\/b>interessiert, welcher G&uuml;ltigkeit signalisiert. Der zweite Teil muss aber ebenso beachtet werden. Er kann die Werte <b>0 <\/b>bis <b>9 <\/b>annehmen, die f&uuml;r verschiedene Erkennungsgenauigkeiten stehen. Die <b>8<\/b> im Beispiel etwa kennzeichnet Genauigkeit auf Adressebene, also inklusive Hausnummer. Eine <b>6<\/b> h&auml;tte bedeutet, dass zwar der Stra&szlig;enname, nicht aber die Hausnummer identifiziert werden konnte. &Uuml;ber diesen Wert kann also im VBA-Code als Kriterium festgelegt werden, ab welcher Genauigkeit man die zur&uuml;ckgegebenen Koordinaten als g&uuml;ltig betrachten will.<\/p>\n<p>Sind die Koordinaten nun bekannt, so k&ouml;nnen sie der oben beschriebenen Prozedur <b>GotoLoc <\/b>&uuml;bergeben werden, worauf das Plugin zum entsprechenden Erdteil schwenkt.<\/p>\n<p><b>Kippen, rotieren, drehen<\/b><\/p>\n<p>Normal zeigt das Plugin einen Ausschnitt aus der Vogelperspektive an. Damit kann man aber leider die Gel&auml;ndeformationen noch nicht erkennen, was ja gerade Google Earth von anderen Satellitenbildern abhebt.<\/p>\n<p>Also muss der Winkel zur Erdoberfl&auml;che ver&auml;ndert werden, was komfortabel mit Maus und Tastatur geschehen kann, wenn das Plugin-Fenster den Fokus besitzt: <b>Umschalttaste + Mausrad<\/b>.<\/p>\n<p>Andere Tasten plus <b>Mausrad <\/b>ver&auml;ndern andere Ansichtsparameter: <b>Strg<\/b> etwa l&auml;sst die Ansicht im Sinne des Kompass drehen. Statt des Mausrads k&ouml;nnen auch die Pfeiltasten in Kombination mit <b>Umschalt <\/b>und <b>Strg <\/b>verwendet werden.<\/p>\n<p>Selbstverst&auml;ndlich l&auml;sst sich das auch &uuml;ber VBA steuern. Im Wrapper lautet die passende Prozedur dazu <b>SetViewMode<\/b>. &auml;hnlich wie im Code oben zu <b>GotoLoc<\/b> wird hier eine Kopie der Standardkamera erhalten, modifiziert und wieder zugewiesen. Nur werden nun nicht die Eigenschaften <b>Latitude<\/b>, <b>Longitude <\/b>oder <b>Altitude <\/b>gesetzt, sondern <b>Tilt <\/b>(Kippen), <b>Roll <\/b>(Drehen) und <b>Heading <\/b>(Horizontale Neigung):<\/p>\n<pre>    objCam.setTilt &lt;Kippwinkel in Grad&gt;\r\n    objCam.setRoll &lt;Drehwinkel in Grad&gt;\r\n    objCam.setHeadingt &lt;Neigung in Grad&gt;<\/pre>\n<p>Das in Bild 3 dargestellte Demoformular <b>frmGEPlugin <\/b>steuert diese Parameter &uuml;ber Schaltfl&auml;chen, deren Eigenschaft <b>Makro wiederholen <\/b>auf <b>Ja <\/b>eingestellt ist. Damit wird der Ereigniscode <b>OnClick <\/b>endlos wiederholt, solange Sie die Schaltfl&auml;chen gedr&uuml;ckt halten, was im Falle der Drehen-Schaltfl&auml;che etwa zu fortgesetztem Rotieren um den Ort im Mittelpunkt der Kamera f&uuml;hrt.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/GoogleEarth2-web-images\/frmDemo2_opt.jpeg\" alt=\"frmDemo2.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Das Erscheinungsbild des GE-Plugins im Demoformular kann per Code gesteuert werden.<\/span><\/b><\/p>\n<p><b>Layer steuern<\/b><\/p>\n<p>&Uuml;ber Checkboxen des Formulars <b>frmGEPlugin <\/b>k&ouml;nnen bestimmte Features im Plugin ein- oder ausgeblendet werden (siehe Bild 3). Ist etwa <b>Stra&szlig;en<\/b> aktiviert, dann rendert das Plugin die Linienz&uuml;ge f&uuml;r Stra&szlig;en und deren Bezeichnungen, ist <b>Grenzen, Gebiete, Namen<\/b> gesetzt, dann werden Ortsnamen und Grenzlinien sichtbar. Diese Elemente werden nicht direkt auf die Erdoberfl&auml;che gezeichnet, sondern als transparente Layerschichten dar&uuml;ber. Jeder Layer hat einen anderen Namen oder eine andere ID. <\/p>\n<p>Stra&szlig;en k&ouml;nnen Sie per Code so einblenden:<\/p>\n<pre>    objGE.getLayerRoot.enableLayerById(objGE.LAYER_&micro;\r\n    ROADS , 1)<\/pre>\n<p>Als <b>ID <\/b>f&uuml;r den Stra&szlig;en-Layer wird hier <b>objGE.LAYER_ROADS <\/b>&uuml;bergeben und mit <b>1 <\/b>aktiviert; eine <b>0 <\/b>w&uuml;rde die Stra&szlig;en wieder ausblenden. In diesem Fall bietet das Plugin, quasi als Service, eine Funktion an, welche die <b>ID <\/b>zur&uuml;ckgibt. Dieser String lautet in Wirklichkeit so:<\/p>\n<pre>    4ddec456-c7b3-11dc-aaa5-dd553d8c9902<\/pre>\n<p>Anders sieht es f&uuml;r jene Layer aus, f&uuml;r die es keine Funktion gibt. Ortsnamen erscheinen etwa dann, wenn als Layer-ID die GUID <b>54a2ff5a-c7b3-11dc-bdad-dd553d8c9902<\/b> &uuml;bergeben wird.<\/p>\n<p>Leider gibt es keine Auflistung aller Layer und der zugeh&ouml;rigen GUIDs. Deshalb wurde in die Wrapperklasse die Prozedur <b>EnumFeatures <\/b>aufgenommen, welche alle augenblicklich existierenden Features des Plugins ausgeben und in einer Textdatei speichern kann. Dabei ist zwischen zwei Grundebenen zu unterscheiden: <b>objGE.getLayerRoot <\/b>gibt alle Features von Layern zur&uuml;ck, w&auml;hrend <b>objGE.getFeatures <\/b>die Auflistung aller benutzerdefiniert erstellten Objekte enth&auml;lt &#8211; etwa Ortsmarken, wie sp&auml;ter noch erl&auml;utert wird. Der Textdatei k&ouml;nnen Sie dann entnehmen, welchem benannten Layer welche GUID zugeordnet ist.<\/p>\n<p>Die Liste ist &uuml;brigens hierarchisch. Unter <b>Roads <\/b>finden sich Untereintr&auml;ge etwa f&uuml;r <b>TeleAtlas Thailand Roads<\/b> mit der entsprechenden <b>ID<\/b>. &Uuml;ber diese k&ouml;nnten Sie dann zum Beispiel die Stra&szlig;enansicht f&uuml;r Thailand separat steuern. Es spielt keine Rolle, an welcher Stelle der Hierarchie sich der Layer befindet. Die an <b>enableLayerById <\/b>&uuml;bergebene <b>GUID <\/b>ist einzig f&uuml;r die Identifikation verantwortlich.<\/p>\n<p><b><b>Objekte bauen<\/b><\/b><\/p>\n<p>Bisher wurden einige Grundfunktionen besprochen, &uuml;ber die das Plugin verf&uuml;gt, die weitgehend auch per Automation der Standalone-Version zu erreichen sind. Ein gro&szlig;er Vorzug des Plugins aber ist die objektorientierte Weise, in der interaktive Objekte auf der Erdoberfl&auml;che erzeugt werden k&ouml;nnen. In der Wrapperklasse sind &#8211; lediglich als Beispiele &#8211; Routinen enthalten, um Ortsmarken, Polygone und Diagramme zu kreieren. Der Fantasie sind hier keine Grenzen gesetzt, und wenn man einen Blick in die KML-Referenz riskiert, wird man gewahr, welche komplexen weiteren Gestaltungsm&ouml;glichkeiten sich hier offenbaren. Die Wrapperklasse hat in dieser Richtung am meisten Ausbaupotenzial. Denkbar sind etwa noch HTML-Links, Balloons (Sprechblasen), Bilder, die auf oder &uuml;ber der Erdoberfl&auml;che liegen, 3D-Modelle und vieles mehr.<\/p>\n<p>Ausgangspunkte f&uuml;r all diese Objekte sind jene Methoden der <b>GEPluginCoClass<\/b>, die mit <b>create&#8230; <\/b>beginnen. Inspizieren Sie hierzu einfach den VBA-Objektkatalog (F2). Da eine komplette Beschreibung des teilweise doch recht komplexen Codes den Rahmen dieses Beitrags sprengen w&uuml;rde, sollen hier nur zwei Objekte in Ausschnitten erl&auml;utert werden: Ortsmarken und Diagramme. Wie andere Objekte &#8211; im Earth-Sprachgebrauch Features &#8211; erstellt werden, das ergibt sich &uuml;brigens aus den Beispielen, die Google auf der API-Webseite bereitgestellt hat. Die dort angef&uuml;hrten JavaScript-Codes lassen sich fast 1:1 in VBA &uuml;bersetzen.<\/p>\n<p><b>Ortsmarken setzen<\/b><\/p>\n<p>Ortsmarken sind nicht nur jene Labels mit dem birnenf&ouml;rmigen Symbol, das Sie vielleicht schon aus Google-Maps kennen. Fast alle Objekte und selbst Linien ben&ouml;tigen einen Container, der sie beherbergt, und das sind die Ortsmarken oder <b>Placemarks<\/b>. Den Anfang beim Erstellen eines grafischen Objekts auf der Erdoberfl&auml;che macht also immer ein <b>Placemark<\/b>:<\/p>\n<pre>    Dim objPlacemark As KmlPlacemarkCoClass\r\n    Set objPlacemark = objGE.CreatePlacemark(NameID)<\/pre>\n<p>Der Parameter <b>NameID <\/b>ist optional und kann auch durch einen Leerstring ersetzt werden. Dann aber ist das Objekt sp&auml;ter nicht mehr identifizierbar. Solange Sie das erstellte Objekt unber&uuml;hrt lassen m&ouml;chten, ist das tats&auml;chlich ohne Belang. Sobald aber ein Objekt wieder per Code gel&ouml;scht werden soll oder man ein Klickereignis auf eine Ortsmarke zuordnen m&ouml;chte, wird ein eindeutiges Identifizierungsmerkmal ben&ouml;tigt. Dass diese &uuml;bergebene ID tats&auml;chlich eindeutig ist, erkennen Sie daran, dass ein Fehler ausgel&ouml;st wird, wenn Sie ein Objekt mehr als einmal mit der gleichen Kennzeichnung anzulegen versuchen. Machen Sie den Test und erzeugen Sie im Formular <b>frmGEPlugin <\/b>oder <b>frmKunden <\/b>zum gleichen Datensatz wiederholt einen Marker &uuml;ber die entsprechende Schaltfl&auml;che. Es wird nur einmal klappen und dann nur noch Fehlermeldungen ausl&ouml;sen, weil die referentielle Integrit&auml;t verletzt wurde.<\/p>\n<p>&Uuml;brigens kann nicht nur der Methode <b>createPlacemark <\/b>eine <b>ID <\/b>&uuml;bergeben werden, sondern grunds&auml;tzlich allen per <b>create&#8230;<\/b>-Methode erzeugten Objekten, wie Punkten, Linien, Icons und sogar <b>Style<\/b>-Eigenschaften. Brauchen wird man das allerdings in den seltensten F&auml;llen.<\/p>\n<p>Zur&uuml;ck zum <b>Placemark<\/b>. Eigentlich ist das ein abstraktes Objekt, das noch keinen Inhalt hat. Man kann es zwar an Koordinaten setzen, es wei&szlig; aber noch nicht, was es anzeigen soll, und erscheint darum transparent. Das &auml;ndert sich aber bereits, wenn Sie ihm einen Text verpassen, was &uuml;ber die Methode <b>setName <\/b>geschieht:<\/p>\n<pre>    objPlacemark.setName Description &lt;Beschreibung&gt;<\/pre>\n<p>Die Beschreibung erschiene nun als Label auf der Erde. Es fehlt dazu allerdings noch ein Vorgang. Das <b>Placemark <\/b>muss erst an die Liste der Google Earth-Features angeh&auml;ngt werden. Das entspricht etwa dem Hinzuf&uuml;gen zur Liste <b>Meine Orte<\/b> der Standalone-Anwendung. Die Features-Auflistung erh&auml;lt man im Objektmodell &uuml;ber die <b>getFeatures<\/b>-Methode des Plugins:<\/p>\n<pre>    objGE.getFeatures.appendChild objPlacemark<\/pre>\n<p>Leider reichen auch diese vier Zeilen Code noch nicht aus, um die Ortsmarke tats&auml;chlich einzublenden. Denn das <b>Placemark<\/b>-Objekt kennt keine Eigenschaften wie <b>Latitude <\/b>und <b>Longitude<\/b>, die ihm sagen w&uuml;rden, wo genau auf der Erdoberfl&auml;che es zu erscheinen hat. Darum kommt hier ein Hilfsobjekt ins Spiel, das Koordinaten aufnehmen kann: ein <b>KmlPointCoClass<\/b>, mithin ein Punkt. Das erzeugt man zun&auml;chst &uuml;ber die passende <b>create&#8230;<\/b>-Methode, setzt die Koordinaten und weist es anschlie&szlig;end dem <b>Placemark <\/b>&uuml;ber dessen <b>getGeometry<\/b>-Methode zu:<\/p>\n<pre>    Dim objPT As KmlPointCoClass\r\n    Set objPT = objGE.createPoint(&quot;&quot;)\r\n    objPT .setLongitude &lt;Double-Wert&gt;\r\n    objPT .setLatitude &lt;Double-Wert&gt;\r\n    objPlacemark.setGeometry objPT<\/pre>\n<p>Nun endlich erscheint die Ortsmarke im Plugin-Fenster. Vielleicht irritiert es Sie, dass sie als Symbol ein blaues Rechteck mit Kreuzchen anzeigt. Das ist das Vorgabesymbol, wenn kein anderes Icon spezifiziert wurde. Aber das l&auml;sst sich leicht &auml;ndern. Wie so oft im GE-Objektmodell gibt es hierf&uuml;r jedoch keine Icon-Eigenschaft, die man setzen k&ouml;nnte, sondern es muss erst ein Icon-Objekt erstellt und der Ortsmarke zugewiesen werden:<\/p>\n<pre>    Dim objIcon As KmlIconCoClass\r\n    Set objIcon = objGE.createIcon(&quot;&quot;)\r\n    objIcon.setHref &lt;IconURL&gt;<\/pre>\n<p><b>IconURL <\/b>ist der Pfad zur Bilddatei, die vorzugsweise im <b>png<\/b>-Format daherkommen sollte, weil dieses Transparenz unterst&uuml;tzt. Nun wird es interessant: Was ist unter Pfad zu verstehen Das Plugin kommuniziert ja nur &uuml;ber Internet mit dem Datenserver. Der Versuch, etwa einen Pfad zu &uuml;bergeben wie <b>c:\\eigene dateien\\bilder\\icon.png<\/b>, schl&auml;gt folgerichtig fehl, was sich schlicht in einem transparenten Symbol manifestiert. Haben Sie eine Bilddatei hingegen auf Ihren Webserver hochgeladen, dann l&auml;sst sich diese URL problemlos verwenden:<\/p>\n<pre>    objIcon.setHref &micro;\r\n    &quot;http:\/\/www.moss-soft.de\/public\/red24.png&quot;<\/pre>\n<p>&#8222;Das ist ja uncool!&#8220;, werden Sie denken, denn erst alle m&ouml;glichen Bilddateien auf einen Webserver hochzuladen, ist sicher keine besonders einfallsreiche L&ouml;sung. Es gibt gl&uuml;cklicherweise einen Ausweg. Wenn Sie sich die Unterverzeichnisse der Plugin-Installation n&auml;her ansehen, dann werden Sie einen Zweig <b>\\res <\/b>entdecken, der wieder Unterverzeichnisse wie <b>\\paddle<\/b>, <b>\\pushpin <\/b>oder <b>\\shapes <\/b>enth&auml;lt. Darin befinden sich <b>.png<\/b>-Dateien. Wof&uuml;r sollte das Plugin die brauchen, wenn nicht f&uuml;r seine Ortsmarken Und richtig, der Versuch, ein solches Verzeichnis anzugeben, f&uuml;hrt zum Erfolg:<\/p>\n<pre>    objIcon.setHref &quot;paddle\/7.png&quot;<\/pre>\n<p>Sie k&ouml;nnen ebenso gut ein neues Unterverzeichnis unter <b>\\res <\/b>anlegen und dort benutzerdefinierte <b>.png<\/b>-Dateien speichern. Auf diese Weise k&ouml;nnen beliebige Grafiken im Plugin angezeigt werden.<\/p>\n<p>Da die Abmessungen nicht limitiert sind und etwa auch Bilder der Aufl&ouml;sung 300 x 300 Pixel m&ouml;glich sind, er&ouml;ffnet das ganz neue M&ouml;glichkeiten. Im sp&auml;teren Absatz zu Diagrammen wird von dieser Technik Gebrauch gemacht.<\/p>\n<p>Zur&uuml;ck zum <b>Icon<\/b>-Objekt, das nun erstellt, aber noch nicht dem <b>Placemark <\/b>zugeordnet wurde. Das geht auch nicht direkt, weil das <b>Placemark<\/b>-Objekt keine entsprechende Methode aufweist. Leider ist das Objektmodell an dieser Stelle weit verschachtelt und es m&uuml;ssen glatt noch zwei Zwischenobjekte her, die das Icon aufnehmen k&ouml;nnen: das <b>KmlStyleCoClass<\/b>&#8211; und das <b>KmlStyleMapCoClass<\/b>-Objekt.<\/p>\n<pre>    Dim objStyle As KmlStyleCoClass\r\n    Dim objStylemap As KmlStyleMapCoClass\r\n    Set objStyle = objGE.createStyle(&quot;&quot;)\r\n    Set objStylemap = objGE.createStyleMap(&quot;&quot;)\r\n    objStyle.getIconStyle.setIcon oIcon\r\n    objStylemap .setStyle objStyle, objStyle\r\n    objPlacemark.setStyleSelector objStylemap<\/pre>\n<p>Dem <b>Style<\/b>-Objekt wird das Icon zugewiesen, das <b>Style<\/b>-Objekt dem <b>Stylemap<\/b>-Objekt und dieses schlie&szlig;lich dem <b>Placemark<\/b>-Objekt. Warum so kompliziert<\/p>\n<p>Der Grund liegt darin, dass diese beiden Zwischenobjekte noch viele weitere Eigenschaften haben, &uuml;ber die man das Aussehen des Icons steuern kann &#8211; etwa die Gr&ouml;&szlig;e (<b>setScale<\/b>), aber auch ausgefallenere Eigenschaften wie seinen Winkel zur Erdoberfl&auml;che. Ziehen Sie hier auch die API-Dokumentation zurate.<\/p>\n<p>Das <b>Stylemap<\/b>-Objekt wiederum kann zwei unterschiedliche Styles mit unterschiedlichen Icons und Eigenschaften aufnehmen. Der eine f&uuml;r das normale Aussehen, der andere f&uuml;r den <b>Highlight<\/b>-State, der eintritt, wenn die Ortsmarke mit der Maus &uuml;berfahren, also quasi aktiviert wird. Im Beispiel wurde aber &uuml;ber die <b>setStyle<\/b>-Methode beiden Zust&auml;nden der gleiche <b>Style <\/b>zugewiesen.<\/p>\n<p>Abschlie&szlig;end nochmals der Hinweis, dass Sie all diese Programmierwege keineswegs &uuml;ber Experimente und den Objektkatalog herausbekommen m&uuml;ssen. Aus dem Google Earth-API [3] und Beispielen geht alles Notwendige hervor.<\/p>\n<p><b>Diagramm erzeugen<\/b><\/p>\n<p>Wie w&auml;re es, wenn Sie im Google Earth-Plugin f&uuml;r verschiedene Orte Diagramme anzeigen k&ouml;nnten, die etwa die Ums&auml;tze der ans&auml;ssigen Kunden verdeutlichen<\/p>\n<p>Wie das zu realisieren ist, k&ouml;nnen Sie sich m&ouml;glicherweise nach den Ausf&uuml;hrungen zum <b>Placemark<\/b>-Objekt und dessen Icon denken. Es wird nur eine Grafikdatei mit dem Diagramm ben&ouml;tigt, die der Ortsmarke zugewiesen werden muss. Als Demonstration enth&auml;lt die Wrapperklasse dazu die Prozedur <b>CreateChart<\/b>.<\/p>\n<p>Wie, um alles in der Welt, kann aber Access ein solches Diagramm als Bilddatei erzeugen Gar nicht, w&uuml;rde ich sagen, falls Sie nicht schweres API-Gesch&uuml;tz auffahren wollen. <\/p>\n<p>Doch Google w&auml;re nicht Google, hielte es nicht auch f&uuml;r diesen Zweck ein passendes API bereit. Der freie Chart-Webservice [5] erstellt mit wenigen Parameterangaben eine solche <b>.png<\/b>-Diagrammgrafik. Sie haben die Wahl unter verschiedensten Diagrammtypen und Erscheinungsbildern.<\/p>\n<p>&auml;hnlich wie beim besprochenen Geocoding-Service werden die Steuerparameter inklusive der Daten als Strings an die Service-URL angeh&auml;ngt. Auch hier kommt MSXML als Kommunikationsschnittstelle zum Einsatz, jedoch in erweiterter Form, weil die R&uuml;ckgabe nicht als String erfolgt, sondern als Dateistream-Objekt. Um aus diesem Stream eine Bilddatei zu machen, kommt man um eine weitere Bibliothek nicht herum. In der Beispieldatenbank findet sich das Modul <b>mdlGDIPlus<\/b>, welches von der <b>gdiplus<\/b>-Bibliothek von Windows XP oder Vista Gebrauch macht. Die Prozedur <b>SaveStreamToPNG <\/b>des Moduls verwandelt den <b>http<\/b>-Stream in eine <b>.png<\/b>-Datei:<\/p>\n<pre>    SaveStreamToPNG oHTTP.responseStream, &micro;\r\n    GEPluginPath &amp; &quot;res\\user\\&quot; &amp; NameID &amp; &quot;.png&quot;)<\/pre>\n<p>Der Pfad f&uuml;r die Bilddatei wird dabei wie folgt zusammengesetzt. Zuerst wird der Ort der Plugin-Installation &uuml;ber die Wrapper-eigene Funktion <b>GEPluginPath <\/b>ermittelt.<\/p>\n<p>Daran wird das Ressourcenverzeichnis <b>res\\user <\/b>angeh&auml;ngt. Das Plugin kann nur auf Verzeichnisse unterhalb des <b>\\res<\/b>-Zweigs zugreifen. Das <b>\\user<\/b>-Unterverzeichnis wurde von der Wrapperklasse schon beim Initialisieren automatisch angelegt. Als Dateiname wird die <b>ID <\/b>der Ortsmarke, welche das Diagramm identifizieren soll, &uuml;bergeben. Damit haben wir alles beisammen, um im weiteren Schritt eine Ortsmarke anzulegen und ihr als Icon das soeben erstellte Diagrammbild zuzuweisen:<\/p>\n<pre>    CreatePlacemark NameID, Lat, Lon, &micro;\r\n    Title, &quot;user\\&quot; &amp; NameID &amp; &quot;.png&quot;<\/pre>\n<p>Wie das im Ergebnis aussieht, k&ouml;nnen Sie in Bild 4 begutachten.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/GoogleEarth2-web-images\/diagram_opt.jpeg\" alt=\"diagram.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: Umsatz-Tortendiagramm als Ortsmarke im Google Earth-Steuerelement<\/span><\/b><\/p>\n<p><b>Kundenformular, Version II<\/b><\/p>\n<p>Das hier gezeigte Diagramm, das &uuml;ber die Schaltfl&auml;che <b>Umsatz-Chart <\/b>des Kundenformulars (siehe Bild 5) zustande kam, hat nur begrenzte Aussagekraft.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2009_03\/GoogleEarth2-web-images\/frmKunden_opt.jpeg\" alt=\"frmKunden.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Das Kundenformular im neuen Gewand und mit neuen M&ouml;glichkeiten<\/span><\/b><\/p>\n<p>Mit etwas mehr Gestaltung, was zus&auml;tzliche Parameter f&uuml;r den Chart-Service voraussetzt, kann man aber durchaus komplexe Grafiken erzeugen.<\/p>\n<p>Die Daten f&uuml;r das Diagramm kommen &uuml;brigens aus einer Abfrage analog der <b>qry_UmsatzJahr <\/b>der Datenbank. Wie die Daten aus dieser Abfrage via Recordset in die Repr&auml;sentation f&uuml;r den Chart-Service &uuml;berf&uuml;hrt werden, erfahren Sie in der Prozedur <b>cmdChart_Click <\/b>des Formulars.<\/p>\n<p>Wenn Sie rein zuf&auml;llig auf das Diagramm im Plugin klicken, dann verschwindet es wieder. Das ist nicht etwa sein Standardverhalten, sondern zum Spa&szlig; so in die Formularklasse einprogrammiert und demonstriert, wie Sie mit Events umgehen k&ouml;nnen.<\/p>\n<p>Ausgel&ouml;st wird das Ereignis von der Wrapperklasse, die das Ereignis <b>PlacemarkEvent <\/b>bereitstellt:<\/p>\n<pre>    Private Sub objGEC_PlacemarkEvent(ByVal NameID &micro;\r\n        As String, ByVal EventName As String)\r\n        Debug.Print &micro;\r\n        &quot;Placemark &apos;&quot; &amp; NameID &amp; &quot;&apos; &gt; &quot; &amp; EventName\r\n        objGEC.RemoveFeature NameID\r\n        End Sub<\/pre>\n<p>Das Ereignis &uuml;bergibt als Parameter jenen Identifikator in <b>NameID<\/b>, den Sie beim Erstellen der Diagramm-Ortsmarke verwendet haben. Hier wird deutlich, warum die Vergabe einer eindeutigen <b>ID <\/b>wichtig ist. Sie k&ouml;nnen nun ermitteln, auf welches Objekt geklickt wurde. Im Folgenden wird dann die Prozedur <b>RemoveFeature <\/b>der Wrapperklasse aufgerufen, die das Objekt mit der entsprechenden <b>ID <\/b>wieder l&ouml;scht.<\/p>\n<p>Daf&uuml;r, also zum L&ouml;schen eines Feature-Elements, gibt es im Objektmodell keine einfache Methode. Die einzig dargebotene L&ouml;schmethode ist diese:<\/p>\n<pre>    objGE.getFeatures.removeChild obj<\/pre>\n<p>F&uuml;r <b>obj <\/b>ist dabei direkt etwa ein <b>Placemark<\/b>-Objekt zu &uuml;bergeben. Nur gibt es leider keine Funktion, die &uuml;ber die ID eines Objekts dieses selbst zur&uuml;ckgeben w&uuml;rde, also etwas &auml;hnliches wie im HTML-DOM-Modell die Methode <b>GetElementByID<\/b>. Stattdessen m&uuml;ssen in einer Schleife alle Feature-Objekte des Plugins durchlaufen und ihre Namen mit <b>NameID <\/b>verglichen werden, bis es zur &Uuml;bereinstimmung kommt. Daf&uuml;r ist die Hilfsroutine <b>GetObjectByID<\/b> des Wrappers zust&auml;ndig.<\/p>\n<p>Damit das Kundenformular die gleichen M&ouml;glichkeiten bietet, wie jenes aus dem oben erw&auml;hnten Beitrag, musste nat&uuml;rlich auch die <b>Screenshot<\/b>-Funktion eingebaut werden. &Uuml;ber die Schaltfl&auml;che <b>Schnappschussfoto <\/b>wird ein Abbild des Plugins erzeugt und wahlweise in einer Bilddatei gespeichert. Dazu wird die Funktion <b>GetPicture <\/b>der Wrapperklasse aufgerufen. Man muss ihr als Parameter eine Referenz auf das Formular &uuml;bergeben, welches das Plugin enth&auml;lt. Grund daf&uuml;r ist, dass das Plugin keine Funktion f&uuml;r das Fenster-Handle bereitstellt, sodass Sie in der etwas umst&auml;ndlichen Hilfsroutine <b>GetPluginWindow <\/b>erst durch API-Enumeration der Kindfenster des Formulars zum ActiveX-Fenster gelangen. Ohne Fenster-Handle des Steuerelements kein Screenshot!<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Wenn Sie L&ouml;sungen analog der bereitgestellten Demo f&uuml;r Ihre Anwendung vorsehen m&ouml;chten, dann sind aus der Beispieldatenbank folgende Elemente zu importieren:<\/p>\n<p>Die Klasse <b>clsGEPlugin<\/b>, die Module <b>mdlGDIPlus<\/b>, <b>mdlTools <\/b>und das Formular <b>frmMsg<\/b>. Optional kann auch das Startformular <b>frmStart <\/b>integriert werden. Ein Verweis auf die <b>GEPlugin Type Library <\/b>muss zudem gesetzt werden.<\/p>\n<p>Eine Garantie, dass der Code der Elemente ewig funktionieren wird, kann nicht gegeben werden. M&ouml;glicherweise erf&auml;hrt das Objektmodell in zuk&uuml;nftigen Versionen des Plugins weitere &auml;nderungen, so wie dies vor einigen Wochen mit dem Update von Version 4 auf 5 geschah. In den <b>KML<\/b>-Foren von Google wird bereits &auml;hnliches von zust&auml;ndigen Entwicklern angedroht. Das gilt ebenso f&uuml;r die bisher freien Google-Services <b>GeoCoding<\/b>&#8211; und <b>Chart-API<\/b>. Wir versuchen, Sie auf dem Laufenden zu halten, falls sich hier Abweichungen einschleichen.<\/p>\n<p class=\"zwischen-berschriftquellen\">Literaturhinweise<\/p>\n<p class=\"quellen\">[1] Download des Plugins: http:\/\/earth-api-samples.googlecode.com\/svn\/trunk\/demos\/helloearth\/index.html<\/p>\n<p class=\"quellen\">[2] Lizenzbestimmungen zum Plugin: http:\/\/code.google.com\/intl\/de\/apis\/maps\/terms.html<\/p>\n<p class=\"quellen\">[3] Google Earth-API: http:\/\/code.google.com\/intl\/de\/apis\/earth\/documentation\/reference\/index.html<\/p>\n<p class=\"quellen\">[4] KML-Referenz: http:\/\/code.google.com\/intl\/de\/apis\/kml\/documentation\/kmlreference.html<\/p>\n<p class=\"quellen\">[5] Chart-API: http:\/\/code.google.com\/intl\/de\/apis\/chart\/basics.html<\/p>\n<p class=\"quellen\">[6] Geocoding-API: http:\/\/code.google.com\/intl\/de\/apis\/maps\/documentation\/services.html#Geocoding_Direct<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>GoogleEarther5c.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{AD445EA0-C906-43A8-B68F-DAD647E07BCD}\/aiu_670.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Google Earth in Ihrer eigenen Anwendung &#8211; angezeigt in einem ganz normal Formular, dass Sie nach Belieben mit Steuerelementen best&uuml;cken k&ouml;nnen, um durch die Gegend zu schwirren, Orte zu suchen, Details anzuzeigen oder gar Grafiken oder Texte unterzubringen Ja, das geht. Wir zeigen, wie es funktioniert und was Sie beim Einsatz des ben&ouml;tigten ActiveX-Steuerelements beachten  m&uuml;ssen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662009,66032009,44000026,44000027],"tags":[],"class_list":["post-55000670","post","type-post","status-publish","format-standard","hentry","category-662009","category-66032009","category-Interaktiv","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Google Earth ferngesteuert, Teil II - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Google Earth ferngesteuert, Teil II\" \/>\n<meta property=\"og:description\" content=\"Google Earth in Ihrer eigenen Anwendung - angezeigt in einem ganz normal Formular, dass Sie nach Belieben mit Steuerelementen best&uuml;cken k&ouml;nnen, um durch die Gegend zu schwirren, Orte zu suchen, Details anzuzeigen oder gar Grafiken oder Texte unterzubringen Ja, das geht. Wir zeigen, wie es funktioniert und was Sie beim Einsatz des ben&ouml;tigten ActiveX-Steuerelements beachten m&uuml;ssen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T22:23:59+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg02.met.vgwort.de\/na\/8e61108837884f0fb3a5fd64fbdada6d\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"33\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Google Earth ferngesteuert, Teil II\",\"datePublished\":\"2020-05-22T22:23:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/\"},\"wordCount\":6345,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/8e61108837884f0fb3a5fd64fbdada6d\",\"articleSection\":[\"2009\",\"3\\\/2009\",\"Interaktiv\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/\",\"name\":\"Google Earth ferngesteuert, Teil II - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/8e61108837884f0fb3a5fd64fbdada6d\",\"datePublished\":\"2020-05-22T22:23:59+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/8e61108837884f0fb3a5fd64fbdada6d\",\"contentUrl\":\"http:\\\/\\\/vg02.met.vgwort.de\\\/na\\\/8e61108837884f0fb3a5fd64fbdada6d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Google_Earth_ferngesteuert_Teil_II\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Google Earth ferngesteuert, Teil II\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Google Earth ferngesteuert, Teil II - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/","og_locale":"de_DE","og_type":"article","og_title":"Google Earth ferngesteuert, Teil II","og_description":"Google Earth in Ihrer eigenen Anwendung - angezeigt in einem ganz normal Formular, dass Sie nach Belieben mit Steuerelementen best&uuml;cken k&ouml;nnen, um durch die Gegend zu schwirren, Orte zu suchen, Details anzuzeigen oder gar Grafiken oder Texte unterzubringen Ja, das geht. Wir zeigen, wie es funktioniert und was Sie beim Einsatz des ben&ouml;tigten ActiveX-Steuerelements beachten m&uuml;ssen.","og_url":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T22:23:59+00:00","og_image":[{"url":"http:\/\/vg02.met.vgwort.de\/na\/8e61108837884f0fb3a5fd64fbdada6d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"33\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Google Earth ferngesteuert, Teil II","datePublished":"2020-05-22T22:23:59+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/"},"wordCount":6345,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/8e61108837884f0fb3a5fd64fbdada6d","articleSection":["2009","3\/2009","Interaktiv","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/","url":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/","name":"Google Earth ferngesteuert, Teil II - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#primaryimage"},"thumbnailUrl":"http:\/\/vg02.met.vgwort.de\/na\/8e61108837884f0fb3a5fd64fbdada6d","datePublished":"2020-05-22T22:23:59+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#primaryimage","url":"http:\/\/vg02.met.vgwort.de\/na\/8e61108837884f0fb3a5fd64fbdada6d","contentUrl":"http:\/\/vg02.met.vgwort.de\/na\/8e61108837884f0fb3a5fd64fbdada6d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Google_Earth_ferngesteuert_Teil_II\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Google Earth ferngesteuert, Teil II"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000670"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000670\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000670"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}