2013-08-09 13 views
5

Mam dziesiątki tysięcy (być może setki tysięcy) punktów, które muszę opracować w Highcharts. Czy istnieje sposób, w jaki mogę zgrupować dane na serwerze, więc będzie on pokazywał mniej niż 1000 punktów, ale w miarę zbliżania się będzie wywoływał AJAX na serwerze, aby uzyskać dane dla tego powiększonego regionu (prawdopodobnie przez to przebiegnie ten sam algorytm klastra). Jak ten interfejs z interfejsem API Highcharts?Zestaw Highcharts dużych zestawów danych

+0

Zgaduję, że muszę złapać 'selected' zdarzenie, a następnie pojawi się ekran ładowania, a następnie AJAX połączenie, a następnie usunąć dane i dodać nowe dane, ale jak to robił powiększanie pracować, ponieważ ta metoda nie wyjaśniałaby tego. – Ray

+1

Właściwie to myślę, że to może zadziałać. Myślę, że uwzględniłoby to powiększanie, ponieważ osie byłyby następnie aktualizowane. Musiałbym po prostu pokazać przycisk Reset Zoom, który wyświetliłby oryginalne dane. – Ray

Odpowiedz

2

Tutaj jest poprawa na odpowiedź Barbary,

Rejestruje do zdarzenia setExtremes, wiedzieć, czy jest to zdarzenie resetowania zoom. Jeśli tak jest - pobiera cały zestaw danych, , umożliwiając poprawne działanie zoomu.

Umożliwia także powiększanie zarówno w osi X, jak i Y.

http://jsfiddle.net/DktpS/8/

var isReset = false; 

... 

      xAxis: { 
       events: { 
         afterSetExtremes : afterSetExtremes, 
        setExtremes: function (e) { 


         if (e.max == null || e.min == null) { 
          isReset = true;        
         } 
         else 
         { 
         isReset = false; 
         } 
        } 
       }, 
       minRange: 3600 * 1000 // one hour 
      }, 

      series: [{ 
       data: data, 
       dataGrouping: { 
        enabled: false 
       } 
      }] 
     }); 
    }); 
}); 


    /** 
    * Load new data depending on the selected min and max 
    */ 
    function afterSetExtremes(e) { 

     var url, 
     currentExtremes = this.getExtremes(), 
      range = e.max - e.min; 
     var chart = $('#container').highcharts(); 

     var min = 0; 
     var max = 1.35e12; 
     if(!isReset) 
     { 
      min = e.min; 
      max = e.max; 
     } 
     chart.showLoading('Loading data from server...'); 
     $.getJSON('http://www.highcharts.com/samples/data/from-sql.php?start=' + Math.round(min) + 
      '&end=' + Math.round(max) + '&callback=?', function (data) { 

      chart.series[0].setData(data); 

      chart.hideLoading(); 


     }); 

    } 
3

Istnieje demonstracja highstock, która wykonuje to http://www.highcharts.com/stock/demo/lazy-loading. Ale można zrobić to samo z highcharts http://jsfiddle.net/RHkgr/ Ważne bit jest afterSetExtremes funkcjonować

... 
      xAxis : { 
       events : { 
        afterSetExtremes : afterSetExtremes 
       }, 
... 


/** 
* Load new data depending on the selected min and max 
*/ 
function afterSetExtremes(e) { 

    var url, 
     currentExtremes = this.getExtremes(), 
     range = e.max - e.min; 
    var chart = $('#container').highcharts(); 
    chart.showLoading('Loading data from server...'); 
    $.getJSON('http://www.highcharts.com/samples/data/from-sql.php?start='+ Math.round(e.min) + 
      '&end='+ Math.round(e.max) +'&callback=?', function(data) { 

     chart.series[0].setData(data); 
     chart.hideLoading(); 
    }); 

} 
+1

W innej notatce, że jsfiddle nie działa poprawnie, spróbuj powiększyć, a następnie reseting. Musi on ponownie pobrać oryginalne dane. – Ray

0

W przypadku, gdy nie będzie miał limit punktów, można zwiększyć turboThreshold paramter.

+0

Próbowałem tego i nie jest to praktyczne, ponieważ muszę wspierać IE8: "( – Ray

+0

Masz na myśli, że progresja turbosprężarki nie działa w IE8? Czy mógłbyś odtworzyć swój przykład w jsfiddle.net? –

+0

Nie, IE8 nie radzi sobie dobrze z tak wieloma obiektami, będzie Cię wiele razy pytać, czy chcesz zabić scenariusz, – Ray

Powiązane problemy