Google Earth COM API Documentationというものを見つけたので、タイプライブラリを使ってGoogle Earthを操作するサンプルを作ってみました。このサンプルは、Google Earthを起動した上で試してみて下さい。
1.コマンドラインで次のように入力して Google Earth's COM API を登録します。
"C:\Program Files\Google\Google Earth\googleearth.exe" /RegServer
2.タイプライブラリの取り込み
(1)コンポーネント → コンポーネントのインポートダイアログでタイプライブラリの取り込みを選択し、
「次へ」ボタンを押す。
(2)Earth 1.0 Type Libraryを選択して「次へ」ボタンを押す。
(一覧にない場合には、「追加」ボタンを押して
c:\Program Files\Google\Google Earth\googleearth.dllを選択する。)
(3)コンポーネントラッパーの作成にチェックを入れて「次へ」ボタンを押す。
(4)ユニットの作成にチェックを入れて(デフォルトのまま)「完了」ボタンを押す。
3.新規フォームにボタンを3つ配置します。
4.プログラムは下記の通りです。(uses にEARTHLib_TLBを追加し忘れないように)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, EARTHLib_TLB, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
GE : TApplicationGE;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 初期設定
procedure TForm1.FormCreate(Sender: TObject);
begin
GE := TApplicationGE.Create(Self);
end;
// 終了処理
procedure TForm1.FormDestroy(Sender: TObject);
begin
GE.Free;
end;
// 緯度、経度による表示
procedure TForm1.Button1Click(Sender: TObject);
var
lat, lon, range, Tilt, azimuth, speed: Double;
begin
// JR京都駅
lat := 34.98545833;
lon := 135.7577556;
// 表示設定
range := 500;
tilt := 0;
azimuth := 0;
speed := 0.3;
// 表示
GE.SetCameraParams(lat, lon, 0, AbsoluteAltitudeGE,
Range, tilt, azimuth, speed);
end;
// ScreenShotの保存・・・なぜか白黒
procedure TForm1.Button2Click(Sender: TObject);
begin
GE.SaveScreenShot('c:\ScreenShot.jpg', 100);
end;
// 検索
procedure TForm1.Button3Click(Sender: TObject);
var
SearchControllerGE: ISearchControllerGE;
PointOnTerrainGE: IPointOnTerrainGE;
Rect : TRect;
begin
SearchControllerGE := GE.SearchController;
// 検索文字列は、住所でもOK!
SearchControllerGE.Search('東京タワー');
// 検索して表示するだけなら上記まででよい。
// 以下、その場所の緯度、経度の取得に挑戦。
// ウェイトをかける。--これでも変な値のときがある。
// 「表示しました」イベントがあればいいのになぁ
Sleep(5000);
while GE.StreamingProgressPercentage < 100 do
begin
Application.ProcessMessages;
Sleep(100);
end;
// どうでもいいけど、検索結果の消去
SearchControllerGE.ClearResults;
// 画面の中央に検索した場所が表示されるみたいので、
// 中央位置を取得する。
// Google Earthの検索結果のプロパティと微妙にずれているので
// もっと正確に取得する方法があると思う。
GetWindowRect(GE.GetRenderHwnd, Rect);
PointOnTerrainGE := GE.GetPointOnTerrainFromScreenCoords(
Rect.Left+(Rect.Right-Rect.Left)/2,
Rect.Top+(Rect.Bottom-Rect.Top)/2);
ShowMessage('緯度:'+FloatToStr(PointOnTerrainGE.Latitude)+#13#10+
'経度:'+FloatToStr(PointOnTerrainGE.Longitude));
end;
end.