AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Google Maps über COM (Component Object Model)
Thema durchsuchen
Ansicht
Themen-Optionen

Google Maps über COM (Component Object Model)

Ein Thema von Thom · begonnen am 23. Dez 2010 · letzter Beitrag vom 22. Mai 2022
Antwort Antwort
Seite 2 von 10     12 34     Letzte »    
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#1

AW: Google Maps über COM (Component Object Model)

  Alt 7. Jan 2011, 14:37
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.

demo_8.jpg

Compilierte Exe:
Angehängte Dateien
Dateityp: zip MarkerAnimation.zip (293,9 KB, 207x aufgerufen)
Thomas Nitzschke

Geändert von Thom ( 9. Jan 2011 um 14:33 Uhr)
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Google Maps über COM (Component Object Model)

  Alt 9. Jan 2011, 14:31
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:
  Script1:=TScript.Create(WebBrowser1);
  Script2:=TScript.Create(WebBrowser2);
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:
Delphi-Quellcode:
  Map1:=Script1.Google.Maps.Map(...);
  Map2:=Script2.Google.Maps.Map(...);
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:
Delphi-Quellcode:
  //MapOpts wird in WebBrowser1 erstellt:
  Script1:=TScript.Create(WebBrowser1);
  MapOpts:=TMapOptions.Create(Script1);
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).

Ein Beispiel:
Die Karte 2 soll das selbe Zentrum wie Karte 1 haben, wobei sich beide Karten in unterschiedlichen Browser-Komponenten befinden.
Delphi-Quellcode:
  Map2.Center:=Map1.Center;
  //-> JavaScript-Fehlermeldung
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.

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:
  Map2.Center:=Script2.Google.Maps.LatLng(Map1.Center.Lat,Map1.Center.Lng);
  //...
demo_9.jpg

Compilierte Exe:
Angehängte Dateien
Dateityp: zip MultiMaps.zip (278,3 KB, 204x aufgerufen)
Thomas Nitzschke

Geändert von Thom ( 9. Jan 2011 um 14:35 Uhr)
  Mit Zitat antworten Zitat
alibaba

Registriert seit: 18. Okt 2009
3 Beiträge
 
#3

AW: Google Maps über COM (Component Object Model)

  Alt 11. Mai 2012, 19:44
Hallo.

Erst mal großes Lob und Danke für das Framework,
beschäftige mich erst ein paar Tage damit aber läuft toll !

Habe hier Delphi 6 auf XP mit IE 8, wobei aber anscheinend der IE8 die
Krücke ist, delphichromiumembedded läuft auch mit Delphi 6 wie ne 1.

Hat jemand einen Tip für mich wie ich das Framework mit delphichromiumembedded zum laufen
bekommen könnte der Geschwindigkeitsunterschied würde mich interessieren ?

lg
Albert
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Google Maps über COM (Component Object Model)

  Alt 11. Mai 2012, 20:26
Hallo Albert,

vielen Dank für das Lob!

Inwiefern gibt es Probleme mit dem Internet Explorer ActiveX?
Auf meinem Entwicklungsrechner arbeite ich ohne Probleme mit XP und dem IE8. Auch auf einem Netbook läuft Google Maps mit akzeptabler Geschwindigkeit. Allerdings habe ich auch feststellen müssen, daß mit jeder neuen Version das API etwas zäher wird - das liegt einfach auch am ständig zunehmenden Funktionsumfang. Außerdem sitzen die Jungs/Mädchen von Google wahrscheinlich an schnelleren Kisten... Und JavaScript bleibt nun mal JavaScript.

Um auf Deine Frage zu antworten: Das Framework arbeitet ausschließlich mit dem IE. Sollen andere Browser unterstützt werden, ist der Zugriff über COM nicht geeignet und Du müßtest andere Komponenten benutzen. Die wichtigsten mir bekannten sind im ersten Beitrag aufgelistet. TECMap unterstützt Chromium Embedded. Auf Anfrage schickt Dir der Entwickler auch gern eine Demo-Komponente zu. Damit könntest Du dann einen Vergleich zwischen den Browsern machen.

Möchtest Du einen Geschwindigkeitsvergleich beim IE zwischen der von allen Komponentenentwicklern genutzen Exec-Methode zur Ausführung von JavaScript und dem direkten Zugriff über COM, so ist die von diesem Framework verwendete Methode etwa doppelt so schnell. Das liegt daran, daß das Parsen und Ausführen des JavaScript-Codes entfällt.
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom (12. Mai 2012 um 10:42 Uhr)
  Mit Zitat antworten Zitat
fduenas

Registriert seit: 9. Mär 2011
5 Beiträge
 
#5

AW: Google Maps über COM (Component Object Model)

  Alt 19. Mai 2012, 18:40
Thomas:
Are planning some day to port your component to be uses to intraweb or annother web solution for delphi?
  Mit Zitat antworten Zitat
Markus Delphi

Registriert seit: 15. Jan 2011
1 Beiträge
 
#6

AW: Google Maps über COM (Component Object Model)

  Alt 15. Jan 2011, 19:43
Lieber Thom,

ich finde deine Arbeit hervorragend. Könntest du mir dein Framework zu eigenen Test zukommen lassen.

Herzlichen Dank.
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#7

AW: Google Maps über COM (Component Object Model)

  Alt 17. Jan 2011, 15:41
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 Australien Delphi User Group und viel Erfolg bei ihrem nächsten Treffen in Sydney, bei dem es - natürlich - unter anderem um das Thema Using Google API with Delphi geht.
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:
adug.jpg
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.
Das Ergebnis meiner "Flugzeitformel" komme sogar recht gut an die Werte heran, die die Seite meine-flugzeit.de für diese Streck (Streckenabschnitte) berechnet.
Angehängte Dateien
Dateityp: zip HelloADUG.zip (215,8 KB, 231x aufgerufen)
Thomas Nitzschke

Geändert von Thom (17. Jan 2011 um 18:21 Uhr)
  Mit Zitat antworten Zitat
s_weinrich

Registriert seit: 9. Jan 2008
Ort: Erfurt
3 Beiträge
 
Delphi XE7 Enterprise
 
#8

AW: Google Maps über COM (Component Object Model)

  Alt 19. Jan 2011, 12:09
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
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#9

AW: Google Maps über COM (Component Object Model)

  Alt 25. Jan 2011, 14:14
Hallo Stefan, vielen Dank für das Lob!
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 ADUG in Sydney, die es mir ermöglicht hat, per LiveMeeting an ihrem Treffen teilnehmen zu können! Das war für mich eine sehr interessante Erfahrung.

Einen besonderen Dank und viele Grüße an AndreFM!

Auch an Baoquan Zuo (Paul) aus Shanghai einen herzlichen Dank für die Lizenz zum IDE-Plugin Documentation Insight!
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 Beispiel zeigt, wie es geht.

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:
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;
demo_10.jpg

Compilierte Exe:
Angehängte Dateien
Dateityp: zip ImageMapTypes.zip (277,9 KB, 194x aufgerufen)
Thomas Nitzschke

Geändert von Thom (25. Jan 2011 um 14:21 Uhr)
  Mit Zitat antworten Zitat
DelphiFan2008

Registriert seit: 4. Dez 2008
84 Beiträge
 
Delphi XE2 Starter
 
#10

AW: Google Maps über COM (Component Object Model)

  Alt 1. Feb 2011, 21:20
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 10     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

(?)

LinkBack to this Thread

Erstellt von For Type Datum
DELPHI | (google maps) This thread Refback 11. Nov 2011 09:07
Twebbrowser HTML tag to UniHTMLFrame1 - uniGUI Discussion Forums This thread Refback 4. Nov 2011 06:52
DoraDev1975: google maps This thread Refback 23. Sep 2011 08:18
delphi osm - Google Search Post #0 Refback 19. Sep 2011 09:02
DoraDev1975: ?ิ????? 2011 This thread Refback 11. Sep 2011 16:39
DoraDev1975 This thread Refback 30. Aug 2011 10:13
Untitled document This thread Refback 25. Jun 2011 19:57
Interact with Google Maps in a TWebBrowser from Delphi | Ramblings This thread Refback 26. Jan 2011 05:12
google maps mit delphi link - Google Search This thread Refback 24. Jan 2011 14:24
google maps mit delphi - Google Search This thread Refback 24. Jan 2011 14:20
Untitled document This thread Refback 19. Jan 2011 21:49

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:44 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