TWebbrowser очень медленно загружает маркеры реального времени с локальной карты Google HTML - PullRequest
5 голосов
/ 05 сентября 2011

Я на самом деле каждые 2 секунды отображаю множество точек GPS в реальном времени (20), показывая их из index.html (используя карты Google для отображения и обработки точек) в моем TWebBrowser, и это сильно замедляет мое приложение. *

И поскольку в том же приложении я получил еще один модуль, позволяющий мне вводить данные в моей базе данных, он обычно зависает в моем приложении.

Я знаю, что для этого созданы темы, но я не уверен, что это решит мою проблему. Есть идеи ???

Спасибо Gwenael

PS: замедляет ли мое приложение тот факт, что я загружаю свой код javascript из внешнего файла (а не загрузочный исходный код в моем приложении delphi)?

Ответы [ 2 ]

3 голосов
/ 06 сентября 2011

Если вы получите свой javascript из внешнего файла, он будет кэширован , так что нет, это, вероятно, не сильно замедлит вас, за исключением, возможно, первого раза.

Возможные причины медлительности и предложения по ускорению:

  • TWebBrowser упаковывает Internet Explorer , который не совсем известен своей необработанной скоростью, когда дело доходит до этого типа задач; Если вам нужна быстрая обработка JavaScript, рассмотрите DelphiChromiumEmbedded

  • Если вы рисуете маркер каждые две секунды, вам придется нарисовать 1800 маркеров для одного часа езды. Если вы хотите показать несколько поездок, будет очень сложно нарисовать все значки с альфа-прозрачностью и все.

Обычно я рисую маркер (стрелка с указанием направления движения) каждые 2 минуты , или если с момента последнего маркера пройдено более 200 м . Таким образом, вам не нужно рисовать целое облако маркеров, когда машина стоит на месте.

Вы можете использовать алгоритм Дугласа-Пикера для упрощения линии. В качестве параметра вы дадите максимальную ошибку, которую вы допустите в строке, и она удалит столько точек, сколько возможно, без превышения этой ошибки. Поэтому, если у вас есть прямая линия, она удалит все точки между краями.

Кроме того, вы можете рассмотреть кластеризацию точек на определенных уровнях масштабирования. Если бы вы использовали вместо этого OpenLayers, это было бы проще, но с помощью Google Maps Util Library вы можете сделать то же самое с Google Maps ( Пример ). Если вы уменьшите масштаб, будет немного бесполезно рисовать 2000 перекрывающихся значков в области 10x10 пикселей.

Если вы покажете мне свой код, я могу дать вам еще несколько прямых советов о том, как ускорить процесс.

1 голос
/ 06 сентября 2011

Вот мой код 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));
  }
...