Delphi-PRAXiS
Seite 2 von 55     12 341252     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Google Maps über COM (Component Object Model) (https://www.delphipraxis.net/157004-google-maps-ueber-com-component-object-model.html)

Thom 7. Jan 2011 14:37

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:

Thom 9. Jan 2011 14:31

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:
  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);
  //...
Anhang 33029

Compilierte Exe:

Markus Delphi 15. Jan 2011 19:43

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.

Thom 17. Jan 2011 15:41

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 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. :thumb:
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 meine-flugzeit.de für diese Streck (Streckenabschnitte) berechnet. 8-)

s_weinrich 19. Jan 2011 12:09

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

Thom 25. Jan 2011 14:14

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 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. 8-)

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 Documentation Insight! :dancer:
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;
Anhang 33162

Compilierte Exe:

DelphiFan2008 1. Feb 2011 21:20

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

Thom 1. Feb 2011 22:26

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

Zitat von DelphiFan2008 (Beitrag 1078971)
Delphi XE Starter... Installiert o.k. .. gestartet o.k., Demo1 geladen "Klasse TWebBrowser nicht gefunden...", einen Blick in die Komponentenliste zeigt "Internet" fehlt.

Leider fehlt - so weit ich das verstanden habe - in der Starter Edition der Import von Typbibliotheken: Kein Kreuz in der Feature-Matrix bei Import COM servers as components to develop visually. Überprüfen konnte ich das leider - mangels Demo-Version - noch nicht.

Hallo DelphiFan2008

und alle anderen, die dieses ärgerliche Problem betrifft: Eine Lösung ist in Arbeit. :idea:

omata 1. Feb 2011 22:30

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

DeddyH 1. Feb 2011 23:02

AW: Google Maps über COM (Component Object Model)
 
Am Ende des Ausgangsposts:
Zitat:

Allen Interessenten würde ich die Quelltexte nach Absprache per Email zuschicken (sind gezippt nur rund 150kB).
[edit] Na prima, wegeditiert, ich liebe sowas :? [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 Uhr.
Seite 2 von 55     12 341252     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz