Delphi-PRAXiS
Seite 3 von 14     123 4513     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)

movnet 10. Jun 2011 19:16

AW: Google Maps über COM (Component Object Model)
 
Hi Thom.
Thank you very much for your work. :thumb:
Tell me how to add waypoint in the DirectionsRequest(TDirectionsRequest)?
Thanks!

Thom 10. Jun 2011 19:30

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

Gib mit bitte etwas Zeit: Ich werde versuchen, eine Lösung zu posten.

@movnet:

Thank you! :-D
This is with version 1.1 of the framework unfortunately not possible. If you give me your email address via PM I will send you an updated version and an example.

BlueLiquidCell 22. Jun 2011 21:28

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

Hätte nochmal ne Frage zum Overlay.

Hab das so geändert wie dus geschrieben hattest, dann funktioniert es auch, aber sobald ich die NE oder SW Bounds änder geht es nicht mehr.

Würde gern folgendes haben:
Delphi-Quellcode:
Center:=Google.Maps.LatLng(55.00,6.00);         //Kartenmittelpunkt
....
NEBound:=Google.Maps.LatLng(55.00,6.00);   //nord-östliche Overlayecke
SWBound:=Google.Maps.LatLng(53.00,9.00);   //süd-westliche Overlayecke
Bounds:=Google.Maps.LatLngBounds(SWBound,NEBound);    //Overlaybegrenzung
SrcImage:='C:\1.jpg';
USGSOverlay.Create(Bounds,SrcImage,Map);
Wäre super wenn du mir helfen kannst.

Danke
Christoph

Thom 22. Jun 2011 22:18

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

Wow: Google Maps reagiert ja da recht bösartig... :lol:

Das liegt aber daran, daß Du das Overlay-Bild auf der nördlichen Halbkugel unterbringen willst und dort muß der Breitengrad der nord-östlichen Ecke größer sein, als der der süd-westlichen. Sonst hat das Rechteck quasi eine "negative" Höhe und damit scheinen die Entwickler des API's nicht zu rechnen...

Also mußt Du nur die Zahlen vertauschen:
Delphi-Quellcode:
NEBound:=Google.Maps.LatLng(55.00,9.00); //nord-östliche Overlayecke
SWBound:=Google.Maps.LatLng(53.00,6.00); //süd-westliche Overlayecke
Damit sollte es funktionieren.

Viele Grüße
Thomas

BlueLiquidCell 23. Jun 2011 00:14

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

Stimmt natürlich da hab ich net dran gedacht!
Danke!

Kann man das Overlay auch irgendwie halb transparent machen? So dass man die halb durchsehen kann?
Ist png da wieder die einzige lösung?

Christoph

Peter.Stadler 23. Jun 2011 10:59

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

Die GoogleMaps-Benutzung von Delphi aus ist das beste, das ich bisher hierzu gefunden habe.
Ich habe aber auf meinen Computern aber auch das Goggle-Earth-Plugin installiert. Von jedem Webbrowser mit GoogleMaps
kann man nun auf den 3D-View Earth umschalten.

Wie kann man mit der hier vorgestellten Delphi-Lösung diese Schaltfläche mit Earth anzeigen lassen, um in den 3D-Mode
umzuschalten?

mit freundlichen Grüssen
Peter

Thom 23. Jun 2011 13:31

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

soweit mir bekannt ist, unterstützt das Google Maps API die Transparenz bzw. Opazität nur bei kompletten Layern, die von (T)ImageMapType abgeleitet wurden, aber nicht bei Overlays.

Aber mit einem tiefen Griff in die Trickkiste geht es doch:
Delphi-Quellcode:
procedure USGSOverlay.OnAdd;
begin
  [...]
  ImageNode.Style.Width:='100%';
  ImageNode.Style.Height:='100%';
  ImageNode.Style.Filter:='Alpha(opacity=50)'; //<- Opazität in %
  [...]
end;
Hallo Peter,

vielen Dank für das Lob! :-D
Hmmm... Google Earth... Ich hatte das Plugin einmal auf meinem Rechner installiert - dann aber wieder auf Grund des penetranten und aggressiven Updaters wieder deaktiviert. Deshalb habe ich das Google Earth API bisher auch noch nicht getestet. Eine Ein- bzw. Anbindung an das Framework wäre technisch sicherlich machbar (siehe Diskussion zur Realisierung eines OpenLayer-Frameworks einige Seiten weiter vorn).
Aber:
Durch die Experimente mit den verschiedenen JavaScript-API's weiß ich jetzt ungefähr, was meiner Meinung nach zu einem derartigen Player/Viewer gehört und habe auch etliche Stellen gefunden, mit denen ich nicht so glücklich bin (zum Beispiel verliert OpenLayers den Focus, wenn der Cursor den Bereich verläßt oder auch nur über ein integriertes Steuerelement bewegt wird; Google Maps ist dagegen wesentlich träger als OpenLayers).
Deshalb habe ich aufgehört, JavaScript-API's einfach nur nachzubauen und arbeite seit einiger Zeit an einer nativen Delphi-Lösung. Damit wird die Abhängigkeit von einem Browser-ActiveX beendet (ein wichtiger Schritt in Richtung plattformübergreifende Nutzung) und durch den Übergang von einer Skript- (JavaScript) zu einer compilierten Sprache die Darstellung um den Faktor 5 bis 10 beschleunigt. Und so ganz nebenbei werden dann auch Tricks wie der mit der Transparenz von Bildern (siehe oben) überflüssig.

BlueLiquidCell 23. Jun 2011 15:27

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

Super Vielen Dank!

Christoph

Thom 23. Jun 2011 15:52

AW: Google Maps über COM (Component Object Model)
 
Gern geschehen! :thumb:

Thom 25. Jun 2011 13:19

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
So - nach längerer Zeit aus aktuellem Anlaß wieder einmal eine kleine Demo zum Thema Events:

Anhang 34483

Rodrigo hat nämlich auf Anfrage ein neues Tutorial unter dem Titel Using the Google Maps API V3 from Delphi – Part III Getting the latitude and longitude of a mouse click erstellt, das ich auch einmal unter Verwendung des Frameworks umgesetzt habe. Damit komme ich wieder vollkommen ohne JavaScript- und HTML-Code aus, kann JavaScript-Ereignisse auf Delphi-Methoden umleiten und Werte direkt übergeben/übernehmen. Dadurch reduziert sich der Umfang des Quellcodes im Vergleich zu Rodrigos Variante um fast die Hälfte:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  Map: TMap;
begin
  [...]
  Map:=Google.Maps.Map(Document.GetElementById('div_map'),Options); //Karten-Objekt anlegen
  Map.OnClick:=MapClick; //Ereignishandler
  Map.OnMouseMove:=MapMouseMove; //-"-
end;

procedure TForm1.MapClick(Sender: TObject; MouseEvent: TMouseEvent);
var
  Options: TMarkerOptions;
begin
  with FScript do
  begin
    Options:=TMarkerOptions.Create; //Options-Objekt für den Marker anlegen
    with Options do
    begin
      Position:=MouseEvent.LatLng; //Markerposition
      Map:=Maps[0]; //Karte, auf der der Marker angezeigt werden soll
      Title:=MouseEvent.LatLng.ToUrlValue; //Hinweis, wenn Maus über dem Marker
      Icon:=Format('http://www.google.com/mapfiles/kml/paddle/%d-lv.png',
                   [Markers.Count mod 10+1]); //Icon mit einer Nummer zwischen 1 und 10
    end;
    Google.Maps.Marker(Options); //Marker-Objekt anlegen
  end;
  with ListView1.Items.Add do //Marker-Position in die Liste eintragen
  begin
    Caption:=FloatToStr(MouseEvent.LatLng.Lng);
    SubItems.Add(FloatToStr(MouseEvent.LatLng.Lat));
    MakeVisible(false);
  end;
end;

procedure TForm1.MapMouseMove(Sender: TObject; MouseEvent: TMouseEvent);
begin
  Latitude.Text:=FloatToStr(MouseEvent.LatLng.Lat);
  Longitude.Text:=FloatToStr(MouseEvent.LatLng.Lng);
end;
Zusätzlich habe ich seine Demo um die Auswertung und Anzeige der aktuellen Cursorposition auf der Karte (Map.OnMouseMove) erweitert.

Der komplette Quellcode befindet sich im Anhang:

BlueLiquidCell 28. Jun 2011 18:25

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

Hätte noch ne kleine Frage zu den Overlays ;-)

Ist es möglich ein Overlay wieder zu löschen oder zu verschieben?
Hab darüber leider nichts gefunden :-(

Schöne Grüße
Christoph

Thom 28. Jun 2011 19:38

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

Ja, das geht - wenn auch wieder nur über die Trickkiste. :lol:
Leider bietet (T)OverlayView keine Methode oder Eigenschaft, um die Größe oder Position des Overlays zu beeinflussen.

Schaut man sich allerdings TUSGSOverlay aus der Demo SimpleOverlay an, kann man feststellen, daß in der Methode OnAdd ein DIV-Container erstellt wird, der das Overlay-Bild aufnimmt und dessen Größe und Position in der Methode Draw an die gewünschten Koordinaten angepaßt wird.

Die erste Möglichkeit besteht also darin, den DIV-Container einfach auf der Karte an die gewünschte Stelle zu verschieben.
Bei der zweiten Möglichkeit wird das Overlay mit
Delphi-Quellcode:
Overlay.SetMap(TMap(nil));
//...
von der Karte entfernt, worauf die Methode OnRemove aufgerufen wird. Anschließend wird das Overlay einfach wieder der Karte zugeordnet
Delphi-Quellcode:
Overlay.SetMap(Map);
//...
, worauf wieder OnAdd und Draw durchlaufen werden und damit die Möglichkeit besteht, das Overlay an einer anderen Stelle zu positionieren.

BlueLiquidCell 28. Jun 2011 19:49

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

Super deine Trickkiste!!!!
Habs aber irgendwie nicht hinbekommen. :-(

Delphi-Quellcode:
Overlay.SetMap(Map);
geht gar nicht weil er das nicht kennt

Delphi-Quellcode:
Overlay.SetMap(Map);
bringt folgenden error:
[Error] Unit1.pas(366): This form of method call only allowed for class methods

Könntest du vielleicht nen kurzes beispiel schreiben auch mit dem DIV-Container? Nur wenns nicht zuviel aufwand ist ;-)

Vielen Dank
Christoph

Thom 28. Jun 2011 20:22

AW: Google Maps über COM (Component Object Model)
 
Ich staune auch immer wieder, was da alles drin ist... :lol:

Noch ein kleiner Tip: Wenn Du das Overlay öfters aus- und wieder einblendest, wäre es eventuell sinnvoll, das Abräumen der Delphi-Wrapper für die DIV-Elemente von der Destroy- in die OnRemove-Methode zu verlegen:
Delphi-Quellcode:
destructor TUSGSOverlay.Destroy;
begin
  //FDivNode.Free; <- hier und
  //FImageNode.Free; <- hier weg
  inherited;
end;

procedure TUSGSOverlay.OnRemove;
begin
  Variant(DivNode.ParentNode).RemoveChild(DivNode.Disp);
  FDivNode.Free; //<- und dafür hier
  FImageNode.Free; //<- und hier hin
end;
Machst Du das nicht, produzierst Du zwar dank der Aufräum-Automatik des Frameworks keine Speicherlecks - dafür packst Du Dir aber den Hauptspeicher unnötig voll.

OK. Veränderte Demo SimpleOverlay:
Delphi-Quellcode:
  TForm1 = class(TForm)
    //...
  private
    FMap: TMap; //<- neu
    FOverlay: TOverlayView; //<- neu
    //...
  public
    //...
    property Map: TMap read FMap write FMap; //<- neu
    property Overlay: TOverlayView read FOverlay write FOverlay; //<- neu
  end;

procedure TForm1.FormShow(Sender: TObject);
var
  //Map: TMap; <- hier entfernen
  //...
begin
  //...
  Overlay:=TUSGSOverlay.Create(Bounds,SrcImage,Map); //<-Overlay in Variable speichern
end;

procedure TForm1.Button1Click(...)
begin
  Overlay.SetMap(TMap(nil)); //<- Overlay von der Karte entfernen -> OnRemove wird aufgerufen
  Overlay.SetMap(Map); //<- Overlay wieder einblenden -> OnAdd und Draw werden aufgerufen
end;

BlueLiquidCell 28. Jun 2011 20:35

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

Vielen dank aber es gibt immernoch Fehler aber ich suche morgen nochmal :-)

Christoph

Thom 28. Jun 2011 20:50

AW: Google Maps über COM (Component Object Model)
 
Wenn's morgen nicht klappt: Ich kann auch noch mal meine veränderte Demo SimpleOverlay posten, wenn es Dir hilft. An der hatte ich das Ein- und Ausblenden des Overlays gerade getestet.

BlueLiquidCell 28. Jun 2011 20:52

AW: Google Maps über COM (Component Object Model)
 
Das wär super, hab wahrscheinlich irgendwas vergessen ;-)

Danke
Christoph

Thom 28. Jun 2011 22:07

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ok. Da ist sie.

Ist nicht schön: Einfach nur ein Button über die Karte geklebt - demonstriert aber das Aus- und Einblenden eines Overlays...:lol:

Anhang 34504

Ich habe die Demo doch noch etwas "schöner" gemacht:
Jetzt ist der Button zum Aus- und Einblenden des Overlays an der richtigen Stelle und über zwei Schieberegler können sogar Opazität und horizontale Verschiebung der Overlays beeinflußt werden. 8-)

BlueLiquidCell 29. Jun 2011 11:53

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

Jetzt gehts! Super!

Christoph

Thom 29. Jun 2011 12:14

AW: Google Maps über COM (Component Object Model)
 
Prima - meistens hilf es wirklich, mal eine Nacht über ein Problem zu schlafen...

duff 20. Jul 2011 12:02

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

da ja seitens Google jetzt auch die Verkehrsinformationen für Deutschland zur verfügung stehen, stellt sich für mich jetzt die Frage, ob es mit dem Framework auch möglich ist, den Layer einzublenden der es ermöglicht den Verkehr nach Tag und Uhrzeit vorauszusagen?

Viele Grüße

duff

Thom 20. Jul 2011 14:11

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ich habe mir die Seite von Google gerade mal angeschaut.

Der aktuelle Verkehr wird in einem TrafficLayer angezeigt. Um diesen anzuzeigen, ist nur eine einzige Zeile im Quelltext nötig:
Delphi-Quellcode:
  //...
  Google.Maps.TrafficLayer.SetMap(Map);
Dabei wird ein TrafficLayer-Objekt erstellt (TTrafficLayer für Delphi und ein entsprechendes TrafficLayer-Objekt in JavaScript) und anschließend der Karte zugewiesen, auf dem die Anzeige erfolgen soll.

Das Ergebnis sieht dann folgendermaßen aus:
Anhang 34724

So weit - so gut.
Die Verkehrsprognose scheint im selben Layer dargestellt zu werden. Nun habe ich die Vermutung, daß das Abrufen dieser Daten nicht über dokumentierte API-Funktionen geschieht (das wäre nicht das erste Mal) - zumindest habe ich (bisher) nichts dazu gefunden.
Da hilft nur, die genutzen JavaScripte zu untersuchen, denn alles das, was mit JavaScript möglich ist, läßt sich auch im Framework umsetzen. Ich werde mir das einmal anschauen - wird aber eine kleine Weile dauern.

duff 20. Jul 2011 14:24

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

danke für die Info.

Aber wie bekomme ich den Layer wieder von der Karte?

Delphi-Quellcode:
//...
Google.Maps.TrafficLayer.SetMap(Nil);
hat nicht das gewünschte Ergebniss :?

Viele Grüße

Thom 20. Jul 2011 14:46

AW: Google Maps über COM (Component Object Model)
 
Ja - das ist klar: Mit dieser Zeile legst Du ein neues Layer-Objekt an und zeigst dieses nicht an.

Das ist ein Nebenprodukt des Frameworks, daß man (fast) wie mit JavaScript programmieren kann: Ein Objekt einfach anlegen und anschließend nicht mehr daran denken... :lol:

Besser ist natürlich der Delphi-Stil:
Delphi-Quellcode:
type
  TForm1 = (...)
  private
    FTrafficLayer: TTrafficLayer;
    procedure HideTrafficLayer;
    [...]
  end;

procedure TForm1.Show(...);
begin
  [...]
  with TScript.Create(WebBrowser1) do
  begin
    [...]
    FTrafficLayer:=Google.Maps.TrafficLayer; //Layer anlegen und merken
    FTrafficLayer.SetMap(Map); //Layer anzeigen
  end;
end;

procedure TForm1.HideTrafficLayer;
begin
  FTrafficLayer.SetMap(nil); //Layer ausblenden
end;

Thom 21. Jul 2011 18:49

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 5)
Nachdem ich mich fast zwei Tage lang mit dem Traffic Layer beschäftigt habe, möchte ich meine Erkenntnisse dazu zusammenfassen.

Die Seite von Google benutzt mit an Sicherheit grenzender Wahrscheinlichkeit nicht das "offizielle" API. Muß sie auch nicht - schließlich gehört beides Google. Ersichtlich wird das am etwas abgewandelten GUI. Die Karten werden zum Beispiel sanft gezoomt (wenn das der Benutzer-PC und seine Internetanbindung zulassen) und können mit einem leichten Schwung verschoben werden.

Mit dem standardmäßigen Traffic Layer des API's ist es meines Wissens nach leider nicht möglich, eine Verkehrsprognose wie auf der Seite von Google zu erstellen. Wobei meine Tests allerdings ergaben, daß es sich dabei um keine wirkliche Prognose nach dem Motto "Jetzt ist Stau - wie wird es voraussichtlich in einer Stunde aussehen?" handelt, sondern eher um von Google erfaßte statistische Werte, die eine Frage wie "Wie sieht die Stausituation am Autobahnkreuz XYZ freitags 16.30 Uhr aus?" beantworten könnten. Über den Wert einer derartigen Aussage kann man natürlich geteilter Meinung sein. Eine nette Spielerrei ist sie allemal.

Bei Google bin ich auf ein Beispiel bezüglich benutzerdefinierter Layer gestoßen - den sogenannten Overlay-Kartentypen.
Dort findet sich der interessante Satz:
Zitat:

Solche Kartentypen können transparente Ebenen besitzen, auf denen interessante Orte gekennzeichnet sind oder dem Nutzer zusätzliche Daten angezeigt werden. Die Verkehrsschicht von Google ist ein Beispiel für einen solchen Kartentyp.
Im nachfolgenden Absatz geht es um Bild-Kartentypen, gefolgt von einem Beispiel:
Zitat:

Mit dem folgenden Code wird ein grundlegender ImageMapType implementiert, der die Verkehrskacheln von Google verwendet. Beachten Sie, dass der Kartentyp in das overlayMapTypes-Array der Karte eingefügt wird:
Code:
var trafficOptions = {
  getTileUrl: function(coord, zoom) {     
    return "http://mt3.google.com/mapstt?" + 
    "zoom=" + zoom + "&x=" + coord.x + "&y=" + coord.y + "&client=google";
  },
  tileSize: new google.maps.Size(256, 256),
  isPng: true
};

var trafficMapType = new google.maps.ImageMapType(trafficOptions);  
var map;
function initialize() { 
  map = new google.maps.Map(document.getElementById("map_canvas"));
  map.setCenter(new google.maps.LatLng(37.76, -122.45));
  map.setZoom(12);
  map.setMapTypeId('satellite');
  map.overlayMapTypes.insertAt(0, trafficMapType);
}
Das mit dem Framework nachzubauen, ist kein Problem - nur funktioniert dieses Beispiel leider nicht (mehr), da sich die Server-Adressen und die zu übergebenden Parameter geändert haben.

Nun ist es allerdings kein allzugroßes Problem, die aktuellen URL's der Bild-Kacheln zu ermitteln.
Damit habe ich das Demoprogramm geändert und kann so - neben dem Traffic Layer über das API - auch die Verkehrssituation über einen zusätzlichen Layer anzeigen lassen:
Anhang 34735

Ein Vergleich des Standard Layers mit dem zusätzlichen zeigt einen interessanten Unterschied: Hier wird - wie auf der Google Seite - auch die Verkehrssituation in Frankreich angezeigt:
Anhang 34736

Beim Standard Traffic Layer werden die Informationen in der Satelliten-Ansicht ausgeblendet:
Anhang 34737

Im Gegensatz dazu ist die Darstellung im zusätzlichen Layer wesentlich besser steuerbar und entspricht der Ansicht auf der Google Seite:
Anhang 34738

Die "Verkehrsprognose" funktioniert so natürlich auch, da der Zeitpunkt für die Verkehrskarte als Parameter innerhalb der URL übergeben wird. Im Anhang befindet sich eine kleine compilierte Demo.

Noch ein kleiner Hinweis zur Aktualität der Verkehrsdaten:
Die Google Server liefern den Wert Cache-Control: private, max-age=60. Dennoch aktualisieren TWebBrowser und das Maps API die Bilder nicht zwingend, obwohl es angefordert wurde. Deshalb empfiehlt es sich, ab und zu die Zoomstufe zu verändern, die Karte zu verschieben oder die Ansicht zu wechseln, um den IE dazu zu veranlassen, seinen Cache aufzuräumen.

duff 19. Aug 2011 09:01

AW: Google Maps über COM (Component Object Model)
 
Jetzt wird es noch interessanter ;D

Wettermeldungen bei Google Maps :cyclops:

Thom 23. Aug 2011 12:02

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

vielen Dank für Deinen Hinweis!

Google's Wettervorhersage scheint - genau wie die Stauanzeige - nicht über das dokumentierte API zu laufen.
Trotzdem bekommt man das auch mit dem Framework hin. Bindet man die Wettersymbole als zusätzlichen Layer ein, stört allerdings die Beschriftung der eigentlichen Karte ganz enorm, da damit die Darstellung schnell unübersichtlich wird:
Anhang 34951

Werden spezielle Karten verwendet, bei denen die Beschriftung reduziert ist, wird sogar die Wolkenverteilung sichtbar:
Anhang 34952

Im Anhang befindet sich eine kompilierte Demo, die die Wetterkarte etwa so zeigt, wie auf der Maps-Seite von Google.

Thom 24. Aug 2011 14:41

Darstellung von Wetterdaten
 
Liste der Anhänge anzeigen (Anzahl: 5)
In diesem Beitrag möchte ich eine Demo vorstellen, die es ermöglicht, Wetterinformationen, die über das - nicht dokumentierte - Google Weather API abgerufen werden können, mit Hilfe des Frameworks darzustellen.
Anhang 34973

Diese Demo ist allerdings - im Gegensatz zu allen bisherigen - nur mit unicode-fähigen Delphi-Versionen (also ab 2009) kompilierbar. Besitzer älterer IDE's müßten die Anpassungen selbst vornehmen. Das hat nichts mit dem Framework zu tun, sondern mit den zu verarbeitenden Wetterdaten.

Google Weather API ist eigentlich eine vollkommen übertriebene Bezeichnung: Es handelt sich lediglich um eine URL, über die mit Hilfe zweier Parameter eine XML Datei abgerufen werden kann:
Code:
http://www.google.com/ig/api?weather=[LOCATION]&hl=[LANGUAGE]
  • [LOCATION] ist dabei im einfachsten Fall der Ort, für den die Wetterinformationen abgerufen und
  • [LANGUAGE] die Sprache (Länderkürzel), in der diese Informationen geliefert werden sollen.

Code:
http://www.google.com/ig/api?weather=Berlin&hl=de
liefert eine XML-Datei mit folgender Struktur:
Code:
<?xml version="1.0"?>
<xml_api_reply version="1">
  <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
    <forecast_information>
      <city data="Berlin, Berlin"/>
      <postal_code data="Berlin"/>
      <latitude_e6 data=""/>
      <longitude_e6 data=""/>
      <forecast_date data="2011-08-24"/>
      <current_date_time data="2011-08-24 09:50:00 +0000"/>
      <unit_system data="SI"/>
    </forecast_information>
    <current_conditions>
      <condition data="Klar"/>
      <temp_f data="73"/>
      <temp_c data="23"/>
      <humidity data="Luftfeuchtigkeit: 78*%"/>
      <icon data="/ig/images/weather/sunny.gif"/>
      <wind_condition data="Wind: W mit 11 km/h"/>
    </current_conditions>
    <forecast_conditions>
      <day_of_week data="Mi."/>
      <low data="21"/>
      <high data="30"/>
      <icon data="/ig/images/weather/mostly_sunny.gif"/>
      <condition data="Teils sonnig"/>
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Do."/>
      <low data="23"/>
      <high data="29"/>
      <icon data="/ig/images/weather/chance_of_storm.gif"/>
      <condition data="Vereinzelt stürmisch"/>
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Fr."/>
      <low data="19"/>
      <high data="32"/>
      <icon data="/ig/images/weather/sunny.gif"/>
      <condition data="Klar"/>
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Sa."/>
      <low data="14"/>
      <high data="21"/>
      <icon data="/ig/images/weather/chance_of_rain.gif"/>
      <condition data="Vereinzelt Regen"/>
    </forecast_conditions>
  </weather>
</xml_api_reply>
Diese Datei enthält - neben den aktuellen Daten - sogar eine Vorhersage für die nächsten drei Tage.

Im Abschnitt xml_api_reply\weather\xxx_conditions\icon ist in der Regel sogar der Link zu einem Icon angegeben, so daß sich die Anzeige dieses Bildes als Marker anbietet.
Leider enthalten die Abschnitte xml_api_reply\weather\forecast_information\latitud e_e6 und xml_api_reply\weather\forecast_information\longitu de_e6 keine Angaben, so daß die Koordinaten für den Marker erst über eine Geocoding-Abfrage ermittelt werden müssen.

Die programmtechnische Umsetzung ist relativ einfach: Die XML-Datei wird mit Hilfe eine TIdHTTP-Komponente abgefragt und über eine TXMLDocument-Komponente geparst. Der Gebrauch des Geocoders und das Hinzufügen von Markern wurde schon in früheren Demos gezeigt.
Dabei ist lediglich zu beachten, daß die Eigenschaft CharSet des Request-Objektes auf UTF-8 zu setzten ist
Delphi-Quellcode:
  IdHTTP1.Request.CharSet:='UTF-8';
  //...
, damit der Google-Server die XML-Datei auch wirklich in der gewünschten Sprache liefert.

Damit ist es zum Beispiel möglich, das Wetter für Frankfurt am Main in hebräischer
Anhang 34974
für München in russischer
Anhang 34975
oder für Graz in thailändischer Sprache anzeigen zu lassen:
Anhang 34976

Interessant ist das Sonnensymbol links unten in Frankreich: Hier wurde als Sprache japanisch (ja) gewählt. Wahrscheinlich sieht die Sonne in Japan anders aus, als im Rest der Welt... :lol:

Im Quelltext der Demo wird noch ein weiterer Weg beschrieben:
Bei einem Klick mit der linken Maustaste auf die Karte wird (falls vorhanden) die Wetterinformation für diesen Punkt abgefragt und angezeigt. Der zugehörige Ort wird über Reverse Geocoding ermittelt.

duff 24. Aug 2011 15:01

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

Florian Hämmerle 24. Aug 2011 15:20

AW: Google Maps über COM (Component Object Model)
 
Echt tolles Projekt. Planst du auch die Unterstützung von Bing Maps? Bing Maps WPF Control

Viele Grüße,
Florian

Thom 24. Aug 2011 16:13

AW: Google Maps über COM (Component Object Model)
 
Florian und duff,

vielen Dank! :-D

Eine Bing-Unterstützung wird es ebenso geben wie die Nutzung von OpenStreetMap-Karten. Allerdings nicht im Rahmen dieses Projektes, da das immer vom Internet Explorer abhängig ist und durch dessen JavaScript-Engine nicht gerade mit Warp-Geschwindigkeit arbeitet.
Deshalb habe ich schon seit einigen Wochen parallel dazu einen Karten-Viewer in Arbeit, der nativ in Delphi geschrieben ist und neben der Karten-Anzeige noch etwas mehr zu bieten hat - so zum Beispiel die Anzeige von Giga- und Terrapixel-Bildern. Schon jetzt ist diese Komponente um den Faktor 5 bis 10 schneller als der Zugriff über JavaScript-API's.
Durch die Abkopplung vom IE-ActiveX und dem neuen Compiler von XE2 ist eine plattformübergreifende Nutzung geplant.

Florian Hämmerle 24. Aug 2011 16:45

AW: Google Maps über COM (Component Object Model)
 
Klingt sehr interessant! Freu mich schon, mehr davon zu hören.

duff 24. Aug 2011 18:57

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

das hört sich wirklich sehr interessant an. Freue mich schon den Karten-Viewer in Aktion zu sehen.

Wirklich toll und bitte weiter so :wink:

Thom 1. Sep 2011 13:45

AW: Google Maps über COM (Component Object Model)
 
Liste der Anhänge anzeigen (Anzahl: 3)
Vielen Dank!

In diesem Zusammenhang einige weitere Neuigkeiten:
Seit einigen Tagen (24. August 2011) gibt es die Version 3.6 des API's von Google Maps.
Seit diesem Zeitpunkt werden standardmäßig anklickbare Punkte (Point Of Interest - POI) auf den Karten angezeigt:
Anhang 35051

Das ist aber nicht in jedem Fall erwünscht. Um diese Punkte wieder von der Karte verschwinden zu lassen, nutzt man am besten das TMapTypeStyles-Objekt. Dieses befindet sich in Version 1.1 des Frameworks in der Unit gmOverlays.
Die Nutzung ist recht einfach:
Delphi-Quellcode:
type
  TMapOptionsAccess = class(TMapOptions);

procedure TForm1.FormShow(Sender: TObject);
var
  Options: TMapOptions;
  Styles: TMapTypeStyles;
begin
  [...] //Script-Objekt anlegen und Seite vorbereiten
  Styles:=TMapTypeStyles.Create;
  with Styles.AddStyle do
  begin
    FeatureType:='poi';
    ElementType:='labels';
    AddStyler.Visibility:='off';
  end;
  Options:=TMapOptions.Create; //Options-Objekt anlegen
  with Options do
  begin
    [...] //Initialisierung
  end;
  TMapOptionsAccess(Options).SetProp('styles',Styles.Disp,true); //<- Style zusätzlich in den Optionen übergeben
  [...] //Karte anlegen
end;
Und schon sind die POI's nicht mehr zu sehen:
Anhang 35052

Diese Vorgehensweise ist nur eine Zwischenlösung.

Damit möchte ich die Version 1.4 des Frameworks ankündigen (Version 1.2 gab es als Download zu einer Toolbox-Ausgabe und 1.3 habe ich nur per Email verschickt).

Darin stehen - neben Bugfixes - einige große Neuerungen an:
Vollständige Unterstützung des Google Maps API's bis zur aktuellen Version einschließlich der Nutzung von Bibliotheken:
  • Geometry Library
  • AdSense Library
  • Panoramio Library
  • Places Library
Die Erstellung von Karten wurde noch einmal vereinfacht und die Refresh-Taste F5 wird jetzt frameworkintern verarbeitet. Damit ist jetzt das Neuladen der Karte ohne zusätzlichen eigenen Code möglich.
Desweiteren wird Delphi XE2 unterstützt.

Demo zum Ausblenden von POI's mit Frameworkversion 1.1:

DeddyH 1. Sep 2011 13:48

AW: Google Maps über COM (Component Object Model)
 
Du meinst Delphi XE2 :zwinker:

Thom 7. Sep 2011 11:20

AW: Google Maps über COM (Component Object Model)
 
Danke DeddyH, Du hast natürlich vollkommen Recht. :oops:

Ich habe gerade in den News, gelesen, daß TMS software auf den Delphi-Tagen in Köln drei neue Produkte vorstellen will - unter anderem eine Google Maps Komponente für Delphi.
Eine Anfrage bezüglich des Preises wurde wie folgt beantwortet:
Zitat:

Zitat von Bruno Fierens
Not all is set in stone yet wrt pricing but it will be low cost.

Allerdings gibt es mein Framework immer noch kostenlos*. :dancer:

*für nichtkommerzielle Anwendungen

DelphiFan2008 7. Sep 2011 16:01

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

wäre auch schade wenn sich was an der Situation/Randbedingung deines Frameworks etwas ändern würde. Ich warte momentan auf den Key für den Download von Delphi XE2 Starter. Bin gespannt ob sich das Framwork nahtlos in die Umgebung einbinden läßt. Die fruchtbare Diskussion im Forum und deine Programmierkünste werden das Nötige dazu beitragen ... :lol:

Gruß DelphiFan2008

duff 8. Sep 2011 09:25

AW: Google Maps über COM (Component Object Model)
 
Ist in der angekündigten Version 1.4 eigentlich auch schon die verwendung von Openstreetmaps vorgesehen?

Das wäre ja auch noch ein entscheidender Vorteil gegenüber der TMS Komponente.

Thom 8. Sep 2011 12:06

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

die Nutzung von Version 1.1 unter XE2 (32 Bit) sollte funktionieren - Du mußt Dir nur eine aktuelle jedi.inc besorgen, die den XE2-Compiler erkennt oder selbst Hand anlegen. Ich bin dabei, die Compilererkennung selbst zu schreiben, um die Abhängigkeit von Jedi wegzubekommen.

Das Projekt soll natürlich auch in Zukunft unter den selben Bedingungen zu Verfügung stehen. Allerdings würde ich mich freuen, wenn es mehr ehrliche Programmierer gäbe, die bei kommerziellen Gebrauch des Frameworks (das betrifft zum Beispiel schon eine innerbetriebliche Nutzung) auch zu einer finanziellen Unterstützung des Projektes bereit wären. 8-)
Für die neue Version sitze ich zum Beispiel schon seit knapp drei Wochen in Vollzeit am Computer.

Schwerpunkt ist dabei neben den angekündigten Features auch eine XML-Hilfe, die - dank integriertem Documentation Insight bei XE2 - auch in der IDE nutzbar ist. In diesem Zusammenhang auch noch einmal ein großes Dankeschön nach Australien an AndreFM und nach Shanghai an Paul von DevJET, die mir schon vor einem halben Jahr eine Lizenz von Documentation Insight gespendet hatten.
So sieht das dann ungefähr aus:
Anhang 35110

Für die Käufer der XE2 Starter Edition gibt es allerdings eine bittere Pille: Dort ist laut Feature-Matrix Documentation Insight leider nicht enthalten.

Alles andere bekommen wir gemeinsam hin! :-D


Hallo duff,

OSM funktioniert schon seit Version 1.3 des Frameworks. Hast Du diese schon (ich habe jetzt gerade keine Zeit, meine Email-Liste durchzugehen)? Ich könnte Dir auch den Quelltext zur Einbindung dieser Karten zukommen lassen, falls Du Interesse hast.

DelphiFan2008 9. Sep 2011 13:39

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

wo bekomme ich am einfachsten die aktuelle Version von jedi.inc für XE2?

Gruß DelphiFan2008


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.
Seite 3 von 14     123 4513     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