Einzelnen Beitrag anzeigen

DelphiFan2008

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

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

  Alt 10. Nov 2012, 13:03
Hallo jonathan,

verwende die Funktion zum speichern des Inhaltes des WebBrowsers in einem JPG-File, hatte ich aus einem Beitrag hier im Forum
Delphi-Quellcode:
procedure WebBrowserScreenShot( const wb:TWebBrowser;const FileName:TFileName );
var viewObject : IViewObject;
    r : TRect;
    Bitmap : TBitmap;
begin
  if wb.Document <> nil then
  begin
    wb.Document.QueryInterface( IViewObject,viewObject );
    if Assigned( viewObject )then
    try
      Bitmap := TBitmap.Create;
      try
        r := Rect( 0,0,wb.Width,wb.Height );

        Bitmap.Height := wb.Height;
        Bitmap.Width := wb.Width;

        viewObject.Draw( DVASPECT_CONTENT,1,nil,nil,Application.Handle,Bitmap.Canvas.Handle,@r,nil,nil,0 );

        with TJPEGImage.Create do
        try
          Assign( Bitmap ) ;
          SaveToFile( FileName ) ;
        finally
          Free;
        end;
        Clipboard.Assign( Bitmap );
      finally
        Bitmap.Free;
      end;
    finally
      viewObject._Release;
    end;
  end;
end;
dabei setze ich die Größe der Karte vorher auf eine virtuelle Größe die ich im Ziel haben will z.B. w:=4096,h:=4096
Delphi-Quellcode:
  
  WebBrowserMap.Align := alNone;
  WebBrowserMap.Width := w;
  WebBrowserMap.Height := h;
danach zentriere ich den Kartenauschnitt auf meinen gewünschten Bereich

MapCenter; // eigene Funktion mit Script.Maps[0].FitBounds( t ) etc. dann speichern.

  WebBrowserScreenShot( WebBrowserMap,APP_PATHTEMPFILES + '\Test.jpg' ); Wichtig ist hier, dass es abhängig von der Breite/Höhe dauert, bis die Karte aufgebaut ist. Beim zweiten mal deutlich schneller -> Cache.
Ich verwende derzeit eine Zeitschleife. Versuche mit WebBrowserMap.Busy=False und Map.OnTilesLoaded waren bisher nicht erfolgreich. Die Lösung mit der Zeitschleife ist für persönliche Belange ausreichend, für die Weitergabe der Applikation indiskutabel aber sie tut. Das Ergebis ist dann eine schöne Karte in einer tollen detailierten Auflösung. Optimal z.B. für die Grundlage einer Kamerafahrt über die Karte beim Videoschnitt -> Indiana Jones Effekt. (Lizenzbestimmungen beachten).

Danach Browser wieder in Client und Ausschnitt zentrieren
Delphi-Quellcode:
  WebBrowserMap.Align := alClient;
  MapCenter;
Gruß DelphiFan2008
  Mit Zitat antworten Zitat