Delphi-PRAXiS
Seite 4 von 14   « Erste     234 56     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 11. Sep 2011 11:32

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo DelphiFan2008,

ich weiß nicht, ob's die irgendwo einzeln gibt. Sie sollte aber in den anderen Jedi-Bibliotheken enthalten sein.

P.S.:
Ich habe jetzt noch einmal alles getestet:
Das Framework Version 1.1 läßt sich unter Delphi XE2 ungeändert sowohl in 32 als auch 64 Bit compilieren. Besser ist natürlich eine aktuelle jedi.inc. Notfalls tut es auch die von mir angepaßte Version im Anhang. Dabei handelt es sich aber um keine offizielle Version und sie erhebt auch keinen Anspruch auf Vollständigkeit. Ich habe nur die vom Framework verwendeten Compilerschalter aktualisiert. Die Demos sollten ebenfalls funktionieren.

NetSonic 12. Sep 2011 15:20

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

super cooles Projekt, was Du hier auf die Beine gestellt hast. Ich habe mir Dein Framework in Version 1.1 einmal angesehen und wollte jetzt etwas mit den Directions und Wegpunkten probieren. Allerdings wäre es super zu wissen, wie ich einem DirectionRequest weitere Wegpunkte hinzufügen kann! Das ist mir bisher nicht gelungen:

Delphi-Quellcode:
var
DirectionsRequest: TDirectionsRequest;
WayPoint: TDirectionsWayPoint;
begin
...
WayPoint := TDirectionsWayPoint.Create;
WayPoint.LocationAsString := 'Adresse';
DirectionsRequest.WayPoints.Add(WayPoint);
...
Vielen Dank und :thumb: für Deine Arbeit hier! Ganz großes Tennis ;-)

Thom 12. Sep 2011 16:24

AW: Google Maps über COM (Component Object Model)
 
Vielen Dank! :-D

Du mußt einfach einen weiteren Punkt erstellen und dem Array hinzufügen:
Delphi-Quellcode:
  [...]
  WayPoint:=TDirectionsWaypoint.Create;
  WayPoint.LocationAsString:='ErsterPunkt';
  DirectionsRequest.WayPoints.Add(WayPoint);
  WayPoint:=TDirectionsWaypoint.Create;
  WayPoint.LocationAsString:='ZweiterPunkt';
  DirectionsRequest.WayPoints.Add(WayPoint);
  WayPoint:=TDirectionsWaypoint.Create;
  WayPoint.LocationAsString:='UndNochEiner';
  DirectionsRequest.WayPoints.Add(WayPoint);
  [...]
Ohne Google's Premier Lizenz ist die Anzahl der Wegpunkte allerdings beschränkt.

Edit:
Sorry: Das funktioniert noch nicht in Version 1.1. :cry:
Wenn Du mir Deine Emailadresse per PM mitteilst, würde ich Dir Version 1.3 zusenden. Damit klappt es. :thumb:

NetSonic 13. Sep 2011 10:30

AW: Google Maps über COM (Component Object Model)
 
Alles klar, es funktioniert. Vielen Dank. :-D

Jetzt würde mich aber noch interessieren, wie ich die Länge der ermittelten Route und der einzelnen Wege, falls Wegpunkte gesetzt sind, auslesen kann. In Deiner Beispiel-Anwendung "Directions" habe ich dazu nichts gefunden. Habe dort nur den Quellcode-Schnipsel der Callback-Funktion:

Delphi-Quellcode:
procedure TForm1.DirectionsCallback(Sender: TObject; Result: TDirectionsResult; Status: String);
var
  n, r, l, s: Integer;
  DirectionsRendererOptions: TDirectionsRendererOptions;
  procedure AddMsg(Msg: String);
  begin
    Memo1.Lines.Add(Msg);
  end;
begin
  with Script do
  begin
    Memo1.Lines.Clear;
    if Status=Google.Maps.DirectionsStatus.Ok then
    begin
      for r:=0 to Result.Routes.Count-1 do
        for l:=0 to Result.Routes[r].Legs.Count-1 do
          for s:=0 to Result.Routes[r].Legs[l].Steps.Count-1 do
            AddMsg(Result.Routes[r].Legs[l].Steps[s].Instructions); //Richtungshinweise von Start zum Ziel
      for n:=0 to Result.Routes[0].Warnings.Count-1 do
        AddMsg(Result.Routes[0].Warnings[n]);                       //Warnhinweise zur berechneten Route
      AddMsg(Result.Routes[0].Copyrights);                          //Copyright-Informationen zur berechneten Route
      DirectionsRendererOptions:=TDirectionsRendererOptions.Create; //Darstellung der berechneten Route vorbereiten
      DirectionsRendererOptions.Directions:=Result;                 //Ergebnisse übergeben
      DirectionsRendererOptions.Map:=Maps[0];                       //Karte übergeben
      Google.Maps.DirectionsRenderer(DirectionsRendererOptions);    //berechnete Route darstellen
    end else Memo1.Lines.Add(Status);
  end;
end;
Außerdem würde mich interessieren, wie ich die Routenanweisungen auf Deutsch und ggf. noch anders formatiert erhalten kann. Gerne auch in dem Layout, welches bei Google Maps zur Darstellung der Routeninformationen genutzt wird - ist das überhaupt möglich? :?:

Über einen Tipp würde ich mich freuen.

Gruß
NetSonic

Thom 13. Sep 2011 12:40

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 3)
Schön, daß es funktioniert! :-D

Die Gesamtlänge eine Strecke bzw. Gesamtreisedauer kann zum Beispiel so ermittelt werden:
Delphi-Quellcode:
  TotalDistance:=0;
  TotalDuration:=0;
  with Result.Routes[0] do //<- erste Route
    for Leg:=0 to Legs.Count-1 do //<- alle Abschnitte durchgehen
      with Legs[Leg] do
      begin
        Inc(TotalDistance,Distance.Value); //<- Länge des Abschnitts
        Inc(TotalDuration,Duration.Value); //<- Reisedauer für diesen Abschnitt
      end;
Google Maps arbeitet mit den Spracheinstellungen des PC's. Auf meinem sendet der IE also ein 'de' - dementsprechend werden alle Menüs und Ausgaben auf Deutsch angezeigt. Es ist aber auch möglich, eine bestimmte Sprache zu erzwingen. Das geht beim Laden des API's. In der kommenden Version des Frameworks kann sie als Parameter angegeben werden:
Delphi-Quellcode:
 
procedure TScript.LoadAPIAsync(InitMapProc: TNotifyEvent;
                               UseSensor: Boolean;
                               Version: String;
                               Language: String; //<- 'de'
                               Libraries: TGoogleLibraries);
In den älteren Versionen (1.1 - 1.3) muß dafür in der Unit gmAPI die Funktion HTMLPage angepaßt werden:
Delphi-Quellcode:
  [...]
  Result:=Result+
          '   <script type="text/javascript" src="http://maps.google.com/maps/api/js?&sensor=';
  if UseSensor
    then Result:=Result+
        'true'
    else Result:=Result+
          'false';
  //zusätzlich:
  Result:=Result+'&language=de';
  [...]
So sieht zum Beispiel die Routenplanung mit 'ru' aus:
Anhang 35161 Anhang 35162 Anhang 35164
Allerdings funktioniert Unicode nur mit den entsprechenden Compilern und erst ab Version 2.0 des Frameworks.

Die Routeninformationen werden mit HTML-Tags (zum Beispiel <b></b>) geliefert. Die müßten dann selbst oder durch eine geeignete Komponente geparst und dargestellt werden.

NetSonic 13. Sep 2011 13:29

AW: Google Maps über COM (Component Object Model)
 
Danke für die ausführliche Info. Ich werde mir das einmal ansehen. Die Ergebnisse der Routenbeschreibung zeige ich mir bereits in einer TWebBrowser-Komponente formatiert an. Ich dachte nur, es gebe ggf. auch über die API und Deine Schnittstelle Layout-Möglichkeiten. :wink:

Wann wirst Du denn die neue Version Deines Frameworks veröffentlichen? Gibt es da ein konkretes Ziel?

Thom 13. Sep 2011 17:00

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nein, leider nicht: Momentan habe ich noch keine spezielle Komponente für die Ausgabe. Aber das wäre eine gute Idee für die Zukunft.
Ich habe mir nämlich überlegt, den Quelltext für etwas umfangreichere Demos und kleine "Helferlein" (wie spezielle Ein- und Ausgabekomponenten) als Dankeschön exklusiv an fleißige Tester und Spender zu vergeben. 8-)

Ich babe zur Anzeige einmal TRichView mit einem HTML-Importer verwendet:
Anhang 35166

Die Handhabung ist einfach: Alle Ausgaben werden in einer lokalen Stringliste zwischengespeichert und zum Schluß angezeigt:
Delphi-Quellcode:
  [...]    
  RichView.Clear;
  HtmlImporter.LoadHtml(UTF8Encode(Messages.Text));
  RichView.Format;
  [...]
Man könnte natürlich noch zusätzlich die Entfernung und die Fahrzeit integrieren.

Wann die neuen Version fertig ist? :gruebel:
Gute Frage... :lol:
Die Integration der Google-Bibliotheken, dazugehörige Dokumentation, Demos und Tests haben mich jetzt drei Wochen (3*7*12 also rund 250 Stunden) gekostet. Ich wollte ganz gern noch die Distanz-Matrix und StreetView integrieren. Die XML-Dokumentation wird auf jeden Fall nicht komplett fertig - die wird nach und nach kommen.

Ich bin erst einmal froh, daß sich die aktuellen Versionen auch mit XE2 vertragen - und das sogar ohne Änderung.
Vielen Dank dabei an DelphiFan2008, der mit XE2 Starter alles - einschließlich der Demos - getestet und nur einige wenige Probleme entdeckt hat.

Fazit: Ich beeile mich... :angel:

Thom 20. Sep 2011 11:56

AW: Google Maps über COM (Component Object Model)
 
So - es wird langsam Zeit für die neue Version. Ich hoffe, daß ich das Framework in etwa ein bis zwei Wochen für einen Beta-Test fertig habe. :coder:

Da sich intern einiges getan hat und viele neue Funktionen hinzugekommen sind, wird es nicht - wie angekündigt - die Version 1.4 sondern 2.0.
So wurde ein interner Callback-Manager integriert, der es ermöglicht, bei asynchronen Aufrufen des API's neben herkömmlichen Objekt-Methoden auch anonyme Methoden als Callback-Funktion einzusetzen. Damit sind dann auch solche JavaScript-ähnlichen Konstruktionen wie in der Distanz-Matrix-Demo möglich:
Code:
  geocoder.geocode({'address': location}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      bounds.extend(results[0].geometry.location);
      map.fitBounds(bounds);
      var marker = new google.maps.Marker({
        map: map,
        position: results[0].geometry.location,
        icon: icon
      });
    } else {
      alert("Geocode was not successful for the following reason: " + status);
    }
  });
Delphi-Quellcode:
  Geocoder.Geocode(TJScriptObject.Create(['address: '+Location]),
    procedure(Sender: TObject; Results: TGeocoderResultArray; Status: String)
    var
      Opts: TMarkerOptions;
    begin
      with Script do
      begin
        if Status=Google.Maps.GeocoderStatus.OK then
        begin
          Bounds.Extend(Results[0].Geometry.Location);
          Maps[0].FitBounds(Bounds);
          Opts:=TMarkerOptions.Create;
          with Opts do
          begin
            Map:=Maps[0];
            Position:=Results[0].Geometry.Location;
            Icon:=MarkerIcon;
            Title:=Location;
          end;
          New(Google.Maps.Marker(Opts));
        end else ShowMessage('Geocode was not successful for the following reason: '+Status);
      end;
    end);
Bei den Objektlisten des TScript-Objektes wurden Iteratoren hinzugefügt, die den for-in Syntax unterstützen:
Delphi-Quellcode:
  for Marker in Script.Markers do
    Marker.Map:=nil;
Zusätzlich wurden alle Units von RTTI-Rückständen befreit und damit ein fertiges Programm um reichlich 300 kByte (Beispiel für Delphi XE) verkleinert, obwohl das Framework selbst beachtlich an Umfang zugelegt hat.

Desweiteren sind Spenden herzlich willkommen. :hello:
PayPal

Thom 22. Sep 2011 22:32

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hey Markus,

here is a little demo with the framework version 2.
Is this what you mean with multiple destinations?

Anhang 35241

Diese Demo zeigt übrigens auch die Behandlung der Refresh-Taste F5.

fduenas 26. Sep 2011 18:10

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

Zitat von Thom (Beitrag 1126115)
Hey Markus,

here is a little demo with the framework version 2.

Diese Demo zeigt übrigens auch die Behandlung der Refresh-Taste F5.

Hi Tom. When will your Framework 2 be available?

Thom 26. Sep 2011 19:57

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

I hope in one or two weeks.
Sorry, I've read your question until today. :pale:

fduenas 27. Sep 2011 00:48

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

Zitat von Thom (Beitrag 1126810)
Hi Francisco,

I hope in one or two weeks.
Sorry, I've read your question until today. :pale:

LOL, No problem, At my GMT time it still today :).
Regards and hope to see your framework soon

markusr 27. Sep 2011 22:57

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Thom,

i will look at the demo. Much appreciated.

I am still trying to do proof of concept.

Demo 5 is causing me issues. If I do each address one at a time, no issue.

if I try to do all of them I get failures.

I am attaching my version on unit1 from Demos\5 - Async Callbacks.

Markus

Can we use email? mrissmann@driftingsands.com or mrissmann@yahoo.com.

Zitat:

Zitat von Thom (Beitrag 1126115)
Hey Markus,

here is a little demo with the framework version 2.
Is this what you mean with multiple destinations?

Anhang 35241

Diese Demo zeigt übrigens auch die Behandlung der Refresh-Taste F5.


Thom 2. Okt 2011 11:37

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hey Markus,

I hope that the mail has arrived.

Für alle anderen die Erklärung des Problems:
Google limitiert die Anzahl der Geocoding-Anfrage. Nach etwas 13 bis 15 Abfragen senden die Server die Meldung
Code:
OVER_QUERY_LIMIT
Anhang 35296
und es wird für die Callback-Funktion kein Results-Objekt erzeugt. Dummerweise wird in der Unit gmGeocoder in der Methode TGeocoder.Callback dieser Umstand nicht getestet und es kommt im Debug-Modus zu einer Fehlermeldung (keine Exception, da diese unterdrückt werden, weil bei COM keine Exceptions nach außen dringen dürfen). Das heißt: Im Fehlerfall wird das eigene Programm gar nicht darüber informiert. Ganz ungeduldige können das Problem selbst beheben, indem sie die Methode TGeocoder.Callback ändern:
Delphi-Quellcode:
procedure TGeocoder.Callback;
begin
  if assigned(FCallback) then
  begin
    try
      if not VarIsNull(FCallbackFunction.Arguments[0]) then //<- to prevent exception (insert unit Variants in uses list)
      begin
        if assigned(FGeocoderResults)
          then FGeocoderResults.Disp:=FCallbackFunction.Arguments[0]
          else FGeocoderResults:=TGeocoderResults.Create(Script,FCallbackFunction.Arguments[0]);
        FCallback(self,FGeocoderResults,FCallbackFunction.Arguments[1]);
      end else
      begin
        FCallback(self,nil,FCallbackFunction.Arguments[1]);
      end;
    except
    {$IFDEF DEBUG}
      ShowMessage(Exception(ExceptObject).Message);
    {$ENDIF}
    end;
  end;
end;
Alle anderen warten einfach auf die neue Version des Frameworks.

Um viele Geocoding-Anfragen ohne Fehlermeldung durchführen zu können hat es sich bewährt, zwischen den einzelnen Abfragen etwas eine Sekunde Zeit zu lassen:
Anhang 35297

Eine andere Strategie wäre:
  1. Anfragen ohne Verzögerung bist OVER_QUERY_LIMIT
  2. Warten
  3. Letzte Anfrage wiederholen
  4. weiter mit 1

andras.szikra 4. Okt 2011 08:57

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

Could you please publish that demo where route internal "over" point can be added? I don't know how to do it. Adding waypoints not working.

Thanks, András

Zitat:

Zitat von Thom (Beitrag 1123971)
Schön, daß es funktioniert! :-D

Die Gesamtlänge eine Strecke bzw. Gesamtreisedauer kann zum Beispiel so ermittelt werden:
Delphi-Quellcode:
  TotalDistance:=0;
  TotalDuration:=0;
  with Result.Routes[0] do //<- erste Route
    for Leg:=0 to Legs.Count-1 do //<- alle Abschnitte durchgehen
      with Legs[Leg] do
      begin
        Inc(TotalDistance,Distance.Value); //<- Länge des Abschnitts
        Inc(TotalDuration,Duration.Value); //<- Reisedauer für diesen Abschnitt
      end;
Google Maps arbeitet mit den Spracheinstellungen des PC's. Auf meinem sendet der IE also ein 'de' - dementsprechend werden alle Menüs und Ausgaben auf Deutsch angezeigt. Es ist aber auch möglich, eine bestimmte Sprache zu erzwingen. Das geht beim Laden des API's. In der kommenden Version des Frameworks kann sie als Parameter angegeben werden:
Delphi-Quellcode:
 
procedure TScript.LoadAPIAsync(InitMapProc: TNotifyEvent;
                               UseSensor: Boolean;
                               Version: String;
                               Language: String; //<- 'de'
                               Libraries: TGoogleLibraries);
In den älteren Versionen (1.1 - 1.3) muß dafür in der Unit gmAPI die Funktion HTMLPage angepaßt werden:
Delphi-Quellcode:
  [...]
  Result:=Result+
          '   <script type="text/javascript" src="http://maps.google.com/maps/api/js?&sensor=';
  if UseSensor
    then Result:=Result+
        'true'
    else Result:=Result+
          'false';
  //zusätzlich:
  Result:=Result+'&language=de';
  [...]
So sieht zum Beispiel die Routenplanung mit 'ru' aus:
Anhang 35161 Anhang 35162 Anhang 35164
Allerdings funktioniert Unicode nur mit den entsprechenden Compilern und erst ab Version 2.0 des Frameworks.

Die Routeninformationen werden mit HTML-Tags (zum Beispiel <b></b>) geliefert. Die müßten dann selbst oder durch eine geeignete Komponente geparst und dargestellt werden.


Thom 4. Okt 2011 10:20

AW: Google Maps über COM (Component Object Model)
 
Hi András,

yes, you're right. Adding waypoints work in version 1.1 not really (see this post). Give me your email address via PM and I'll send you the current version 1.3.

Thom

andras.szikra 4. Okt 2011 10:34

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

Please send to this mail address: aszikra@freemail.hu Thanks.

András

fduenas 5. Okt 2011 23:58

AW: Google Maps über COM (Component Object Model)
 
Hi Thom, is there a way I can also get 1.3? mine is fduenas@gmail.com

Thanks

Thom 6. Okt 2011 09:55

AW: Google Maps über COM (Component Object Model)
 
Is on the way.

fduenas 6. Okt 2011 15:19

AW: Google Maps über COM (Component Object Model)
 
Many Thanks Thom. :)
hope to see Framework 2.0 soon
Regards

Thom 6. Okt 2011 15:27

AW: Google Maps über COM (Component Object Model)
 
So do I. :lol:

zeras 13. Okt 2011 21:41

AW: Google Maps über COM (Component Object Model)
 
Kann man auch an Hand einer PLZ einen Punkt in die Deutschlandkarte setzen? Aber das dann für viele PLZ?

Thom 13. Okt 2011 22:17

AW: Google Maps über COM (Component Object Model)
 
Prinzipiell Ja.
Mit Geocoding können durch
Delphi-Quellcode:
  GeocoderRequest:=TGeocoderRequest.Create;                       //GeocoderRequest-Objekt anlegen
  GeocoderRequest.Address:='Deutschland,01234';                            //zu kodierende PLZ
  Geocoder:=Google.Maps.Geocoder;                                    //-> neu anlegen, falls erforderlich
  Geocoder.Geocode(GeocoderRequest,GeocoderCallback);         //Kodierung vom Server anfordern
die Koordinaten eines Punktes innerhalb des gewünschten PLZ-Bereiches ermittelt werden. Dieser Punkt liegt dann aber logischerweise irgendwo innerhalb dieses Bereiches.
Sollen mehrere Postleitzahlen untersucht werden, muß die Abfrage wiederholt werden.

zeras 14. Okt 2011 17:40

AW: Google Maps über COM (Component Object Model)
 
Dann werde ich deine Funktionen mal testen.

Danke für die Info.

Matthias

Thom 23. Okt 2011 23:03

AW: Google Maps über COM (Component Object Model)
 
It's done. 8-)

angos 24. Okt 2011 09:11

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

ich habe mir die v2.0 mal kurz angeschaut.
Beim ersten Demo bin ich direkt gestolpert, konnte das Problem aber schnell finden ;). Ich nutze D7, welches du ja noch nicht testen konntest.

In der BrowserTools.pas (Zeile 403) habe ich folgendes geändert:

Delphi-Quellcode:
//{$IFNDEF DELPHI6_UP}
{$IFNDEF DELPHI8_UP}
const
  INTERNET_CONNECTION_OFFLINE        = 32;
  INTERNET_CONNECTION_CONFIGURED     = 64;
{$ENDIF}
Gruß
angos

Thom 24. Okt 2011 10:24

AW: Google Maps über COM (Component Object Model)
 
Vielen Dank angos! :thumb:

Ich habe Deinen Beitrag oben verlinkt.

manfred_h 28. Okt 2011 17:01

AW: Google Maps über COM (Component Object Model)
 
Habe gerade dies im iX Newsticker gelesen:
iX > News > 2011 > KW 43 > Schluss mit gratis: Google verlangt Geld für Kartennutzung

Schluss mit gratis: Google verlangt Geld für Kartennutzung.

Könnte für den einen oder anderen von Interesse sein.

Shalom
Manfred

Thom 28. Okt 2011 19:52

AW: Google Maps über COM (Component Object Model)
 
Danke Manfred für den Hinweis!
Nimm solche Dinge aber nicht zu ernst:
Das ist nur eine billige Schlagzeile auf Boulevardblatt-Niveau! :wall:
Heise hatte ich bisher als relativ seriös in Erinnerung - mit diese Überschrift erreichen sie aber die geistige Ebene einer Zeitung, die eher mit Bildern hervorsticht, als mit substanziellen Nachrichten.

Wahr ist:

Die Nutzung der meisten Dienste war schon seit jeher limitiert - selbst mit der Premier License existieren mengenmäßige Grenzen.
Daß eine Begrenzung auch beim Abruf von Karten eingeführt wird, ist schon seit Monaten (April 2011) bekannt.

Selbst die zitierte Heise Seite räumt ein:
Zitat:

Noch [Thom: Aha - das soll sich wohl ändern!? Woher weiß das der zuständige Redakteur?] allerdings gibt es Bagatellgrenzen [Thom: Bagatellgrenze=Kleinbeträge, siehe reale Zahlen!!!], bis zu denen die kostenlose Nutzung erlaubt bleibt. Sie gelten für bis zu 25000 tägliche Abrufe einfacher Karten pro Tag, für "Styled Maps" liegt die Grenze bei 2500 Abrufen.
Wer einen derartigen Traffic mit seiner Delphi-Anwendung erzielt, dem empfehle ich den Besuch bei einem Arzt seines Vertrauens wegen drohender Sehnenscheidenentzündung.
Selbst bei der Entwicklung des Frameworks erreichte ich nicht im Entferntesten derartige Quoten - und da habe ich alle paar Minuten compiliert und das API neu geladen.
Das Problem bei webbasierenden Karten ist der Referer-Wert, der den Rückschluß auf die zuständige Website zuläßt. Damit kann die Zählung Site-basierend erfolgen. Bei diesem Framework wird die HTML-Seite "synthetisch" erzeugt und damit ist eine Zählung nur über die abrufende IP-Adresse möglich.

Zitat:

Besonders hohe Gebühren berechnet Google für Websites, die noch die Version 2 der Maps-API benutzen [...]
Diese API-Version ist schon seit über einem Jahr als deprecated gekennzeichnet und wurde noch nie durch dieses Framework unterstützt.

Zitat:

Zitat von Thor Mitchell, Product Manager, Google Maps API
We understand that the introduction of these limits may be concerning. However with the continued growth in adoption of the Maps API we need to secure its long term future by ensuring that even when used by the highest volume for-profit sites, the service remains viable. By introducing these limits we are ensuring that Google can continue to offer the Maps API for free to the vast majority of developers for many years to come.


StefanM 20. Nov 2011 17:13

AW: Google Maps über COM (Component Object Model)
 
Super Sache !
Hätte ich dein Werk einen Monat früher gefunden, hätte ich mir einiges an Arbeit erspart ;-(
Hab gleich ein wenig gespendet, so eine Leistung gehört honoriert.
Versuche gerade mein (Mach)Werk zu ersezten, und stoße da an meine Grenzen...

Hab ein paar Funktionen in eine eigene Komponete X ausgelagert um meine alter Version 1:1 zu ersetzen. Diese Komponente behinhaltet einen TWebBrowser ,eine DBGrid udn noch ein paar andere Komponenten.

In der Applikation rufe ich im Onshow
Delphi-Quellcode:
newMap:=TX.create(Frame1);
newMap.parent:=Frame1;
newMap.show();
so definiert:
Delphi-Quellcode:
procedure TX.Show();
begin
  if Script=nil then
    with TScript.Create(WebBrowser) do
      LoadAPIAsync(InitMap);
end;
dann
Delphi-Quellcode:
newMap.initMap();
so definiert:
Delphi-Quellcode:
procedure TX.InitMap();
Var ActualPos:TLatlng;
begin
  with TScript(Script) do
  begin
     ActualPos:=New(Google.Maps.LatLng(48,5,16.36974));
....
und fliege mit einer Execption da script=nil ist !:roll:
Wenn ich "with TScript(Sender) do" wie in einigen Beispielen verwende, wer/was ist dann der sender??
Und kann mir wer die Sysntax in TX.show gerklären ?:oops:

Sorry ich steh ein wenig auf dem Schlauch, meine Delphi5(!) Wissen ist ein wenig eingerostet...

Thom 20. Nov 2011 19:16

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

vielen Dank für das Lob und die Spende! Ich werde so schnell wie möglich die Bonus-Units an Dich abschicken.

Delphi-Quellcode:
function Script(Browser: TOleControl = nil): TScript;
//...
ist eine Funktion aus der Unit gmAPI, die das aktuelle Script-Objekt liefert (falls der Aufruf ohne Parameter erfolgt - das reicht aus, wenn nur eine TWebBrowser-Komponente verwendet wird) oder das zu einem bestimmten IE-ActiveX gehörende Script-Objekt.
Dadurch braucht dieses Objekt nicht lokal gespeichert zu werden.
Wird jetzt
Delphi-Quellcode:
if Script=nil then [...];
if assigned(Script(WebBrowser1)) then [...];
//oder
Script.xxx;
verwendet, darf keine lokale Variable mit diesem Namen existieren oder es muß der Unitname angegeben werden:
Delphi-Quellcode:
if gmAPI.Script=nil then [...];
if assigned(gmAPI.Script(WebBrowser1)) then [...];
//oder
gmAPI.Script.xxx;

Die Methode InitMap (kann auch beliebig anders heißen) ist - zumindest bis Delphi 2007 - ein reguläres TNotifyEvent mit folgendem Aufbau:
Delphi-Quellcode:
procedure TForm1.InitMap(Sender: TObject);
begin
  with TScript(Sender) do
  begin
    Google.Maps.xxx; //-> Zugriff auf das Script-Objekt
  end;
  [...]
  TScript(Sender).Google.Maps.xxx; //-> Zugriff ohne with-Statement
end;
Die Funktionsweise kann man sich so vorstellen:
Um Zugriff zur JavaScript-Engine des Browsers zu erhalten, muß ein TScript-Objekt angelegt werden. Das geschieht unter Angabe der Browser-Komponente:
Delphi-Quellcode:
TScript.Create(WebBrowser1);
//...
Über dieses Script-Objekt erfolgen dann alle weiteren Zugriffe auf das Google Maps API. Das muß aber erst noch geladen werden:
Wird eine der Funktionen LoadAPI(InitMap) oder LoadAPIAsync(InitMap) des Script-Objektes aufgerufen, lädt das Framework das JavaScript-API unter Verwendung der gewünschten Parameter von den Google-Servern. Wurde das API von der Browser-Komponente vollständig geladen, wird vom Framework die angegebene Methode InitMap aufgerufen und als Parameter Sender das Script-Objekt übergeben, damit die Karte erstellt werden kann. Das entspricht zum Beispiel dem Verhalten eines Buttons, wenn durch Doppelklick oder im Objekt-Inspektor eine OnClick-Methode angelegt wurde und der Button zu Laufzeit betätigt wird.

sterna48 27. Nov 2011 13:36

AW: Google Maps über COM (Component Object Model)
 
hi,
(sorry in English) where do I find TMapOptions for Delphi?

br sterna

Thom 27. Nov 2011 13:48

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

no problem.
See Unit gmMap in folder GoogleMaps\Source\API.

Thom 30. Nov 2011 20:08

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 3)
Die Version 2.1 des Frameworks steht ab sofort für registrierte Nutzer (Spender, Lizenz) bereit. Sie enthält alle Änderungen in den Versionen 3.6 und 3.7 des API's.
  • Neu: Property Keyword in TPlaceSearchRequest
  • Neu: Property Website in TPlaceResult
  • Neu: Property InternationalPhoneNumber in TPlaceResult
  • Neu: Property Resolution in TElevationResult
  • Neu: Property Editable in TCircleOptions
  • Neu: Property Editable in TRectangleOptions
  • Neu: Property Editable in TPolygonOptions
  • Neu: Property Editable in TPolylineOptions
  • Neu: TShape mit Property Editable als Basisobjekt für TCircle, TRectangle, TPolygon und TPolyline
  • Neu: DrawingManager-Bibliothek in der Unit gmLibrariesDrawing; ab Delphi 2009 nutzbar mit anonymen Methoden
  • Neu: TDrawingManager mit sechs Events
  • Neu: TDrawingManagerOptions
  • Neu: TDrawingControlOptions
  • Neu: TOverlayType
  • Neu: eine Demo zu editierbaren Shapes
  • Neu: zwei Demos zur Verwendung des DrawingManagers
  • Erweitert: Demo PlaceDetails
  • Erweitert: Demo ElevationSimple
Anhang 35695 Anhang 35696

Demo (32 Bit):

StefanM 4. Dez 2011 09:57

AW: Google Maps über COM (Component Object Model)
 
Verwende eine TEmbeddedWB in Verbindung mit dem GoogleMapsFramework und möchte die Druckfunktionalität des TEmbeddedWB verwenden.
Meine Map füllt aber den gesamten TEmbeddedWB aus und daher "schnappt" sich das Framework den Rechtsclick...:roll:

Wie konfiguriert man das richtig bzw. hatt wer auc schon mal diese Problem ? Ideen/Vorschläge?

Thom 4. Dez 2011 12:56

AW: Google Maps über COM (Component Object Model)
 
Nö - das Framework unterdrückt keinerlei Klicks. Ganz im Gegenteil: Zu jedem Objekt, das Ereignisse unterstützt, werden unzählige Onxxx Handler bereitgestellt - so auch TMap.OnRightClick. Und diese Handler sind ab Delphi 2009 sogar mit anonymen Methoden nutzbar.
Zu den Ereignishandlern gibt es eine ganze Reihe von Demos - sowohl in der Version 1.x als auch in 2.x.

StefanM 5. Dez 2011 07:11

AW: Google Maps über COM (Component Object Model)
 
... vielleicht falsch ausgedrückt.:oops:
Lad ich in den Browser(TEmbeddedWB) zb. "www.google.at" komme ich mit einem Rechtsklick in das standard Explorermenue, wo ich unter anderem auch ausdrucken kann. Wenn ich aber mit dem FrameWork eine Karte generiere, komm ich mit dem Rechtsklick in die Map.OnClick Methode :cyclops:

Mir fehlt irgendwie eine Idee wie ich das umgehen kann...

Thom 5. Dez 2011 11:58

AW: Google Maps über COM (Component Object Model)
 
Das Browser-Kontextmenü wird von den Karten generell unterdrückt. Diesen Effekt kann man auch auf der Google Maps Seite überprüfen. Dort wird das Kontextmenü des IE's durch ein eigenes ersetzt.

Das Programm muß sich also selbst darum kümmern, die Karte auszudrucken. Dafür gibt es mehrere Möglichkeiten.
Die einfachste - aber auch schlechteste - Methode ist folgender Aufruf:
Delphi-Quellcode:
var
  pvaIn, pvaOut: OleVariant;
begin
  [...]
  WebBrowser1.ExecWB(OLECMDID_PRINT,
                     OLECMDEXECOPT_PROMPTUSER, //mit Druckerdialog
                     {OLECMDEXECOPT_DONTPROMPTUSER,} //ohne Druckerdialog
                     pvaIn,pvaOut);
  [...]
end;
Der IE versucht dann, die Karte formatfüllend (in der Regel A4) zu Papier zu bringen - das Ergebnis ist nicht zu gebrauchen.

Besser ist es, einen Screenshot der Karte als Bitmap anzufertigen und diesen anschließend mit dem eigenen Programm auszudrucken.
Druckerkomponenten gibt es reichlich - denkbar ist auch eine Report-Tool.
Wie ein Screenshot angefertigt werden kann, zeigt die Demo 5 - Async Callbacks aus der Beispielsammlung zur Version 1.x des Frameworks. Siehe dazu auch den Beitrag zum Beispiel 5.

movnet 21. Dez 2011 13:02

AW: Google Maps über COM (Component Object Model)
 
Hi Thom.
Tell me please how the software can determine whether the marker in the middle of range or beyond.
Thank you.

Thom 22. Dez 2011 11:44

AW: Google Maps über COM (Component Object Model)
 
Do you mean in the center of the displayed map? Or you just want to determine whether the marker is visible?
You can instead use the TLatLngBounds object:
  • TLatLngBounds.Center returns the center of the rectangle
  • TLatLngBounds.Contains(LatLng: TLatLng) returns true if the given value is in this bounds.
With the map can be do it like this:
Delphi-Quellcode:
  if Map.Bounds.Contains(Marker.Position) then
  begin
    //-> Marker is visible
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 Uhr.
Seite 4 von 14   « Erste     234 56     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