var myCharts;
//对应widget.js中MyWidget实例化后的对象
var thisWidget;
var tmpQueryParams;
//当前页面业务
function initWidgetView(_thisWidget) {
thisWidget = _thisWidget;
//开始查询历史数据
$("#startQueryHistory").click(function () {
queryEchartDataByTimePeriod();
});
}
function queryEchartDataByTimePeriod() {
if (myCharts) {
$('#echart').removeAttr('_echarts_instance_');
}
var backend_url = tmpQueryParams.nodejs_url_predix + "dataapi/Bdata?bid=get_" + tmpQueryParams.layerid + "_single_path&datatype=" + tmpQueryParams.datatype + "&siteid=" + tmpQueryParams.siteid + "&datatime1=" + tmpQueryParams.appDateHourStart + "&datatime2=" + tmpQueryParams.appDateHourEnd + "&count=10";
// all 1006xx layer has the same legend !!
console.log(tmpQueryParams)
echart_show(backend_url,tmpQueryParams)
}
function DatePicker(beginSelector, endSelector) {
var dateFormat = tmpQueryParams.datatype == 'day' ? 'yyyy-mm-dd' : 'yyyy-mm-dd hh:00:00';
var miniView = tmpQueryParams.datatype == 'day' ? 'month' : 'day';
$(beginSelector).datetimepicker({
bootcssVer: 3, //bootstrap-datetimepicker+bootstrap v3,但这个插件使用的时候,并没有和V3相匹配,仍然调用的是bootstrap V2的图标 把bootcssVer的值直接设为3,否则datetimepicker不会显示出上、下个月的箭头
format: dateFormat,
minView: miniView,
todayBtn: true, //如果此值为true 或 "linked",则在日期时间选择器组件的底部显示一个 "Today" 按钮用以选择当前日期。如果是true的话,"Today" 按钮仅仅将视图转到当天的日期,如果是"linked",当天日期将会被选中。
clearBtn: true,
language: 'zh-CN',
autoclose: true, //当选择一个日期之后是否立即关闭此日期时间选择器。
keyboardNavigation: true, //是否允许通过方向键改变日期。
forceParse: true, //当选择器关闭的时候,是否强制解析输入框中的值。
initialDate: new Date(),
todayHighlight: 1, //如果为true, 高亮当前日期
endDate: new Date()
}).on('changeDate', function (ev) {
if (ev.date) {
$(endSelector).datetimepicker('setStartDate', new Date(ev.date.valueOf()))
} else {
$(endSelector).datetimepicker('setStartDate', null);
}
console.log($(beginSelector).val())
tmpQueryParams.appDateHourStart = $(beginSelector).val();
})
$(endSelector).datetimepicker({
bootcssVer: 3, //bootstrap-datetimepicker+bootstrap v3,但这个插件使用的时候,并没有和V3相匹配,仍然调用的是bootstrap V2的图标 把bootcssVer的值直接设为3,否则datetimepicker不会显示出上、下个月的箭头
format: dateFormat,
minView: miniView,
todayBtn: true, //如果此值为true 或 "linked",则在日期时间选择器组件的底部显示一个 "Today" 按钮用以选择当前日期。如果是true的话,"Today" 按钮仅仅将视图转到当天的日期,如果是"linked",当天日期将会被选中。
clearBtn: true,
language: 'zh-CN',
autoclose: true, //当选择一个日期之后是否立即关闭此日期时间选择器。
keyboardNavigation: true, //是否允许通过方向键改变日期。
forceParse: true, //当选择器关闭的时候,是否强制解析输入框中的值。
initialDate: new Date(),
todayHighlight: 1, //如果为true, 高亮当前日期
endDate: new Date()
}).on('changeDate', function (ev) {
console.log($(endSelector).val())
tmpQueryParams.appDateHourEnd = $(endSelector).val();
})
}
function reloadData(params) {
tmpQueryParams = params;
DatePicker("#appDateHourStart", '#appDateHourEnd');
$("#appDateHourStart").datetimepicker("setDate", new Date(params.appDateHourStart));
$('#appDateHourEnd').datetimepicker('setDate', new Date(params.appDateHourEnd));
//loadLineChartbySiteid(params);
queryEchartDataByTimePeriod();
if (tmpQueryParams.layerid == 3001 || tmpQueryParams.layerid == 3002 || tmpQueryParams.layerid == 3003 || tmpQueryParams.layerid == 3000) {
loadDetailedInfobyGrid(params)
} else {
loadDetailedInfobySiteid(params);
}
}
function loadDetailedInfobySiteid(params) {
$("#indexTb").empty();
var backend_url = params.nodejs_url_predix + "dataapi/Bdata?bid=get_" + params.layerid + "_single&datatype=" + params.datatype + "&siteid=" + params.siteid + "&datatime=" + params.datatime;
$.ajax({
type: 'get',
dataType: 'json',
data: {},
async: false, //同步
url: backend_url,
success: function (data) {
var tableData = data.data.result;
if (tableData != null && tableData.length > 0) {
var topObj = tableData[0];
topObj = changeNullAndundefinedToEmpty(topObj);
var _tr = "
| 1 | 编码 | " + topObj.code + " | / |
"
$("#indexTb").append(_tr);
_tr = "| 2 | 名称 | " + topObj.name + " | / |
"
$("#indexTb").append(_tr);
_tr = "| 3 | 时间 | " + topObj.datatime + " | / |
"
$("#indexTb").append(_tr);
_tr = "| 4 | 经度 | " + topObj.lon + " | / |
"
$("#indexTb").append(_tr);
_tr = "| 5 | 纬度 | " + topObj.lat + " | / |
"
$("#indexTb").append(_tr);
var tmp_index = 6;
for (var p in topObj) { //遍历json对象的每个key/value对,p为key
if (p !== 'code' && p !== 'name' && p !== 'datatime' && p !== 'lon' && p !== 'lat') {
_tr = "| " + tmp_index + " | " + p + " | " + topObj[p] + " | " + getUnitByqindex(p) + " |
"
$("#indexTb").append(_tr);
tmp_index++;
}
};
$("#indexTb").find("td:contains(pm25)").text("PM₂.₅");
$("#indexTb").find("td:contains(pm10)").text("PM₁₀");
$("#indexTb").find("td:contains(no2)").text("NO₂");
$("#indexTb").find("td:contains(co)").text("CO");
$("#indexTb").find("td:contains(nox)").text("NOₓ");
$("#indexTb").find("td:contains(so2)").text("SO₂");
$("#indexTb").find("td:contains(o31)").text("O₃₁");
$("#indexTb").find("td:contains(o38)").text("O₃₈");
$("#indexTb").find("td:contains(o3)").text("O₃");
$("#indexTb").find("td:contains(no)").text("NO");
$("#indexTb").find("td:contains(aqi)").text("AQI");
$("#indexTb").find("td:contains(tsp)").text("TSP");
} else {
haoutil.msg("无查询记录,请更换查询条件!");
}
},
error: function (request, textStatus) {
haoutil.msg("查询错误,请联系管理员!!!")
}
});
}
function loadDetailedInfobyGrid(params) {
$("#indexTb").empty();
$("#headInfo").empty();
var backend_url = params.nodejs_url_predix + "dataapi/Bdata?bid=get_" + params.layerid + "_single&datatype=" + params.datatype + "&siteid=" + params.siteid + "&datatime=" + params.datatime;
$.ajax({
type: 'get',
dataType: 'json',
data: {},
async: false, //同步
url: backend_url,
success: function (data) {
var tableData = data.data.result;
tableData = data.data.result;
var _tr = ""
$("#indexTb").append(_tr);
if (tableData != null && tableData.length > 0) {
for (var i = 0; length = tableData.length, i < length; i++) {
var j = i + 1;
var topObj = tableData[i];
topObj = changeNullAndundefinedToEmpty(topObj);
var _tr = "| " + j + " | " + topObj.road_id + " | " + topObj.name + " | " + topObj.pm25 + " | " + topObj.pm10 + " | " + topObj.no + " | " + topObj.nox + " | " + topObj.no2 + " | " + topObj.co + " |
"
$("#indexTb").append(_tr);
}
} else {
haoutil.msg("查询无数据,请更换查询条件!");
}
},
error: function (request, textStatus) {
haoutil.msg("系统后台错误,请联系管理员处理!");
}
});
}
function getUnitByqindex(qindex) {
qindex = qindex.toUpperCase();
if (qindex == 'PM25' || qindex == 'PM10' || qindex == 'NO' || qindex == 'NO2' || qindex == 'NOX' || qindex == 'SO2' || qindex == "O31" || qindex == "O38" || qindex == "O3") {
return 'μg/m³';
} else if (qindex == 'CO' || qindex == "TSP") {
return 'mg/m³';
} else if(qindex == "SPEED"){
return 'km/h';
}else{
return '/';
}
}
function over(obj) {
$('#indexTb tr').removeClass("over_tr");
$(obj).addClass("over_tr");
}
function out(obj) {
$(obj).removeClass("over_tr");
}
function loadLineChartbySiteid(params) {
if (myCharts) {
$('#echart').removeAttr('_echarts_instance_');
}
var backend_url = params.nodejs_url_predix + "dataapi/Bdata?bid=get_" + params.layerid + "_history&datatype=" + params.datatype + "&siteid=" + params.siteid + "&datatime=" + params.datatime + "&count=10";
// all 1006xx layer has the same legend !!
echart_show(backend_url, params.datatype,params)
}
function shortenLegendTimeString(datatype, full_time_str) {
if (datatype == 'hour') {
return full_time_str.substring(8, 10) + '日' + "\n" + full_time_str.substring(11, 13) + '时';
} else if (datatype == 'day') {
return full_time_str.substring(8, 10) + '日';
} else {
return full_time_str;
}
}
function echart_show(backend_url,params) {
var layerid = params.layerid + "";
var legendData = all_layer_legends[layerid.substring(0, 4)];
var legendData_selected = {};
legendData.forEach(element => {
if (element == params.selected_qindex.toLowerCase()) {
legendData_selected[element] = true;
} else {
legendData_selected[element] = false;
}
});
if (legendData == null || legendData.length < 1) {
return;
}
var colorData = echart_lines_color_list[params.layerid];
var myItemStyle = {
normal: {
// 拐点上显示数值
label: {
show: true
},
borderColor: 'red', // 拐点边框颜色
lineStyle: {
width: 2, // 设置线宽
type: 'solid' //'dotted'虚线 'solid'实线
}
}
};
$.ajax({
type: 'get',
dataType: 'json',
data: {},
async: false, //同步
url: backend_url,
success: function (data) {
var tableData = data.data.result;
if (tableData != null && tableData.length > 0) {
var seriesObj = {};
var seriesData = [];
var timeLineData = [];
for (var i = 0; i < legendData.length; i++) {
var singleLegend = legendData[i];
var sdata = {};
sdata.name = singleLegend;
sdata.data = [];
sdata.type = 'line';
sdata.symbolSize = 8;
if (singleLegend.toUpperCase() == 'CO') {
sdata.yAxisIndex = 1;
}
sdata.itemStyle = myItemStyle;
seriesObj[singleLegend] = sdata;
}
for (var i = 0; i < tableData.length; i++) {
var indexObj = tableData[i];
timeLineData.push(shortenLegendTimeString(params.datatype, indexObj.datatime));
for (var j = 0; j < legendData.length; j++) {
var singleLegend = legendData[j];
var sdata = seriesObj[singleLegend];
sdata.data.push(indexObj[singleLegend])
}
}
for (var i = 0; i < legendData.length; i++) {
var singleLegend = legendData[i];
var mySeries = seriesObj[singleLegend];
seriesData.push(mySeries);
}
options = {
title: {
text: tableData[0]["name"],
textStyle: {
color: '#87CEFA', //颜色
},
top: '20px',
x: 'center'
},
dataZoom: [{
type: 'inside',
xAxisIndex: [0],
start: 0,
end: 100
}],
legend: {
// orient 设置布局方式,默认水平布局,可选值:'horizontal'(水平) ¦ 'vertical'(垂直)
orient: 'horizontal',
// x 设置水平安放位置,默认全图居中,可选值:'center' ¦ 'left' ¦ 'right' ¦ {number}(x坐标,单位px)
x: 'center',
// y 设置垂直安放位置,默认全图顶端,可选值:'top' ¦ 'bottom' ¦ 'center' ¦ {number}(y坐标,单位px)
y: 'top',
textStyle: { //图例文字的样式
color: '#87CEFA',
},
data: legendData,
selected: legendData_selected,
color: 'white'
},
// 图表距边框的距离,可选值:'百分比'¦ {number}(单位px)
grid: {
top: '20%', // 等价于 y: '16%'
left: '3%',
right: '5%',
bottom: '3%',
containLabel: true
},
// 提示框
tooltip: {
trigger: 'axis'
},
toolbox: {
feature: {
saveAsImage: {
type: 'jpeg'
},
dataView: {},
magicType: {
type: ['line', 'bar'],
option: {
// 类型切换时,下述配置项将被merge到对应类型的图表 series 中
line: {
smooth: true
},
bar: {
label: {
show: true
}
}
}
},
}
},
xAxis: {
name: '时间',
type: 'category',
// 设置X轴数据旋转倾斜
interval: 5, //设置X轴数据间隔几个显示一个,为0表示都显示
axisLabel: {
color: '#87CEFA', //坐标的字体颜色
},
// boundaryGap值为false的时候,折线第一个点在y轴上
boundaryGap: false,
data: timeLineData,
axisLine: {
symbol: ['none', 'arrow'], //箭头一端没效果,一端箭头
symbolOffset: [0, 8], //箭头段移动8个像素
lineStyle: {
// 设置x轴颜色
color: '#87CEFA'
}
}
},
yAxis: [{
name: '指标(μg/m³)',
type: 'value',
axisLine: {
lineStyle: {
// 设置y轴颜色
color: '#87CEFA',
symbol: ['none', 'arrow'], //箭头一端没效果,一端箭头
symbolOffset: [0, 8], //箭头段移动8个像素
}
},
splitLine: { //网格线
lineStyle: {
type: 'dashed', //设置网格线类型 dotted:虚线 solid:实线
color: ['rgba(255,255,255,0.3)']
},
show: true //隐藏或显示
},
}, {
name: 'CO(mg/m³)',
type: 'value',
axisLine: {
lineStyle: {
// 设置y轴颜色
color: '#8700FA',
symbol: ['none', 'arrow'], //箭头一端没效果,一端箭头
symbolOffset: [0, 8], //箭头段移动8个像素
}
},
splitLine: { //网格线
lineStyle: {
type: 'solid', //设置网格线类型 dotted:虚线 solid:实线
color: ['rgba(255,255,255,0.3)']
},
show: true //隐藏或显示
},
}],
series: seriesData,
color: colorData
};
// console.log(timeLineData);
// console.log(seriesData);
//转换角标
var newData = legendData;
for (var i = 0; i < newData.length; i++) {
if (newData[i] == "pm25") {
newData[i] = "PM₂.₅";
}
if (newData[i] == "pm10") {
newData[i] = "PM₁₀";
}
if (newData[i] == "no") {
newData[i] = "NO";
}
if (newData[i] == "nox") {
newData[i] = "NOₓ";
}
if (newData[i] == "no2") {
newData[i] = "NO₂";
}
if (newData[i] == "co") {
newData[i] = "CO";
}
if (newData[i] == "so2") {
newData[i] = "SO₂";
}
if (newData[i] == "o3") {
newData[i] = "O₃";
}
if (newData[i] == "o31") {
newData[i] = "O₃₁";
}
if (newData[i] == "o38") {
newData[i] = "O₃₈";
}
if (newData[i] == "aqi") {
newData[i] = "AQI";
}
if (newData[i] == "tsp") {
newData[i] = "TSP";
}
};
options.legend.data = newData;
options.series.forEach((item, index) => {
item.name = legendData[index]
});
//转换options下面selected里的角标
options.legend.selected['PM₂.₅'] = options.legend.selected['pm25'];
delete options.legend.selected['pm25'];
options.legend.selected['PM₁₀'] = options.legend.selected['pm10'];
delete options.legend.selected['pm10'];
options.legend.selected['NO'] = options.legend.selected['no'];
delete options.legend.selected['no'];
options.legend.selected['NOₓ'] = options.legend.selected['nox'];
delete options.legend.selected['nox'];
options.legend.selected['NO₂'] = options.legend.selected['no2'];
delete options.legend.selected['no2'];
options.legend.selected['CO'] = options.legend.selected['co'];
delete options.legend.selected['co'];
options.legend.selected['SO₂'] = options.legend.selected['so2'];
delete options.legend.selected['so2'];
options.legend.selected['O₃'] = options.legend.selected['o3'];
delete options.legend.selected['o3'];
options.legend.selected['O₃₁'] = options.legend.selected['o31'];
delete options.legend.selected['o31'];
options.legend.selected['O₃₈'] = options.legend.selected['o38'];
delete options.legend.selected['o38'];
options.legend.selected['AQI'] = options.legend.selected['aqi'];
delete options.legend.selected['aqi'];
options.legend.selected['TSP'] = options.legend.selected['tsp'];
delete options.legend.selected['tsp'];
myCharts = echarts.init(document.getElementById('echart'));
myCharts.setOption(options, true);
window.onresize = function () {
myCharts.resize();
};
// 还原角标
var RestoreData = newData;
for (var i = 0; i < RestoreData.length; i++) {
if (RestoreData[i] == "PM₂.₅") {
RestoreData[i] = "pm25";
}
if (RestoreData[i] == "PM₁₀") {
RestoreData[i] = "pm10";
}
if (RestoreData[i] == "NO") {
RestoreData[i] = "no";
}
if (RestoreData[i] == "NOₓ") {
RestoreData[i] = "nox";
}
if (RestoreData[i] == "NO₂") {
RestoreData[i] = "no2";
}
if (RestoreData[i] == "CO") {
RestoreData[i] = "co";
}
if (RestoreData[i] == "SO₂") {
RestoreData[i] = "so2";
}
if (RestoreData[i] == "O₃") {
RestoreData[i] = "o3";
}
if (RestoreData[i] == "O₃₁") {
RestoreData[i] = "o31";
}
if (RestoreData[i] == "O₃₈") {
RestoreData[i] = "o38";
}
if (RestoreData[i] == "AQI") {
RestoreData[i] = "aqi";
}
if (RestoreData[i] == "TSP") {
RestoreData[i] = "tsp";
}
};
options.legend.data = RestoreData;
options.series.forEach((item, index) => {
item.name = legendData[index]
});
} else {
haoutil.msg("无查询记录,请更换查询条件!");
}
},
error: function (request, textStatus) {
haoutil.msg("查询错误,请联系管理员!!!")
}
});
}