Einzelnen Beitrag anzeigen

Thom

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

AW: Google Maps API mit lokalen Bildern?

  Alt 22. Mai 2012, 12:26
Ich habe mal schnell das HTML/JavaScript-Beispiel von Dir mit Hilfe des Frameworks (Version 3 mit Interfaces) umgesetzt.

demo.jpg

Die Erstellung der Karte erfolgt in zwei Schritten. Diese Trennung ist zwar keine Pflicht - sie ist aber sinnvoll, um nach einem Refresh (Taste F5) nur den Code auszuführen, der für die Darstellung notwendig ist:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    [...]
  private
    FBikerLayer: IBicyclingLayer;
    FGeocoder: IGeocoder;
    FMap: IMap;
    FTrafficLayer: ITrafficLayer;
    [...]
  public
    property BikerLayer: IBicyclingLayer read FBikerLayer write FBikerLayer;
    property Geocoder: IGeocoder read FGeocoder write FGeocoder;
    property Map: IMap read FMap write FMap;
    property TrafficLayer: ITrafficLayer read FTrafficLayer write FTrafficLayer;
  end;

procedure TForm1.FormShow(Sender: TObject);
begin
  with Script(WebBrowser1) do
    if not APILoaded
      then LoadAPIAsync(InitMap);
end;

procedure TForm1.InitMap(Sender: IObject);
var
  MapOptions: IMapOptions;
begin
  with Sender as IScript do
  begin
    MapOptions:=New(Google.Maps.MapOptions);
    with MapOptions do
    begin
      Zoom:=12;
      Center:=New(Google.Maps.LatLng(49.067231,10.837039));
      MapTypeID:=Google.Maps.MapTypeID.Hybrid;
      StreetViewControl:=false;
    end;
    Map:=New(Google.Maps.Map(MapOptions));
    Geocoder:=New(Google.Maps.Geocoder);
    TrafficLayer:=New(Google.Maps.TrafficLayer);
    BikerLayer:=New(Google.Maps.BicyclingLayer);
    TrafficLayerVisible.Checked:=false;
    BikerLayerVisible.Checked:=false;
    StreetViewControlVisible.Checked:=false;
  end;
end;
Dabei wird das API geladen, die Karte entsprechend der Einstellungen angelegt sowie die zusätzlichen Layer und der Geocoder erstellt. Der Rest besteht aus der Initialisierung der Steuerelemente, über die die Ein- und Ausblendung der Layer erfolgt:
Delphi-Quellcode:
procedure TForm1.TrafficLayerVisibleClick(Sender: TObject);
begin
  if assigned(TrafficLayer) then
    if TrafficLayerVisible.Checked
      then TrafficLayer.SetMap(Map)
      else TrafficLayer.SetMap(nil);
end;

procedure TForm1.BikerLayerVisibleClick(Sender: TObject);
begin
  if assigned(BikerLayer) then
    if BikerLayerVisible.Checked
      then BikerLayer.SetMap(Map)
      else BikerLayer.SetMap(nil);
end;

procedure TForm1.StreetViewControlVisibleClick(Sender: TObject);
begin
  if assigned(Map)
    then Map.&Set('streetViewControl',StreetViewControlVisible.Checked); //für ältere Compiler "Set_"
end;

procedure TForm1.ClearMarkersClick(Sender: TObject);
begin
  if Script<>nil
    then Script.Markers.Clear;
end;
Um eine Adresse zu kodieren, wird einfach eine asynchrone Geocoding-Anfrage gestartet:
Delphi-Quellcode:
procedure TForm1.GotoAddressClick(Sender: TObject);
var
  Request: IGeocoderRequest;
begin
  if assigned(Geocoder) then
  begin
    Request:=New(Script.Google.Maps.GeocoderRequest);
    Request.Address:=Address.Text;
    Geocoder.Geocode(Request,GeocoderCallback);
  end;
end;
Ist die Antwort für die Geocoding-Anfrage eingetroffen, wird die GeocoderCallback-Methode aufgerufen. Dabei kann es sich um eine anonyme Methode handeln (ab Delphi 2009) oder um eine Objekt-Methode:
Delphi-Quellcode:
procedure TForm1.GeocoderCallback(Sender: IObject; Result: IGeocoderResultArray; const Status: String);
var
  MarkerOptions: IMarkerOptions;
begin
  with Script do
  begin
    if Status=Google.Maps.GeocoderStatus.OK then
    begin
      Map.PanTo(Result[0].Geometry.Location);
      MarkerOptions:=New(Google.Maps.MarkerOptions);
      with MarkerOptions do
      begin
        Position:=Result[0].Geometry.Location;
        Map:=Self.Map;
        Icon:=Encode64(Image1);
        Title:='Image1';
      end;
      New(Google.Maps.Marker(MarkerOptions));
    end else Showmessage('Geocode was not successful for the following reason: '+Status);
  end;
end;
Hier wird's jetzt interessant, da in dieser Methode ein Marker erstellt wird, dessen Icon einfach aus einer TImage-Komponente entnommen wird. Die Funktion Encode64 macht es möglich.
Viel einfacher - glaube ich - geht es nicht.
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat