![]() |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 2)
Beispiel 8
Animation eines Markers und Ermittlung des Höhenprofils entlang eines Pfades In dieser Demo wurde Ayers Rock gewählt, da sich an diesem Beispiel das ermittelte Höhenprofil gut nachvollziehen läßt. Um einen Pfad zu erstellen, muß einfach auf zwei Punkte innerhalb der Karte geklickt werden - empfehlenswert natürlich jeweils ein mal auf entgegengesetze Punkte des Felsens. Bei jedem dieser beiden Klicks wird ein verschiebbarer Marker erstellt. Wurde der zweite Marker gesetzt, wird zwischen den beiden ein Pfad erzeugt (Polyline) und vom Google-Server das Höhenprofil entlang des Pfades abgefragt. Die Antwort erfolgt wie immer asynchron und wird in der entsprechenden Delphi-Methode ausgewertet. Die Höhendaten werden dabei in einer Stringliste gespeichert. Das würde natürlich genauso gut über ein Array mit Double-Werten gehen. Grafisch wird das Höhenprofil in einer PaintBox dargestellt. Über den Schieberegler läßt sich ein dritter Marker zwischen dem Anfang- und dem Endpunkt des Pfades verschieben. Anhang 33018 Compilierte Exe: |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 2)
Beispiel 9
Interaktion zwischen zwei Karten innerhalb verschiedenen Browser-Komponenten Innerhalb einer Browser-Komponente können problemlos mehrere Karten untergebracht werden, die sowohl das selbe Google Maps API als auch die selben JavaScript-Objekte nutzen. Was ist aber, wenn die Karten in verschiedenen TWebBrowser-Komponenten untergebracht werden sollen? Dann sind nämlich einige Regeln zu beachten, damit alles wie erwartet funktioniert und es zu keinen JavaScript-Fehlern kommt (auch COM-Fehler werden teilweise als JavaScript-Fehler gemeldet, da es sich hierbei um COM-Zugriffe auf die Script-Engine des Browsers handelt). Wurde bis jetzt immer mit einem Skript-Objekt gearbeitet, muß jetzt für jede verwendete Browser-Komponente ein eigenes erstellt werden:
Delphi-Quellcode:
Bei der Erstellung von Objekten muß außerdem immer das Skript-(COM-)Objekt angegeben werden. Bei allen über das Google Maps API erstellten Objekten ist dies automatisch der Fall:
Script1:=TScript.Create(WebBrowser1);
Script2:=TScript.Create(WebBrowser2);
Delphi-Quellcode:
Werden aber andere Strukturen, wie zum Beispiel Arrays, einfache Objekte oder davon abgeleitet Klassen - wie zum Beispiel TMapOptions - direkt erstellt, muß in ihrem Konstruktor der Skriptkontext angeben werden, in dem die Erstellung erfolgen soll:
Map1:=Script1.Google.Maps.Map(...);
Map2:=Script2.Google.Maps.Map(...);
Delphi-Quellcode:
In den meisten Fällen wird sicherlich mit einer Browser-Komponente gearbeitet. Dann kann der optionale Skript-Parameter im Konstruktor des zu erstellenden Objektes weggelassen werden und vom Framework wird automatisch ein globales Skript-Objekt verwendet (Variable Script in der Unit JScriptObjects).
//MapOpts wird in WebBrowser1 erstellt:
Script1:=TScript.Create(WebBrowser1); MapOpts:=TMapOptions.Create(Script1); Ein Beispiel: Die Karte 2 soll das selbe Zentrum wie Karte 1 haben, wobei sich beide Karten in unterschiedlichen Browser-Komponenten befinden.
Delphi-Quellcode:
Diese Zuweisung führt zu einem JavaScript-Fehler, da es sich bei den Koordinaten um ein (T)LatLng-Objekt handelt, das nicht einfach von WebBrowser1 an WebBrowser2 übergeben werden kann. Genauer gesagt: Wie in Delphi wird nicht das gesamte Objekt übergeben, sondern nur ein Zeiger (eine Referenz) auf dieses Objekt. Das funktioniert natürlich nicht, da die beiden COM-Server (Browser-Komponenten) nicht ohne weiteres aufeinander zugreifen können.
Map2.Center:=Map1.Center;
//-> JavaScript-Fehlermeldung Als Lösung bietet sich die Erstellung eines neuen Objektes im Kontext von WebBrowser2 an mit anschließender Übertragung der Eigenschaften. Das würde in Delphi etwa einem Assign entsprechen. Im Falle der Übertragung eines LatLng-Objektes könnte das so ablaufen:
Delphi-Quellcode:
Anhang 33029
Map2.Center:=Script2.Google.Maps.LatLng(Map1.Center.Lat,Map1.Center.Lng);
//... Compilierte Exe: |
AW: Google Maps über COM (Component Object Model)
Lieber Thom,
ich finde deine Arbeit hervorragend:-D. Könntest du mir dein Framework zu eigenen Test zukommen lassen. Herzlichen Dank. |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 2)
Lieber Markus,
vielen Dank! Ich hoffe, Du konntest schon etwas mit dem Framework experimentieren. Auch vielen Dank an AndreFM! Damit verbunden viele Grüße an die ADUG - die ![]() ![]() Da dabei "a simple application to retrieve the 'driving time' and distance between two addresses" besprochen werden wird, möchte ich das Problem mal etwas "globalisieren". Goggle Maps unterstützt bei der Routenplanung leider nur eine "landgebundene" Fortbewegung. Eine interkontinentale Reise ist da wohl (noch) nicht vorgesehen. Deshalb habe ich etwas nachgeholfen und geschaut, wie lange und wie weit ich reisen müßte, um am Treffen teilnehmen zu können: Anhang 33115 Abgesehen von den lächerlichen 16703 Kilometern und den 21 Stunden und 17 Minuten Reisezeit (nicht mitgerechnet: Zwischenaufenthalte, Zollkontrollen, Staus auf den Straßen...) eigentlich kein Problem. :wink: Das Ergebnis meiner "Flugzeitformel" komme sogar recht gut an die Werte heran, die die Seite ![]() |
AW: Google Maps über COM (Component Object Model)
Hallo Thom,
Dein tolles Framework kommt für mich gerade zur rechten Zeit. In meinem Projekt werden Marker auf eine Karte gesetzt, die aus einer DB gelesen werden und ständigen Änderungen (Anzahl, Location, Aussehen) unterliegen. Evtl. später noch Routen berechnen. Das Ganze wird erstmal in D7 umgesetzt. Es wäre schön, wenn Du mir das Framework zur verfügung stellen könntest. Gruß Stefan |
AW: Google Maps über COM (Component Object Model)
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Stefan, vielen Dank für das Lob! :-D
Ich hoffe, Du konntest das Framework inzwischen etwas testen. Vielen Dank an Markus Delphi für das Testen unter Delphi 7 und die Hinweise dazu! Vielen Dank auch an die ![]() Einen besonderen Dank und viele Grüße an AndreFM! :hello: Auch an Baoquan Zuo (Paul) aus Shanghai einen herzlichen Dank für die Lizenz zum IDE-Plugin ![]() Die ersten 3 Units habe ich mit seiner Hilfe schon dokumentiert. Bei so viel Interesse muss ich natürlich weitermachen. Deshalb folgt hier eine weitere Demo: Beispiel 10 Nutzung eigener Bilder für die Darstellung der Karte Ein interessanter Aspekt ist die Möglichkeit, das Google Maps API für die Anzeige eigener Karten und Bilder zu verwenden. Damit stehen alle Möglichkeiten wie Zoom, Verschiebung, Marker, Info-Fenster und grafische Elemente zur Verfügung. Wie wäre es, die Mondoberfläche darzustellen? Diese ![]() Doch wie kann das jetzt mit Delphi umgesetzt werden? Um das Gesamtbild darstellen zu können, muss dem API mitgeteilt werden, woher es die einzelnen Teile - die Bildkacheln - bekommt. Dazu wird die Klasse TImageMapTypeOptions genommen, mit dessen Hilfe ein TImageMapType-Objekt erstellt wird. Bei der Initialisierung der Optionen wird neben den Werten für die Größe der Bildkacheln unter anderem die Funktion GetTileUrl festgelegt, die bei ihrem Aufruf die Koordinaten den angeforderten Kachel und die aktuelle Zoomstufe der Karte übergeben bekommt. Daraus muss sie eine URL generieren, von der die benötigte Bildkachel geladen werden kann. Praktisch sieht das so aus:
Delphi-Quellcode:
Anhang 33162
procedure TForm1.FormShow(Sender: TObject);
var Map: TMap; MapOptions: TMapOptions; MoonMapTypeOptions: TImageMapTypeOptions; MoonMapType: TImageMapType; begin //... //Layer anlegen: MoonMapTypeOptions:=TImageMapTypeOptions.Create; //Options-Objekt anlegen with MoonMapTypeOptions do begin GetTileUrl:=self.GetTileUrl; //Callback-Funktion zur Lieferung des Kartenausschnittes TileSize:=Google.Maps.Size(256,256); //Größe der einzelnen Bildkacheln IsPng:=false; //kein PNG-Bild MaxZoom:=9; MinZoom:=0; Radius:=1738000; Name:='Moon'; //Layername end; MoonMapType:=Google.Maps.ImageMapType(MoonMapTypeOptions); //Layer-Objekt anlegen //Karte anlegen: MapOptions:=TMapOptions.Create; //Options-Objekt anlegen with MapOptions do begin Zoom:=1; //Zoom Center:=Google.Maps.LatLng(0,0); //Kartenzentrum MapTypeID:=Google.Maps.MapTypeId.Satellite; //Kartentyp MapTypeControlOptions.MapTypeIDs.Add('moon'); //Layer der Karte zuweisen StreetViewControl:=false; //auf dem Mond spazieren gehen!? ;-) end; Map:=Google.Maps.Map(Document.GetElementById('div_map'), MapOptions); //Karten-Objekt anlegen Map.MapTypes.Set('moon',MoonMapType); Map.SetMapTypeID('moon'); //Layer anzeigen //... end; function TForm1.GetTileUrl(Sender: TObject; Point: TPoint; Zoom: Integer): String; begin //URL für Point unter Berücksichtigung von Zoom zusammenstellen Result:=...; end; Compilierte Exe: |
AW: Google Maps über COM (Component Object Model)
Hallo,
habe mittlerweile einige Versuche mit der GoogleMap-Engine von Thom erstellt. Da bei meinen Applikationen Navigation und Visualisierung in jeder Form im Vordergrund steht, ist diese Engine die erste Wahl. Habe auch Thom zur Motivation Screen-Shoots meiner Applikationen zur Verfügung gestellt. Ich hatte zurvor viele Abende verbracht, eine Karte in Delphi mit einer Polyline einer mit einem Navi aufgezeichneter Strecke darzustellen - von Markern, Elevation-Service ganz zu schweigen. Diese Engine passt optimal für meine Bedürfnisse. Jedoch habe ich heute eine herben Rückschlag erlitten - bisher habe ich mit der kostelosen TurboDelphi2006 Variante entwickelt - und mich durchgerungen, nachdem Delphi XE Starter für ca. 170€ in der Update Variante zu haben ist, die Kreditkarte zu zücken. Installiert o.k. .. gestartet o.k., Demo1 geladen "Klasse TWebBrowser nicht gefunden...", einen Blick in die Komponentenliste zeigt "Internet" fehlt. Gruss DelphiFan2008 |
AW: Google Maps über COM (Component Object Model)
Zitat:
![]() Hallo DelphiFan2008 und alle anderen, die dieses ärgerliche Problem betrifft: Eine Lösung ist in Arbeit. :idea: |
AW: Google Maps über COM (Component Object Model)
entschuldigung
|
AW: Google Maps über COM (Component Object Model)
Am Ende des Ausgangsposts:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz