Cesium+kriging.js实现雨量插值

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。

发布了6 篇原创文章 · 获赞 3 · 访问量 1318
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览