TWebbrowser加载来自本地谷歌地图HTML的实时标记非常慢

时间:2011-09-05 12:56:09

标签: multithreading delphi google-maps twebbrowser

我实际上通过在我的TWebBrowser中使用index.html(使用谷歌地图显示和处理点)显示它,每2秒显示许多实时GPS点数(20),并且它减慢了我的应用程序。

因为我在同一个应用程序下有另一个模块允许我在我的数据库中输入数据,它通常会冻结我的应用程序。

我知道线程是为此而制作的,但我不确定它能解决我的问题。 任何想法???

由于 Gwenael

PS:我是从外部文件(而不是我的delphi应用程序中的源代码loadead)加载我的javascript代码的事实,可以减慢我的应用程序吗?

2 个答案:

答案 0 :(得分:3)

如果你从外部文件中获取你的javascript,它将获得缓存,所以不,这可能不会减慢你的速度,除了第一次可能。

可能导致缓慢的原因,以及加快速度的建议:

  • TWebBrowser包装了 Internet Explorer ,当涉及到这种类型的任务时,它并不完全以其原始速度而闻名;如果您想要快速处理JavaScript,请考虑DelphiChromiumEmbedded

  • 如果每两秒画一个标记,则必须在一小时的车程内绘制1800个标记。如果你想展示多次旅行,那么用alpha透明度和所有图标绘制所有图标将是一件沉重的任务。

我通常每2分钟画一个标记(带行驶方向的箭头) ,或者自上次标记以来已经行走超过 200m 。这样,当汽车静止不动时,您不必绘制整个标记云。

您可以使用 douglas-peucker 算法来简化该行。作为参数,您将给出在行中允许的最大错误,并且它将尽可能多地删除不超过该错误的点。因此,当你有一条直线时,它将删除边缘之间的所有点。

此外,您可以在某些缩放级别考虑聚类点。如果您使用OpenLayers,则会更容易,但在Google Maps Util Library的帮助下,您可以使用Google地图(Example)执行相同操作。如果你缩小,在10x10像素的区域上绘制2000个重叠图标是没用的。

如果你告诉我你的代码,我可以就如何加快速度给你一些更直接的建议。

答案 1 :(得分:1)

这是我的Delphi代码:

  i := 0;
  With DMMain.MDMain do
  begin
    QLastPositionGPS.Close ;
    QLastPositionGPS.Open ;
    QLastPositionGPS.First ;
    for i:=0 to QLastPositionGPS.RecordCount-1 do
    begin
      GPSLatitude     := StringReplace(QLastPositionGPS.FieldByName('latitude').AsString, ',', '.', [rfreplaceall]) ;
      GPSLongitude    := StringReplace(QLastPositionGPS.FieldByName('longitude').AsString, ',', '.', [rfreplaceall]) ;
      HeureDernierGPS := QLastPositionGPS.FieldByName('maj').AsString ;

      MDMain.QGPSactifs.Close ;
      MDMain.QGPSactifs.ParamByName('id_artisan').AsInteger := MDMain.QLastPositionGPS.FieldByName('id_artisan').AsInteger ;
      MDMain.QGPSactifs.Open ;
      if MDMain.QGPSactifs.FieldByName('etat').AsBoolean = True then
      begin         CdrCarto.Chromium1.Browser.MainFrame.ExecuteJavaScript('AjouterMarqueurCirculant('+ GPSLatitude + ', ' + GPSLongitude + ', ' + MDMain.QLastPositionGPS.FieldByName('id_artisan').AsString + ')', 'about:blank', 0) ;
      end else if OptionDisplayGPSActif then
        if (MDMain.QGPSactifs.FieldByName('etat').AsBoolean = False) and (MDMain.QGPSactifs.FieldByName('etat_serveur').AsBoolean = True) then
        begin
         CdrCarto.Chromium1.Browser.MainFrame.ExecuteJavaScript('AjouterMarqueurGPS('+ GPSLatitude + ', ' + GPSLongitude + ', ' + MDMain.QLastPositionGPS.FieldByName('id_artisan').AsString + ')', 'about:blank', 0);

        end;
      QLastPositionGPS.Next ;
      MDMain.QGPSactifs.Close ;
    end;
    QLastPositionGPS.Close ;
  end;
end;

和我的Javascript代码:

 function AjouterMarqueurCirculant(Lat, Long, notaxi) {
    var marker = new MarkerWithLabel({
      position: new google.maps.LatLng(Lat, Long),
       draggable: true,
       map: map,
       labelContent: "Taxi "+notaxi,
       labelAnchor: new google.maps.Point(22, 0),
       labelClass: "labelsactif",                      // the CSS class for the label
       labelStyle: {opacity: 0.75},
       labelVisible: true,
      icon:"icones/taxi_circulant_ok.png"
     });

     var iw = new google.maps.InfoWindow({
       content: "Nom Prenom"
     });
     google.maps.event.addListener(marker, "click", function (e) { iw.open(map, marker); });

    markersCirculant.push(marker);
    bounds.extend(new google.maps.LatLng(Lat, Long));
  }