在非可视组件上使用GMLib进行地理编码

时间:2017-05-18 19:17:09

标签: delphi gmlib

我使用Delphi 10.1 Berlin和GMLib 1.5.5我可以成功显示地图并根据SQL数据集中的数据填充标记。但是当我的查询结果集变大时,丢弃标记可能会相当慢。我认为很多这是由于GeoCoding地址进入LatLng的开销 我想在输入时对这些地址进行GeoCode并存储坐标,以便更容易/更快地显示标记。我在DataModule中写了一个函数,在GeoCode地址发生变化时(Post Post)。但例行公事“挂起”了。因为我不相信地图会被完全初始化(TGMMap.DoMap)

这是我的功能:

procedure GeoCodeAddress(var coords: TLatLng; Address: String);
Var  mMap : TGMMap;
     mBrowser : TWebBrowser;
     mGeoCoder : TGMGeoCode;
begin
     mBrowser := TWebBrowser.Create(Nil);
     mBrowser.Silent := True;
     mMap := TGMMap.Create(Nil);
     mMap.APIKey := GMapsAPIKey;
     mMap.AfterPageLoaded := AfterPageLoaded;
     mMap.WebBrowser := mBrowser;
     mMap.Active := True;
     //mMap.DoMap;
     mGeoCoder := TGMGeoCode.Create(Nil);
     mGeoCoder.Map := mMap;
     mGeoCoder.Geocode(Address);
     if mGeoCoder.GeoStatus = gsOK Then
       Begin
        Coords.Lat := mGeoCoder.GeoResult[0].Geometry.Location.Lat;
        Coords.Lng := mGeoCoder.GeoResult[0].Geometry.Location.Lng;
       End;
     mGeoCoder.Free;
     mMap.Free;
     mBrowser.Free;
end;

procedure AfterPageLoaded(Sender: TObject; First: Boolean);
begin
  if First then
      TGMMap(Sender).DoMap;
end;

提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

问题是当你调用mGeoCoder.Geocode方法时,可能还没有加载HTML文件。

尝试在AfterPageLoaded事件中使用mGeoCoder组件

procedure AfterPageLoaded(Sender: TObject; First: Boolean);
begin
  if First then
  begin
    TGMMap(Sender).DoMap;

    // use here
  end;
end;