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
主要代码
```javascriptfunction 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。