0.前言
网上有很多关于openlayers的克里金插值,但是最近在学习cesium,也想在cesium中做,但是好像网上相关的例子一个都没有。所以我就自己尝试去做。
1.克里金插值
克里金插值也称作空间局部插值法,或空间自协方差最佳插值法,它以变异函数理论和结构分析为基础, 在特定区域内对区域化变量进行无偏最优估计,被广泛应用于土壤制图领域,是一种非常重要的地统计学方法。
主要是用来预测一些地理相关的插值方法。
2.kriging.js
克里金插值算法有开源的实现,项目的GitHub地址kriging.js
kriging.train(t, x, y, model, sigma2, alpha):使用gaussian、exponential或spherical模型对数据集进行训练,返回的是一个variogram对象;
kriging.grid(polygons,variogram,width);使用刚才的variogram对象使polygons描述的地理位置内的格网元素具备不一样的预测值;
kriging.plot(canvas,grid,xlim,ylim,colors);将得到的格网grid渲染至canvas上。
3.cesium实现
大家都知道cesium可以通过贴图的方式在entity上贴上image,canvas等。
所以我们可以将插值后的canvas结果贴在实体上。
可以参考ImageMaterialProperty
主要代码
```javascript
function drawKriging(lats, lngs, values, coords, ex) {
if (values.length > 3) {
let colors = ["#006837", "#1a9850", "#66bd63", "#a6d96a", "#d9ef8b", "#ffffbf",
"#fee08b", "#fdae61", "#f46d43", "#d73027", "#a50026"];
const polygon = new Cesium.PolygonGeometry ( {
polygonHierarchy: new Cesium.PolygonHierarchy (
Cesium.Cartesian3.fromDegreesArray ( coords )
)
} );//构造面,方便计算范围
let extent = Cesium.PolygonGeometry.computeRectangle ( {
polygonHierarchy: new Cesium.PolygonHierarchy (
Cesium.Cartesian3.fromDegreesArray ( coords )
)
} );//范围(弧度)
let minx = Cesium.Math.toDegrees ( extent.west );//转换为经纬度
let miny = Cesium.Math.toDegrees ( extent.south );
let maxx = Cesium.Math.toDegrees ( extent.east );
let maxy = Cesium.Math.toDegrees ( extent.north );
let canvas = null;//画布
function getCanvas() {
//1.用克里金训练一个variogram对象
let variogram = kriging.train ( values, lngs, lats, 'exponential', 0, 100 );
//2.使用刚才的variogram对象使polygons描述的地理位置内的格网元素具备不一样的预测值;
let grid = kriging.grid ( ex, variogram, (maxy - miny) / 500 );
canvas = document.createElement ( 'canvas' );
canvas.width = 800;
canvas.height = 800;
canvas.style.display = 'block';
canvas.getContext ( '2d' ).globalAlpha = 0.75;//设置透明度
//3.将得到的格网预测值渲染到canvas画布上
kriging.plot ( canvas, grid, [minx, maxx], [miny, maxy], colors );
}
getCanvas ();
if (canvas != null) {
viewer.entities.add ( {
polygon: {
hierarchy: {
positions: Cesium.Cartesian3.fromDegreesArray ( coords )
},
material: new Cesium.ImageMaterialProperty ( {
image: canvas//使用贴图的方式将结果贴到面上
} )
}
} );
}
}
}
参数格式:
lons:经度数组
lats:纬度数组
values:已知的值数组
coords是一个cesium的数据格式,[114,25,114,23,114,22],不用闭合,就一个面上所有点。
ex,普通的geojson格式的面的格式的coordinates。