2016-03-29 15 views
2

私はPostgresデータベースからデータを取得し、それらを美しいGoogle Chartsの束として視覚化するJSスクリプトを作成しました。それは正常に動作しますが、非常に遅く、時にはWebページがただ時間切れになることがあります。Google Chartのサーバー側を保存

私は、グラフをPNG/GIF/SVG/Whateverとして作成し、特定の間隔でチャートを更新するためにcronジョブを使用することを考えていました。それは速度のために対話性(これはあまり重要ではない)を犠牲にします。しかし、Google検索では、PHPでGoogleのチャートを作成する明確な道筋は提供されていません。助言がありますか?ここで

は、私のJSスクリプトです:

  google.setOnLoadCallback(drawManyCharts); 

     function drawManyCharts() 
     //parameters are: timeUnit, target div, abscissa bins, MultiplicationFactor, Graphtype, SensorString 
     {drawAllCharts("minutes", "GoogleChart_div", 500, 0.01, "Linechart", "Temperature"); 
     drawAllCharts("hours", "GoogleChart2_div", 400, 0.01, "Linechart", "Temperature"); 
     drawAllCharts("days", "GoogleChart3_div", 48, 0.01, "Linechart", "Temperature"); 
     drawAllCharts("weeks", "GoogleChart4_div", 48, 0.01, "Linechart", "Temperature"); 
     drawAllCharts("hours", "GoogleChartPressure_div", 48, 0.01, "Linechart", "Pressure"); 
     } 

     function drawAllCharts(TimeUnit, containerChart, NoAbscissaBins, MultiplicationFactor, Graphtype, SensorString) 
     { 

     // var SensorString="Temperature"; 
       var TableType="integer"; 
     // var NoAbscissaBins=12; 
       var DataTableName="dataMasterTable"; 
     // var TimeUnit="days"; 
       var TimeStart="test"; 
     // var Graphtype="Linechart"; 
       var graphtitle = "Heizungskeller"; 
       var OrdinateLabel = "Temperature (Celsius 100x)" 
       var maxViewWindow= 8000; 
       var minViewWindow= 0; 

       var GoogleArray = $.ajax({   
       url: "/php/PrepareGoogleDataTable.php" +"?"+ 
          "SensorString="+SensorString + "&"+ 
          "TableType=" + TableType +"&"+ 
          "NoAbscissaBins=" + NoAbscissaBins + "&"+ 
          "MultiplicationFactor=" + MultiplicationFactor + "&"+ 
          "DataTableName=" + DataTableName +"&"+ 
          "TimeUnit=" + TimeUnit +"&"+ 
          "TimeStart=" + TimeStart,   
       //dataType:"json",   
       async: false   
       }).responseText; 
       console.log(GoogleArray); 
       GoogleArray = JSON.parse(GoogleArray); 
       eval(GoogleArray.GoogleAddColumns); 
       eval(GoogleArray.GoogleAddRows); 



     //create dynamic dataview for charts 
     //columns as specified by TableType 
     switch (TableType) 
     { 
     case "boolean": 
      eval(GoogleArray.GoogleVisualizeColumnCount) ; 
     break; 

     case "integer" : 
      eval(GoogleArray.GoogleVisualizeColumnsMinStdevStdevMax) ; 
      eval(GoogleArray.GoogleVisualizeColumnsAvg) ; 
     break; 

     case "float" : 
      eval(GoogleArray.GoogleVisualizeColumnsMinStdevStdevMax) ; 
      eval(GoogleArray.GoogleVisualizeColumnsAvg) ; 
     break; 

     case "string" : 
     break; 


     } 

     switch (Graphtype) 
     { 
     case "Candlestick": 
     var optionsCandlestick = { 
      width: '100%', 
      height: 480, 
      bar:{groupWidth: '90%'}, 
      vAxis: {minValue: 0, 
        baseline: 0, 
        textStyle: {color: 'blue', 
           fontSize: 10}, 
        viewWindowMode: 'explicit', 
        viewWindow: {max: maxViewWindow, 
           min: minViewWindow 
           } 
        }, 
      hAxis: {textStyle: 
         {color: 'blue', 
         fontSize: 10}, 
        }, 
      pointSize: 5, 
      title: graphtitle 
      }; 

     var wrapper = new google.visualization.ChartWrapper(
      {chartType: 'CandlestickChart', 
       dataTable: dataViewMinStdevStdevMax, 
       options: optionsCandlestick, 
       containerId: containerChart}); 
       wrapper.draw(); 

     break; 

     case "StackedColumn": 

     var optionsColumnchart = { 
      chartArea: {width: '80%', height: '70%'}, 
      //legend: {position: 'in'}, 
      //titlePosition: 'in', 
      axisTitlesPosition: 'in', 
      hAxis: {textPosition: 'in'}, 
      vAxis: {textPosition: 'in'}, 
      width: '100%', 
      height: 520, 
      isStacked: true, 
      pointSize: 3, 
      fontSize: 10, 
      backgroundColor: 'transparent', 
      bar:{groupWidth: '90%'}, 
      hAxis:{slantedTextAngle: 90}, 
      legend:{position: 'in', textStyle: {color: 'blue', fontSize: 12}}, 
      title: graphtitle 
      };  
     var wrapper = new google.visualization.ChartWrapper(
      {chartType: 'ColumnChart', 
       dataTable: dataViewCount, 
       options: optionsColumnchart, 
       containerId: containerChart}); 
       wrapper.draw(); 
     break; 

     case "Linechart": 
      //these are the customizable options from google 
      var optionsLinechart = { 
         chartArea: {width: '80%', height: '70%'}, 
         //legend: {position: 'in'}, 
         width: 1000, 
         height: 480, 
         pointSize: 0, 
         title: graphtitle, 
         vAxis: {title: OrdinateLabel} 
     }; 

      var wrapper = new google.visualization.ChartWrapper(
      {chartType: 'LineChart', 
       dataTable: dataViewAvg, 
       options: optionsLinechart, 
       containerId: containerChart}); 
       wrapper.draw(); 
     break; 

     } 

     } 
     </script> 

、ここではPostgresのデータを取り、Googleのチャート消化フォーマットに変換してPHPスクリプトです:

<?php 
    if(isset($_GET['SensorString']) && 
     (!empty($_GET['SensorString'])) && 
     (!empty($_GET['TableType'])) && 
     (!empty($_GET['TimeUnit'])) && 
     (!empty($_GET['NoAbscissaBins'])) && 
     (!empty($_GET['DataTableName'])) && 
     (!empty($_GET['MultiplicationFactor'])) && 
     (!empty($_GET['TimeStart']))) 

     {$SensorString = str_replace ("*", "%", $_GET['SensorString']); // string to fill "WHERE" condition 
     $TableType = $_GET['TableType']; // boolean/integer/float/string 
     $TimeUnit = $_GET['TimeUnit']; //hours/days/weeks/months/years 
     $NoAbscissaBins = $_GET['NoAbscissaBins']; //number of time units to be displayed on the abscissa 
     $DataTableName = $_GET['DataTableName']; //number of time units to be displayed on the abscissa 
     $TimeStart = $_GET['TimeStart']; //should not necessarily be used 

     } 
    else 
     {// assume Bewegungsmelder, boolean, hours, 12 bins 
     $SensorString = "OutsideTemp"; 
     $TableType = "float"; 
     $TimeUnit = "days"; 
     $TimeStart = -12; 
     $NoAbscissaBins = 30; 
     $DataTableName = "dataMasterTable"; 
     } 

    $RedirectEchoToFile = false; 



    $DataCollectionArray = DataCollectionCrossTab($SensorString, $TableType, $TimeUnit, $NoAbscissaBins, $TimeStart, $DataTableName); 
    //echo "GoogleDataRow: ". $DataCollectionArray['GoogleDataRow'] ; 
    $GoogleArray = PrepareGoogleChart($DataCollectionArray); 


    /* $GoogleArray has the following keys: 
    / [0] => GoogleAddColumns 
    / [1] => GoogleAddRows 
    / [2] => GoogleVisualizeColumnCount 
    / [3] => GoogleVisualizeColumnsAvg 
    / [4] => GoogleVisualizeColumnsMinStdevStdevMax 
    / [5] => MainCrosstabSelectQuery 
    */ 


    echo json_encode($GoogleArray); 



    //--------------------------------------------------- 

    Function PrepareGoogleChart($DataCollectionArray) 
    { 
    // var GoogleAddColumns adds columns to DataTable 

    $TimeUnit = "hours"; // (can be "hours", "days", "months", "years") 
    $GoogleAddColumns = ""; 

    // var GoogleVisualizeColumnsAll renders DataView1 view of DataTable 
    // var VisualizeFirstColumn sets the first column, and renders "hours" (can be changed to days etc.) 
    $VisualizeFirstColumn = ".setColumns([ 
          {calc: function(data, row) 
          {return data.getFormattedValue(row, " 
          . ColumnLabel($TimeUnit). "); }, 
          type:'string'}"; 

    //set up dataView1, which is essentially useless 
    $GoogleVisualizeColumnsAll = 
     "var dataView1 = new google.visualization.DataView(".$DataCollectionArray['DataTableName'].");".chr(13) 
     ."dataView1".$VisualizeFirstColumn; 

    //set up dataViewCount, which is good to count events from IpsLoggingBoolean and feed a column chart 
    $GoogleVisualizeColumnCount = 
     "var dataViewCount = new google.visualization.DataView(".$DataCollectionArray['DataTableName'].");" 
     .chr(13)."dataViewCount".$VisualizeFirstColumn; 

    //set up dataViewAvg, which visualizes only the averages and is good for line charts 
    $GoogleVisualizeAvg = 
     "var dataViewAvg = 
      new google.visualization.DataView(".$DataCollectionArray['DataTableName'].");".chr(13). 
      "dataViewAvg" 
      .".setColumns([ {calc: function(data, row) 
          {return data.getFormattedValue(row, " 
          . ColumnLabel($TimeUnit). "); }, 
          type:'string'}"; 

    //set up dataViewMinStdevStdevMax, which can feed a candlestick chart 
    $GoogleVisualizeColumnsMinStdevStdevMax = 
     "var dataViewMinStdevStdevMax = 
      new google.visualization.DataView(".$DataCollectionArray['DataTableName'].");".chr(13) 
      ."dataViewMinStdevStdevMax" 
      .".setColumns([ {calc: function(data, row) 
          {return data.getFormattedValue(row, " 
          . ColumnLabel($TimeUnit). "); }, 
          type:'string'}"; 

    $GoogleVisualizeScattergram = 
     "var dataViewScattergram = new google.visualization.DataView(".$DataCollectionArray['DataTableName'].");" 
     .chr(13)."dataViewScattergram.setColumns(["; 


    //create strings for Google DataTable/DataView1 columns definition 
    $GoogleAddColumns = 
      "var ". $DataCollectionArray['DataTableName']. "= new google.visualization.DataTable();".chr(13). 
      $DataCollectionArray['DataTableName'].".addColumn('string', 'hoursIndex');".chr(13). 
      $DataCollectionArray['DataTableName'].".addColumn('string', 'hours');".chr(13). 
      $DataCollectionArray['DataTableName'].".addColumn('string', 'PlaceHolder1');".chr(13). 
      $DataCollectionArray['DataTableName'].".addColumn('string', 'PlaceHolder2');".chr(13). 
      $DataCollectionArray['DataTableName'].".addColumn('string', 'PlaceHolder3'); "; 

    for ($varIndex=0; $varIndex < ($DataCollectionArray['NumberOfColumns']-5); $varIndex++) 
     { 

     Switch ($DataCollectionArray['TableType']) 
     { 
     case "boolean": 
      $GoogleAddColumns .= 
      $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. ", 'count$varIndex'); "; 
     break; 

     case "integer": 
      $GoogleAddColumns .= 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'avg'); ".chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'stddev+'); ".chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'stddev-'); ". chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'max'); " .chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'min'); " .chr(13); 
     break; 

     case "float": 
      $GoogleAddColumns .= 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'avg'); ".chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'stddev+'); ".chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'stddev-'); ". chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'max'); " .chr(13). 
     $DataCollectionArray['DataTableName'].".addColumn('number', ".$DataCollectionArray['CategoryArray'][$varIndex]. " +'min'); " .chr(13); 
     break; 

     case "string": 
     //no visualization in case of strings, but a "tableChart" could be generated if need be. 
     break; 
     } 

    $GoogleVisualizeColumnsAll .= 
     ", ". strval(($varIndex+1)*4+1).", ". 
     strval(($varIndex+1)*4+2).", ". 
     strval(($varIndex+1)*4+3).", ". 
     strval(($varIndex+1)*4+4); 

    $GoogleVisualizeColumnCount .= 
     ", ". strval(($varIndex+1)+4); 

    $GoogleVisualizeAvg .= 
     ", ". strval(($varIndex+1)*5+0); 

    $GoogleVisualizeColumnsMinStdevStdevMax .= 
     ", ". strval(($varIndex+1)*5+1). 
     ", ". strval(($varIndex+1)*5+2). 
     ", ". strval(($varIndex+1)*5+3). 
     ", ". strval(($varIndex+1)*5+4); 

    $GoogleVisualizeScattergram .= strval(($varIndex+1)*4+2).", "; 
     } 

    //echo "Tabletype: ". $DataCollectionArray['TableType'].chr(13)."<br>"."<br>"; 
    //echo "GoogleAddColumns: ". $GoogleAddColumns.chr(13)."<br>"."<br>"; 

     $GoogleVisualizeColumnsAll .=    "]);".chr(13); 
     $GoogleVisualizeColumnCount .=   "]);".chr(13); 
     $GoogleVisualizeAvg .=     "]);".chr(13); 
     $GoogleVisualizeColumnsMinStdevStdevMax.= "]);".chr(13); 
     $GoogleVisualizeScattergram = substr($GoogleVisualizeScattergram, 0, -2) . "]);".chr(13); 

    VerboseEcho($GoogleAddColumns. "<br><br><br>".$GoogleVisualizeColumnsAll); 


    //create dataset rows to be processed into google datatable 
    $DataForGoogleChart = $DataCollectionArray['GoogleDataRow']; 



    //echo "<br><font color='green'>DataForGoogleChart: $DataForGoogleChart</font><br>"; 


    $GoogleFormattedDataArray = array(
       'GoogleAddColumns' => $GoogleAddColumns, 
       'GoogleAddRows' => $DataCollectionArray['DataTableName'].'.addRows('.$DataCollectionArray['GoogleDataRow'].'); '.chr(13), 
       'GoogleVisualizeColumnCount' => $GoogleVisualizeColumnCount, 
       'GoogleVisualizeColumnsAvg' => $GoogleVisualizeAvg, 
       'GoogleVisualizeColumnsMinStdevStdevMax' => $GoogleVisualizeColumnsMinStdevStdevMax, 
       'MainCrosstabSelectQuery' => $DataCollectionArray['MainCrosstabSelectQuery']    
    ); 

    return $GoogleFormattedDataArray; 
    } 




    //----------------------------------------------------- 

    Function DataCollectionCrossTab($SensorString, $TableType, $TimeUnit, $NoAbscissaBins, $TimeStart, $DataTableName) //sensorstring: e.g. DigitalInput 2 
    { 
    $dbconn = pg_connect("host=10.10.10.8 port=5432 dbname=IpsLogging user=*** password=***") 
     or die ('connection aborted: ' . pg_last_error().chr(13)); 

    switch ($TableType) 
     { 
     case "boolean": 
      $IpsTable = "loggingdb_ips_boolean"; 
      $AggregateFunctions = "COUNT(*) As value "; 
      $SensorColumn = 2; 
      $WhereClause=" AND (log.ipsvalue = true) "; //only movement triggers 
     break; 
     case "integer": 
      $IpsTable = "loggingdb_ips_integer"; 
      $AggregateFunctions = "(AVG(ipsvalue)::NUMERIC(8,2)) 
            ||'', '' || 
            (MIN(ipsvalue)::NUMERIC(8,2)) 
            ||'', '' || 
            ((AVG(ipsvalue)::NUMERIC(8,2)) - (coalesce(STDDEV(ipsvalue), 0)::NUMERIC(8,2))) 
            ||'', '' || 
            ((AVG(ipsvalue)::NUMERIC(8,2)) + (coalesce(STDDEV(ipsvalue), 0)::NUMERIC(8,2))) 
            ||'', '' || 
            (MAX(ipsvalue)::NUMERIC(8,2)) 
            As value "; 
      $WhereClause=""; 
      $SensorColumn = 4; 
     break; 
     case "float": 
      $IpsTable = "loggingdb_ips_float"; 
      $AggregateFunctions = "(AVG(ipsvalue)::NUMERIC(8,2)) 
            ||'', '' || 
            (MIN(ipsvalue)::NUMERIC(8,2)) 
            ||'', '' || 
            ((AVG(ipsvalue)::NUMERIC(8,2)) - (coalesce(STDDEV(ipsvalue), 0)::NUMERIC(8,2))) 
            ||'', '' || 
            ((AVG(ipsvalue)::NUMERIC(8,2)) + (coalesce(STDDEV(ipsvalue), 0)::NUMERIC(8,2))) 
            ||'', '' || 
            (MAX(ipsvalue)::NUMERIC(8,2)) 
            As value "; 
      $SensorColumn = 4; 
      $WhereClause=""; 
     break; 
     case "string": 
      $IpsTable = "loggingdb_ips_string"; 
      $WhereClause=""; 
     break; 
     } 

    Switch ($TimeUnit) 
     {case "minutes": 
      $SelectRowNames = 
      "to_char(ipstimestamp, ''YYYYMMDDHH24MI'') As row_name, 
      to_char(ipstimestamp, ''FMHH24h:MI'') As labelled_row_name,  
      ''PlaceHolder1'' As PlaceHolder1, 
      ''PlaceHolder2'' As PlaceHolder2, 
      ''PlaceHolder3'' As PlaceHolder3,"; 
      $GroupOrder = " 
      GROUP BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category 
      ORDER BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category', "; 
     break; 

     case "hours": 
      $SelectRowNames = 
      "to_char(ipstimestamp, ''YYYYMMDDHH24'') As row_name, 
      to_char(ipstimestamp, ''FMDD mon FMHH24h'') As labelled_row_name, 
      ''PlaceHolder1'' As PlaceHolder1, 
      ''PlaceHolder2'' As PlaceHolder2, 
      ''PlaceHolder3'' As PlaceHolder3,"; 
      $GroupOrder = " 
      GROUP BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category 
      ORDER BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category', "; 
     break; 

     case "days": 
      $SelectRowNames = 
      "to_char(ipstimestamp, ''YYYYMMDD'') As row_name, 
      to_char(ipstimestamp, ''FMDD mon YYYY'') As labelled_row_name, 
      ''PlaceHolder1'' As PlaceHolder1, 
      ''PlaceHolder2'' As PlaceHolder2, 
      ''PlaceHolder3'' As PlaceHolder3,"; 
      $GroupOrder = " 
      GROUP BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category 
      ORDER BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category', "; 
     break; 

     case "weeks": 
      $SelectRowNames = 
      "to_char(ipstimestamp, ''YYYYWW'') As row_name, 
      ''wk'' || to_char(ipstimestamp, ''FMWW YYYY'') As labelled_row_name,  
      ''PlaceHolder1'' As PlaceHolder1, 
      ''PlaceHolder2'' As PlaceHolder2, 
      ''PlaceHolder3'' As PlaceHolder3,"; 
      $GroupOrder = " 
      GROUP BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category 
      ORDER BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category', "; 
     break; 

     case "months": 
      $SelectRowNames = 
      "to_char(ipstimestamp, ''YYYYMM'') As row_name, 
      to_char(ipstimestamp, ''mon YYYY'') As labelled_row_name, 
      ''PlaceHolder1'' As PlaceHolder1, 
      ''PlaceHolder2'' As PlaceHolder2, 
      ''PlaceHolder3'' As PlaceHolder3,"; 
      $GroupOrder = " 
      GROUP BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category 
      ORDER BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category', "; 
     break; 

     case "years": 
      $SelectRowNames = 
      "to_char(ipstimestamp, ''YYYY'') As row_name, 
      to_char(ipstimestamp, ''YYYY'') As labelled_row_name, 
      ''PlaceHolder1'' As PlaceHolder1, 
      ''PlaceHolder2'' As PlaceHolder2, 
      ''PlaceHolder3'' As PlaceHolder3,"; 
      $GroupOrder = " 
      GROUP BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category 
      ORDER BY row_name, labelled_row_name, PlaceHolder1, PlaceHolder2, PlaceHolder3, objectid, category', "; 
     break; 
     } 



    // echo "type ".$IpsTable." <br>"; 
    $SensorResult = GetSensorNames($SensorString, $TableType, "", "",0, 1); 
    // echo "SensorResult: ".$SensorResult.chr(13); 
    $CategoryString = implode(", ", pg_fetch_all_columns($SensorResult,$SensorColumn)); 
    $CategoryArray = pg_fetch_all_columns(GetSensorNames($SensorString, $TableType, "", "",0, 0),5); //array containing the name of each sensor 

    // echo "<strong>CategoryString: </strong>". $CategoryString.chr(13)."<br><br><br><br>"; 
    //Print_r ($CategoryArray); 


    //primary query (non-crosstabbed yet) 
    $PrimaryQuery ="'SELECT ". $SelectRowNames. 
      "varid As category, " 
      .$AggregateFunctions 
      ." FROM $IpsTable As log 
      JOIN ipsobjects_with_parent ips 
      ON log.varid = ips.objectid 
      WHERE (ips.objectname LIKE ''".$SensorString."'') " 
      . $WhereClause . "  
      AND (ipstimestamp > (now()- ''". $NoAbscissaBins . " " . $TimeUnit. "''::interval)) ". $GroupOrder ; 

    // echo "<strong>PrimaryQuery: $PrimaryQuery</strong>"; 

    //main crosstab query which pulls all the content data: 
    $MainCrosstabSelectQuery = 
     "SELECT * FROM crosstab 
        (" .$PrimaryQuery . 
     "'SELECT DISTINCT varid 
     FROM $IpsTable As log 
     JOIN ipsobjects_with_parent ips 
     ON log.varid = ips.objectid 
     WHERE (ips.objectname LIKE ''".$SensorString."'') 
     ORDER BY 1;' 
     ) 

    As CountsPerHour(row_name text, 
        label_row_name text, 
        PlaceHolder1 text, 
        PlaceHolder2 text, 
        PlaceHolder3 text, " 
        .$CategoryString.")"; 

    //echo "<br><font color='red'>$MainCrosstabSelectQuery</font><br>"; 

    $QueryResult=pg_query ($dbconn, $MainCrosstabSelectQuery); 
    $CrosstabArray = pg_fetch_all($QueryResult); 
    //echo "CrosstabArray: " . $CrosstabArray ; 
    //$table = good_query_table($CrosstabArray, $QueryResult, 0); 
    //BetterTable($QueryResult); //this functions outputs a nicely formatted crosstab! 

    if (!$QueryResult) 
      echo "PG Error: ". pg_last_error().chr(13); 

    // create bracketed Array of Arrays GoogleDataRow 
    $GoogleDataRow ="["; //opening bracket inserted 
    while ($field = pg_fetch_row($QueryResult)) 
    { 

    $GoogleDataRow .="["; 
    $index =0; 

    switch ($TableType) 
    { 
    case "boolean": 
    foreach ($field as $col_value) { 
      $index++; 
      if ($index<6) 
        //the first five columns are strings (date headers) 
        {$GoogleDataRow .= "'".$col_value."', ";} 
       else{ 
        //anythign above 5 is data 
        //substitute NULL with zeroes, else GoogleChart doesnt work 
        if($col_value == NULL) $col_value = "null"; 
        $GoogleDataRow .= $col_value.", "; 
        } 
       } 
    break; 

    case "integer": 
    foreach ($field as $col_value) { 
      ++$index; 
      if ($index<6) 
        {//the first give columns are strings (date headers) 
        $GoogleDataRow .= "'".$col_value."', ";} 
       else{ 
        //anythign above 5 is data 
        //substitute NULL with 5x zeroes, else GoogleChart doesnt work 
        if($col_value == NULL) $col_value = "null,null,null,null,null"; 
        $GoogleDataRow .= $col_value.", "; 
        } 
       } 
    break; 

    case "float": 
    foreach ($field as $col_value) { 
      ++$index; 
      if ($index<6) 
        {//the first give columns are strings (date headers) 
        $GoogleDataRow .= "'".$col_value."', ";} 
       else{ 
        //anythign above 5 is data 
        //substitute NULL with 5x zeroes, else GoogleChart doesnt work 
        if($col_value == NULL) $col_value = "null,null,null,null,null"; 
        $GoogleDataRow .= $col_value.", "; 
        } 
       } 
    break; 

    case "string": 
    foreach ($field as $col_value) { 
      ++$index; 
      if ($index<5) 
        //the first give columns are strings (date headers) 
        {$GoogleDataRow .= "'".$col_value."', ";} 
       else{ 
        //anythign above 5 is data 
        //substitute NULL with zeroes, else GoogleChart doesnt work 
        if($col_value == NULL) $col_value = 0; 
        $GoogleDataRow .= $col_value." "; 
        } 
       } 
    break; 
    } 

    $GoogleDataRow = substr($GoogleDataRow,0,-5)."], "; 

    //echo "<br><font color='blue'>$GoogleDataRow </font><br>"; 
    } 


    $GoogleDataRow = substr($GoogleDataRow,0,-2)."]"; 

    $DataCollectionArray = array(
         "GoogleDataRow"=>$GoogleDataRow, 
         "NumberOfColumns"=>pg_num_fields($QueryResult), // total number of columns, including all row headers 
         "CategoryArray"=>$CategoryArray, 
         "TableType"=>$TableType, 
         "DataTableName" => $DataTableName, 
         "MainCrosstabSelectQuery" => $MainCrosstabSelectQuery 
         ); 
    return $DataCollectionArray; 
    } 



    //--------------------------------------- 

    function BetterTable($result) 
    { 
    $i = 0; 
    echo "<html> 
      <body> 
      <table> 
      <table class='BetterTable' border='1'>"; 

    echo "<tr>"; 
    echo '<td>Line # 
    </td>'; 
    while ($i < pg_num_fields($result)) 
    { 
     $fieldName = pg_field_name($result, $i); 
     echo '<td>' . $fieldName . '</td>'; 
     $i = $i + 1; 
    } 
    echo '</tr>'; 
    $i = 0; 

    while ($field = pg_fetch_row($result)) 
    { 
      if ($i%2 == 0) 
       Echo "<tr bgcolor=\"#d0d0d0\" >"; 
      else 
       Echo "<tr bgcolor=\"#eeeeee\">"; 
     $fields = count($field); 
     $y = 0; 
     echo '<td>'.$i. '</td>'; 
     while ($y < $fields) 
     { 
      $c_row = current($field); 
      echo '<td>'.$c_row . '</td>'; 
      next($field); 
      $y = $y + 1; 
     } 
     echo '</tr>'; 
     $i = $i + 1; 
    } 


    echo '</table><br><br></body></html>'; 

    } 

    //---------------------------------------------------- 

    Function GetSensorNames($SensorType, $TableType, $prefix, $postfix, $QueryType, $column) 
    {//TableType specifies the type of variable, and redirectes to the correct table. 
    //prefix and postfix are adapters returned for each row 
    // 
    //retrieve full names of DataCollection variables, including parent names 
    //QueryColumns specifies which query columns (see below) 

    $dbconn = pg_connect("host=10.10.10.8 port=5432 dbname=IpsLogging user=*** password=***") 
     or die ('connection aborted: ' . pg_last_error().chr(13)); 


    switch ($TableType) 
     { 
     case "boolean": 
      $IpsTable = "loggingdb_ips_boolean"; 
     break; 
     case "integer": 
      $IpsTable = "loggingdb_ips_integer"; 
     break; 
     case "float": 
      $IpsTable = "loggingdb_ips_float"; 
     break; 
     case "string": 
      $IpsTable = "loggingdb_ips_string"; 
     break; 
     } 
    // echo "type ".$IpsTable." <br>"; 


    if ($prefix!="") $prefix = $prefix." || "; 
    if ($postfix!="")$postfix = " || ". $postfix; 

    $GetSensorNamesString = 
    "SELECT 
    DISTINCT '\"' || varid ||'\"' || ' integer ' as integername, 
    varid as NakedVariable, 
    '\"' || ips.parentname || ' - ' || ips.objectname || ' (' || ips.objectid || ')\"' || ' integer ' AS fullname, 
    '\"' || ips.parentname || ' - ' || ips.objectname || ' (' || ips.objectid || ')\"' || ' numeric(8,2) ' AS fullnamenumeric, 
    '\"' || ips.parentname || ' - ' || ips.objectname || ' (' || ips.objectid || ')\"' || ' text ' AS fullnamestring, 
    '\"' || ips.parentname || ' - ' || ips.objectname || ' (' || ips.objectid || ')\"' AS fullnamestring, 
    ips.parentname || ' - ' || ips.objectname || ' (' || ips.objectid || ')' || ' text ' AS fullnamestringwithoutquotes, 
    $prefix varid $postfix as DecoratedVariable 

    FROM $IpsTable As log 
    JOIN ipsobjects_with_parent ips 
    ON log.varid = ips.objectid 
    WHERE (ips.objectname LIKE '$SensorType') 
    ORDER BY 1; 
    "; 
    //echo "<strong>$GetSensorNamesString</strong>"; 

    $QueryResult=pg_query ($dbconn, $GetSensorNamesString); 
    if (!$QueryResult) 
      echo "PG Error: ". pg_last_error().chr(13); 
     else 
      {return $QueryResult;} 
    } 
    //----------------------------- 
    Function ColumnLabel($TimeUnit) 
    { 
    switch ($TimeUnit) 
    { 
    case "minutes": $ColumnLabel= "0"; break; 
    case "hours": $ColumnLabel= "1"; break; 
    case "days": $ColumnLabel= "2"; break; 
    case "months": $ColumnLabel= "3"; break; 
    case "years": $ColumnLabel= "4"; break;} 
    return($ColumnLabel); 
    } 
    //-------------------------------------------- 
    function VerboseEcho($Anything) 
     {global $Verbose; 
     if ($Verbose == true) Echo $Anything;} 
    ?> 

答えて

1

レンダリングするためのツールがあります。仮想ブラウザーでWebページを開き、スクリーンショットを撮ったり、Webページをイメージファイルとして書き出すことができます。最良のフォーマットは、チャート内の細部の可読性を低下させないためのPNGです。

私はここに似た記事を見ました:How to screenshot website in JavaScript client-side/how Google did it? (no need to access HDD)

関連する問題