"use script";
//对应widget.js中MyWidget实例化后的对象
var thisWidget
var current_heatmap_alpha_value = 0.5;
var current_heatmap_qindex = "pm25";
//var grid_level_list = [{ layer: null, level: 5000, min: 8, max: 10, data: [], image: "", show: false }, { layer: null, level: 3000, min: 11, max: 12, data: [], image: "", show: false }, { layer: null, level: 1000, min: 13, max: 19, data: [], image: "", show: false }];
var grid_level_list = [{ layer: null, level: 3000, min: 8, max: 15, data: [], image: "", show: false }];
// 子进程方法
function loadkriging() {
onmessage = ({ data: { processId,gridConfig, qindex, kriging, bounds, map_extent } }) => {
console.log('收到主线程消息:' + gridConfig);
canvas.width = 2000;
canvas.height = 2000;
var t = [];
var x = [];
var y = [];
for (var i = 0, len = gridConfig.data.length; i < len; i++) {
t.push(gridConfig.data[i][qindex]); // 权重值
var tmp_grid_id = gridConfig.data[i]["grid_id"];
var lon_lat = tmp_grid_id.split("_");
if (gridConfig.level == 5000) {
x.push(Number(lon_lat[0]) + 0.025); // x
y.push(Number(lon_lat[1]) + 0.025); // y
} else if (gridConfig.level == 3000) {
x.push(Number(lon_lat[0]) + 0.0125); // x
y.push(Number(lon_lat[1]) + 0.0125); // y
} else if (gridConfig.level == 1000) {
x.push(Number(lon_lat[0]) + 0.005); // x
y.push(Number(lon_lat[1]) + 0.005); // y
}
}
//1.用克里金训练一个variogram对象
var variogram = kriging.train(t, x, y, "exponential", 0, 100);
//2.使用刚才的variogram对象使polygons描述的地理位置内的格网元素具备不一样的预测值;
//bounds:普通的geojson格式的面的格式的coordinates。
var grid = kriging.grid(bounds, variogram, (map_extent.maxx - map_extent.minx) / 500);
//3.将得到的格网预测值渲染到canvas画布上
//kriging.plot(canvas, grid, [map_extent.minx, map_extent.maxx], [map_extent.miny, map_extent.maxy], colors);
//var image = canvas.toDataURL("image/png");
postMessage({processId,result:grid });
};
}
const makeWorker = (func) => {
let pendingProcesss = {};
if (!window.Worker) {//浏览器不支持worker子线程的情况
alert('浏览器不支持worker子线程');
return;
}
//创建新的Worker
const worker = new Worker(
URL.createObjectURL(new Blob([`(${func.toString()})()`]))
);
//接收消息
worker.onmessage = ({ data: { result, processId } }) => {
// 调用resolve,改变Promise状态
pendingProcesss[processId](result);
// 删掉,防止进程id冲突
delete pendingProcesss[processId];
// 关闭worker线程
worker.terminate();
}
//异常处理
worker.onerror = function (err) { }
return (...message) => new Promise(resolve => {
const processId = String(Math.random())//new Date().getTime()
pendingProcesss[processId] = resolve;
//传递参数
worker.postMessage({ processId, message });
})
}
const testWorker = makeWorker(loadkriging);
console.log('主线程正常运行:1')
//当前页面业务
function initWidgetView(_thisWidget) {
thisWidget = _thisWidget;
$("#grid5000").click(function () {
thisWidget.changeCamerView("grid5000");
});
$("#grid3000").click(function () {
thisWidget.changeCamerView("grid3000");
});
$("#grid1000").click(function () {
thisWidget.changeCamerView("grid1000");
});
thisWidget.style_options.forEach(element => {
$("#style_radio").append('')
$("#style_radio2").append('')
});
$('input[type=radio][name=style_option]').change(function () {
thisWidget.update_grid_style(this.value);
});
$('input[type=radio][name=style_option2]').change(function () {
current_heatmap_qindex = this.value;
grid_level_list.forEach(grid_item => {
/*
testWorker(grid_item, current_heatmap_alpha_value, kriging, kriging_bounds, map_extent ).then((grid) => {
var canvas = document.createElement("canvas");
kriging.plot(canvas, grid, [map_extent.minx, map_extent.maxx], [map_extent.miny, map_extent.maxy], kriging_colors);
grid_item.image = canvas.toDataURL("image/png");
addImageToMap(grid_item);
});
*/
grid_item.image = createKrigingImage(grid_item, kriging_bounds, kriging_colors); //kriging_bounds, kriging_colors在kriging_config.js中定义
addImageToMap(grid_item);
});
});
$("#gridmap_opcity")
.slider({ min: 0.1, max: 1, step: 0.1, value: 1 })
.on("change", (e) => {
thisWidget.setGridmapAlpha(e.value.newValue);
});
$("#heatmap_opcity")
.slider({ min: 0.1, max: 1, step: 0.1, value: 0.5 })
.on("change", (e) => {
current_heatmap_alpha_value = e.value.newValue;
thisWidget.setHeatmapAlpha(e.value.newValue);
});
$("#show_gridmap").change(function () {
console.log(this.checked);
if (this.checked) {
thisWidget.showGridmapLayers();
} else {
thisWidget.hideGridmapLayers();
}
});
$("#show_heatmap").change(function () {
if (this.checked) {
if (grid_level_list[0].layer != null) {
thisWidget.showHeatmapLayers();
} else {
grid_level_list.forEach(grid_item => { grid_item.show = true; });
}
} else {
thisWidget.hideHeatmapLayers();
}
});
initHeatMapLayers();
}
function initHeatMapLayers() {
grid_level_list.forEach(grid_item => {
queryGridHeatmapData(grid_item).then(function () {
/*
testWorker(grid_item, current_heatmap_alpha_value, kriging, kriging_bounds, map_extent ).then((grid) => {
var canvas = document.createElement("canvas");
kriging.plot(canvas, grid, [map_extent.minx, map_extent.maxx], [map_extent.miny, map_extent.maxy], kriging_colors);
grid_item.image = canvas.toDataURL("image/png");
addImageToMap(grid_item);
});
*/
grid_item.image = createKrigingImage(grid_item, kriging_bounds, kriging_colors); //kriging_bounds, kriging_colors在kriging_config.js中定义
addImageToMap(grid_item);
});
});
}
function addImageToMap(grid_item) {
if (grid_item.layer == null) {
grid_item.layer = new mars3d.layer.ImageLayer({
url: grid_item.image,
rectangle: {
xmin: map_extent.minx,
xmax: map_extent.maxx,
ymin: map_extent.miny,
ymax: map_extent.maxy,
},
minimumLevel: grid_item.min,
minimumTerrainLevel: grid_item.min,
maximumLevel: grid_item.max,
maximumTerrainLevel: grid_item.max,
alpha: current_heatmap_alpha_value,
show: grid_item.show
});
thisWidget.heatmapGroupLayer.addLayer(grid_item.layer);
} else {
grid_item.layer.options.url = grid_item.image;
grid_item.layer.setOptions(grid_item.layer.options);
}
}
//数据获取
function queryGridHeatmapData(grid_item) {
return new Promise(function (resolve, reject) {
$.ajax({
url: thisWidget.nodejs_url_predix + "dataapi/Bdata?bid=get_grid_heatmap&gridlevel=" + grid_item.level + "&datatype=" + thisWidget.datatype + "&datatime=" + thisWidget.datatime,
type: "get",
dataType: "json",
success: function (result) {
if (result.data?.result != undefined && result.data?.result?.length > 0) {
grid_item.data = result.data.result;
}
resolve(result.data.result);
},
error: function (data) {
haoutil.msg("后台错误,请联系系统管理员。");
},
});
});
}
//根据 克里金法 插值绘制图片
function createKrigingImage(gridConfig, bounds, colors) {
var canvas = document.createElement("canvas");
canvas.width = 2000;
canvas.height = 2000;
var t = [];
var x = [];
var y = [];
console.log("开始:"+(new Date()).toISOString());
for (var i = 0, len = gridConfig.data.length; i < len; i++) {
t.push(gridConfig.data[i][current_heatmap_qindex]); // 权重值
var tmp_grid_id = gridConfig.data[i]["grid_id"];
var lon_lat = tmp_grid_id.split("_");
if (gridConfig.level == 5000) {
x.push(Number(lon_lat[0]) + 0.025); // x
y.push(Number(lon_lat[1]) + 0.025); // y
} else if (gridConfig.level == 3000) {
x.push(Number(lon_lat[0]) + 0.0125); // x
y.push(Number(lon_lat[1]) + 0.0125); // y
} else if (gridConfig.level == 1000) {
x.push(Number(lon_lat[0]) + 0.005); // x
y.push(Number(lon_lat[1]) + 0.005); // y
}
}
console.log("数据构造完成:"+(new Date()).toISOString());
//1.用克里金训练一个variogram对象
var variogram = kriging.train(t, x, y, "exponential", 0, 100);
console.log("variogram对象完成:"+(new Date()).toISOString());
//2.使用刚才的variogram对象使polygons描述的地理位置内的格网元素具备不一样的预测值;
//bounds:普通的geojson格式的面的格式的coordinates。
var grid = kriging.grid(bounds, variogram, (map_extent.maxx - map_extent.minx) / 500);
//3.将得到的格网预测值渲染到canvas画布上
console.log("grid完成:"+(new Date()).toISOString());
kriging.plot(canvas, grid, [map_extent.minx, map_extent.maxx], [map_extent.miny, map_extent.maxy], colors);
console.log("cavas绘制完成"+(new Date()).toISOString());
var image = canvas.toDataURL("image/png");
console.log("image转换完成:"+(new Date()).toISOString());
return image;
}