|
この例の具体的な応用市場は、データベースから商品の価格を定期的に読み取り、それをウェブページにグラフとして表示するというものです。これは株式取引の取引商品の価格トレンドチャートに似ています。 私は asp.net を使っていて、jQueryのHighchartsプラグインと組み合わせて使っています。プラグインは多くの種類のグラフィックをサポートしていますが、それらは静的で、提供された例は変換が必要です。興味のある友人はHighchartsの公式サイト(http://www.highcharts.com/)で見ることができます。そこには多くのデモがあります。正直なところ、私のニーズを理解するためにはHighstockを使うべきです。 しかし、Highchartsの動的更新の例を見て、私の要求インターフェースはより簡潔であることに気づきました。そこでこの記事はHighchartsの動的更新モデルを使用し、グラフィックタイプはスプラインです。最終的な効果マップは以下の通りです(Pinqijinの価格は10秒ごとに更新され、折れ線グラフに10秒ごとに点が加算されます):
ステップ収集の達成: VSで新しいウェブサイトを作成し、asp.net ページを作成してください。DynamicUpdate.aspxページコードは以下の通りです:
- <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DynamicUpdate.aspx.cs"
- Inherits="WebImg.DynamicUpdate" %>
- <!DOCTYPE HTML>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <title>动态显示价格图例</title>
- <scrip去掉t type="text/javascrip去掉t" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></scrip去掉t>
- <scrip去掉t type="text/javascrip去掉t">
- $(function () {
- $(document).ready(function () {
- Highcharts.setOptions({
- global: {
- useUTC: false
- }
- });
- var chart;
- chart = new Highcharts.Chart({
- chart: {
- renderTo: 'container',
- type: 'spline',
- marginRight: 10,
- events: {
- load: function () {
- // set up the updating of the chart each second
- var series = this.series[0];
- setInterval(function () {
- var randomCode = parseInt(Math.random() * 10000);
- var oldrandomCode = parseInt(Math.random() * 10000);
- $.ajax({
- url: "ajaxhandler/dataupdate.ashx?" + randomCode + "=" + oldrandomCode + "&flag=1",
- type: "get",
- dataType: "json",
- success: function (data, textStatus, XMLHttpRequest) {
- var ctime = new Date();
- ctime.setTime(parseInt(data.rows[0].times));
- var x = ctime.getTime(), // current time
- y = data.rows[0].price * 200;
- series.addPoint([x, y], true, true);
- },
- error: function () { }
- });
- }, 10000);
- }
- }
- },
- title: {
- text: '品旗撮合交易市场品种行情'
- },
- xAxis: {
- title: {
- text: '时间'
- },
- type: 'datetime',
- tickPixelInterval: 150,
- labels:{formatter:function(){
- var vDate = new Date(this.value);
- return vDate.getHours()+":"+vDate.getMinutes()+":"+vDate.getSeconds();
- }}
- },
- yAxis: {
- title: {
- text: '价格'
- },
- plotLines: [{
- value: 0,
- width: 1,
- color: '#808080'
- }]
- },
- tooltip: {
- formatter: function () {
- return '<b>' + this.series.name + '</b><br/>' +
- Highcharts.dateFormat('%Y-%m-%d %H:%M:%S', this.x) + '<br/>' +
- Highcharts.numberFormat(this.y, 2);
- }
- },
- legend: {
- enabled: false
- },
- exporting: {
- enabled: false
- },
- credits:{
- text:'品旗金属交易市场',
- url:'http://www.inv6.com'
- },
- series: [{
- name: '品旗金(GOLD)',
- data: (function () {
- var data = [],
- i;
- var jsonData = <%= jsonstr %>;
- for (i = -19; i <= 0; i++) {
- var ctime = new Date();
- ctime.setTime(parseInt(jsonData.rows[i+19].time1));
- data.push({
- x: ctime.getTime(),
- y: jsonData.rows[i + 19].price * 200
- });
- }
- return data;
- })()
- }]
- });
- });
- });
- </scrip去掉t>
- </head>
- <body>
- <scrip去掉t src="http://code.highcharts.com/highcharts.js"></scrip去掉t>
- <scrip去掉t src="http://code.highcharts.com/modules/exporting.js"></scrip去掉t>
- <div id="container" style="min-width: 400px; height: 400px; margin: 0 auto">
- </div>
- </body>
- </html>
コードをコピーしますHighchartsプロパティのrenderToはdisplay containerを示します。 eventsはコンテナが登録する必要があるイベントを表し、loadはロード完了後に発生します。ここではJSタイマーがロード中に設定され、10秒ごとに1回発生します。コードはajaxhandlerフォルダのdataupdate.ashxファイルから、jQueryのDynamicUpdate.aspxページと同じルートディレクトリにあるデータupdate.ashxファイルから最新のGOLDを要求するものです価格データについては、ajax URLにrandomCode + "=" + oldrandomCodeを追加する理由です。ランダムな数字を追加することでキャッシュを回避できるからです。flag=1はdataupdate.ashxファイルが異なるajaxからの複数のリクエストを受け付けるため、flagで区別しています xAxisはコンテナのx軸に定義された属性の集合を表し、typeは表示されるテキストタイプを表します。オプションです。ここでは時間タイプを入力します。ここではインスタンスのデフォルトがGMT時間であることに注意してください。UTC時間も使えますが、一般的には北京時間(GMTまたはUTC)+8時間=北京時間を使っています。ですので、Ajaxで北京時間を得る場合は、時間から8時間を差し引くべきです(ここで経験を共有したいと思います。 .getTime() メソッドで使えるサーバー時間をjs時間に変換する方法、つまりサーバー時間から1970-1-1から引き、残りの日をミリ秒に変換し、その後 setTime メソッド(js)で新たに初期化された時間に値を割り当てる方法です。getTime() で得られた結果は、getTime() で js 時間を新しい日付(年、月、日、時、分、秒、ミリ秒)の形で直接初期化するには誤りがあることがわかりました。 1970-1-1が引く理由は、getTime()メソッドの定義が1970-1-1の現在の時刻からミリ秒数を取得するためです。x軸が時間として表示されていないか、自分で定義する必要がある場合、category属性で定義することもできます。tickPixelIntervalはx軸の密度を表し、ラベルはx軸の表示フォーマットに使われます yAxisはコンテナのy軸に定義された属性の集合を表し、x軸の属性とほぼ同じですが、Highchartsではy軸の固定値をカテゴリで定義することはできません。Highchartsのy軸は、シリーズ属性のデータサブ属性に依存し、例えばデータに値を割り当てる際に、与えられた座標点データに基づいて自動的に生成されます。 するとy軸の表示は100から300の間で、y軸の最大または最小属性を設定することもできます seriesはコンテナ内に表示されるすべての曲線の集合を表します。ここでは1つの曲線のみを示し、nameは曲線の名前を表し、dataは曲線の座標点の連続集合を表します。xは前、yは後ろ。js配列です。この場合、x軸は時間を示しているため、配列オブジェクトのxプロパティは時間に設定する必要がありますが、Highchartsではx軸に直接時間が割り当てられていません。 代わりに、1970-1-1からある時間までのミリ秒数がx軸に割り当てられ、この時間を表すためにgetTime()メソッドを使う必要があり、y軸座標点の形はy = 小数×整数形でなければなりません。なぜHighchartsがこれをしなければならないのか理解できませんでした。なぜなら、この例の多様体の価格データはほぼ同じで、データを取得するときに200で割り、y軸に値を割り当てる際に200を掛ける必要がありました。
ページコードの<%= jsonstr %>は、グラフを初期化するためにサーバーから取得する最初のデータであり、ページのCS生成です
- public string jsonstr = "";
- protected void Page_Load(object sender, EventArgs e)
- {
- getData();
- }
- private void getData()
- {
- DataTable dtPrice = SQLDBHelper.ExecuteTable("select top 20 TMPCode,TMPTime,TMPPrice from TabMerPrice with(nolock) order by TMPTime desc");
- string json = "{"rows":[";
- for (int i = (dtPrice.Rows.Count-1); i >= 0; i--)
- {
- json += "{"time1":"" + (Convert.ToDateTime(dtPrice.Rows[i]["TMPTime"]).AddHours(-8) - new DateTime(1970, 1, 1)).TotalMilliseconds + "","price":"" + (Convert.ToDecimal(dtPrice.Rows[i]["TMPPrice"])/200) + ""},";
- }
- json = json.TrimEnd(',');
- json += "]}";
- jsonstr = json;
- }
コードをコピーしますその中には、TabMerPriceテーブルがバラエティ価格情報表、TMPTime時間、TMPPrice価格、TMPTimeの時間間隔は10秒です。データベースジョブを使ってテーブルの記録を生成し、これは10秒ごとに1回行われます AddHours(-8)は時間を北京時に変換するためで、生成されるデータ形式はjson形式です dataupdate.ashxのコードは次のようになります:
- public void ProcessRequest(HttpContext context)
- {
- string flag = context.Request.QueryString["flag"].ToString();
- switch (flag)
- {
- case "1"://获取品种当前价格
- GetMerPrice(context);
- break;
- }
- }
- private void GetMerPrice(HttpContext context)
- {
- context.Response.Clear();
- context.Response.Buffer = true;
- context.Response.ContentType = "application/json";
- context.Response.ContentEncoding.GetBytes("utf-8");
- DataTable dtPrice = SQLDBHelper.ExecuteTable("select top 1 TMPCode,TMPTime,TMPPrice from TabMerPrice with(nolock) order by TMPTime desc");
- string json = "{"rows":[";
- json += "{"times":"" + (Convert.ToDateTime(dtPrice.Rows[0]["TMPTime"]).AddHours(-8) - new DateTime(1970, 1, 1)).TotalMilliseconds + "","price":"" + (Convert.ToDecimal(dtPrice.Rows[0]["TMPPrice"]) / 200) + ""}";
- json = json.TrimEnd(',');
- json += "]}";
- context.Response.Write(json);
- context.Response.Flush();
- context.Response.End();
- }
コードをコピーしますこれはステップアグリゲーションの大まかな実装であり、サーバー側データのリアルタイム表示を標準フォーマットに似たグラフで実現できます
HighCharts演示.zip
(48.69 KB, ダウンロード数: 1)
|