谷歌可视化 - 第0行的行类型无效

3
我需要使用谷歌可视化来在饼图上呈现url json数据。我的代码似乎已经达到了目的,但是控制台出现了“无效行类型”的错误。数据格式有问题吗?如果有人能帮忙,将不胜感激。这是我的代码:
PHP:
<?php
    $json = file_get_contents('http://data.police.uk/api/crimes-street/all-crime?lat=52.629729&lng=-1.131592&date=2013-01'); 
    $json = str_replace("\xe2\x80\xa8", '\\u2028', $json);
    $json = str_replace("\xe2\x80\xa9", '\\u2029', $json);
    echo $json;
?>

JavaScript:

<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">

// Load the Visualization API and the piechart package.
google.load('visualization', '1', {'packages':['corechart']});

// Set a callback to run when the Google Visualization API is loaded.
google.setOnLoadCallback(drawChart);

function drawChart() {
  var jsonData = $.ajax({
      url: "getData.php",
      dataType:"json",
      async: false
      }).responseText;

  //Create an array of the JSON data and then create our data table out of JSON data loaded from server.
  var array = JSON.parse(jsonData);
  var dataTableData = new google.visualization.arrayToDataTable(array);
  var table = google.visualization.DataTable(dataTableData);

  var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
  chart.draw(data, {width: 400, height: 240});
}

</script>
</head>

<body>
<div id="chart_div"></div>
</body>

谢谢你。

1个回答

4
  1. JSON数据不能转换为一个二维数组,因此google.visualization.DataTable无法解释。每个项目都包含像locationoutcome_status这样的复杂子项。

  2. 必须包括列 - arrayToDataTable非常明确地要求如此

  3. 最重要的是:你如何想象这些数据呈现为饼图?只有一个特定的数字字段在第一级别,即location_subtype。你无法基于各种字符串生成饼图。

但是,你可以对数据进行清理并将其显示为google.visualization.Table

首先创建一个带有一些列的DataTable:

var dataTable = new google.visualization.DataTable();
dataTable.addColumn('string','category');
dataTable.addColumn('string','context');
dataTable.addColumn('string','id');
dataTable.addColumn('number','location_subtype');
dataTable.addColumn('string','location_type');
dataTable.addColumn('string','month');
dataTable.addColumn('string','persistent_id');

将您的jsonData转换为JSON格式

var json=JSON.parse(jsonData);

对数据进行清洗和插入。在这里,我只删除了locationoutcome_status子项,但您可能希望从这些子项中提取值,并将它们作为dataTable中的列插入:

for (var i=0;i<json.length;i++) {
   delete json[i].location;
   delete json[i].outcome_status;
   var row = [];        
   for (var item in json[i]) {
     row.push(json[i][item]);
   }        
   dataTable.addRow(row);
}

最后创建Table():
var chart = new google.visualization.Table(document.getElementById('chart_div'));
chart.draw(dataTable, {width: 1000, height: 300});

结果将如下所示:

输入图像描述


更新

var dataTable = new google.visualization.DataTable();
dataTable.addColumn('string','category');
dataTable.addColumn('string','context');
dataTable.addColumn('number','id');
dataTable.addColumn('string','location_subtype');
dataTable.addColumn('string','location_type');
dataTable.addColumn('string','month');
dataTable.addColumn('string','persistent_id');
dataTable.addColumn('string','street name');
dataTable.addColumn('string','outcome status');

json=JSON.parse(jsonData);

for (var i=0;i<json.length;i++) {
    var row = [];       
    row.push(json[i].category);
    row.push(json[i].context);
    row.push(json[i].id);
    row.push(json[i].location_subtype);
    row.push(json[i].location_type);
    row.push(json[i].month);
    row.push(json[i].persistent_id);
    row.push(json[i].location.street.name);
    row.push(json[i].outcome_status ? json[i].outcome_status.category : "null");
    dataTable.addRow(row);
}

非常感谢您的建议,绝对很有帮助!现在正在努力让饼图运作起来。再次感谢。 - Stelios Voskos
@AndreUk13,太棒了 :) 如果你从子项中取一些值,我认为你很容易制作出有意义的饼图。祝编程愉快! - davidkonrad
尝试解析嵌套在JSON中的数据(特别是location和outcome_status),并将它们输出在表格上,但没有成功。我不知道是否因为数据的格式对于Google可视化而言不好。实际上,我得到的行的大小与表格中的列数不同于2。 - Stelios Voskos
请注意更新,上述内容提供了以正确顺序列出的字段表格。 - davidkonrad
1
我让它运行了,但使用了2个循环。我会保留你的代码,因为它更加优化。再次感谢你。你在代码编辑器里也有一些好的示例。干杯 :) - Stelios Voskos
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接