覆盖主要内容
版本: 6.1.0

处理接口

根据时间轴的特性,如果您需要时间轴变化的同时,等值面的数据也发生变化,那么可以开发一个接口或者数据库,能根据时间参数来获取不同时间段的全国各个监测站点的数据。本文档为您介绍如何使用 Node.js 完成接口的开发和发布(您也可以使用其他的开发语言,原理相同)。

背景信息

推荐您将上一步已经处理完成的数据包装成一个简单的接口,并在 Uniplore 数据大屏地图组件的数据面板配置 API 数据源,调用此接口,来完成这个需求。 接口信息如下:

  • 请求地址:/api
  • 请求方式:GET
  • 请求参数:
    • 参数名称:date
    • 参数类型:string,示例2017012722,时间格式为YYYYmmDDHH。

操作步骤

  1. 安装Node.js(包括npm)并使用 npm install <module_name> ** **命令安装依赖模块。
  2. 处理下载的所有数据,Node.js 提供了一个 glob 模块可以对文件夹下的所有数据进行批量处理。
var fs = require('fs');
var csv = require("fast-csv");
var glob = require('glob');
var mapdata = require('./站点列表经纬度映射.json');
glob("./站点_20170101-20170202/*.csv", function (err, files) {
files.forEach(function (file) {
var filename = file.replace(/^.*[\\\/]/, '').split('.')[0].split('_')[2];
var datas = {};
csv
.fromPath(file, { headers: true, objectMode: true })
.on("data", function (data) {
if (data.type === 'AQI') {
datas[data.hour] = [];
for (var key in data) {
if (mapdata[key]) {
datas[data.hour].push({
name: mapdata[key].name,
value: +data[key],
code: mapdata[key].code,
city: mapdata[key].city,
lng: +mapdata[key].lng,
lat: +mapdata[key].lat
})
}
}
}
})
.on("end", function () {
fs.writeFile('./data/' + filename + '.json', JSON.stringify(datas));
console.log("done");
});
});
});

运行结果如下。

image.png

  1. 使用 glob 模块对数据进行一次整合。将如下示例程序保存为 js 脚本文件,并在 Node.js 环境中运行。
// 以下方式不适用大批量的数据。
// 将文件名也就是日期作为key,对应的内容作为值,得到一个all.json整合文件。
var fs = require('fs');
var glob = require('glob');
glob("./data/*.json", function (err, files) {
var datas = {};
files.forEach(function (file) {
var filename = file.replace(/^.*[\\\/]/, '').split('.')[0];
datas[filename] = require(file);
});
fs.writeFile('./data/all.json', JSON.stringify(datas), (err) => {
if (err) throw err;
console.log('done');
});
});
  1. 在 Node.js 环境下,使用 Node.js 的 express 脚手架 (express-generator) 初始化一个 express 项目,并按照上面的接口需求增加一个简单的接口,示例程序如下所示。
信息

说明 具体如何初始化一个 express 项目,请参见:使用 node.js 的 express 构建接口。您需要将前一步生成的 all.json 也复制到项目中来(如下图中的位置)

image.png

router.get('/api', (req, res, next) => {
var datetime = req.query.date;
if (datetime) {
var date = datetime.slice(0, datetime.length - 2);
var hour = datetime.slice(datetime - 2);
if (datas[date] && datas[date][+hour]) {
/* 过滤 值为0 或 没有坐标信息的数据,并只返回地图组件需要的部分数据 */
var temp = datas[date][+hour].filter((d)=>{
return d.value !== 0 && d.lat !== 0;
});
res.json(temp.map(item => { // 只取需要的字段
return {
value: item.value,
lng: item.lng,
lat: item.lat
}
}));
} else {
res.json({
status: 1,
message: '未查询到数据'
});
}
} else {
res.json({
status: 2,
message: '未填写参数'
});
}
})

**

信息

说明 为了避免跨域请求的问题,您可以在 app.js 文件中增加 cors 模块。

** image.png

  1. 接口处理完成后,在 Node.js 环境下使用 npm start ** **命令测试接口,测试成功的截图如下所示。

image.png