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。

在Vue3中结合cesium.js来创建卫星绕地球运转的效果是一个常见的WebGL实践。cesium.js是一个强大的开源库,专用于三维地理空间可视化,而Vue3则提供了声明式的编程模型来构建用户界面。 首先,你需要安装Vue3和cesium相关的依赖项,比如`@vue/cesium`库,它封装了cesium的一些核心功能使其更适合于Vue组件化开发。以下是一个简化的步骤: 1. **设置项目**: - 使用Vue CLI创建一个新的Vue3项目。 - 安装所需的依赖:`npm install vue @vue/cli-plugin-vuex @vue/cesium` 2. **创建组件**: - 创建一个名为`Satellite.vue`的新组件,这里会包含地球、太阳和卫星模型。 ```html <template> <cesium-scene ref="cesiumScene"> <!-- 地球和其他元素将在这里添加 --> </cesium-scene> </template> <script> import { CesiumWidget } from '@vue/cesium'; export default { components: { CesiumWidget, }, data() { return { satellitePosition: [0, 0, 0], // 初始卫星位置 }; }, mounted() { // 初始化cesium场景并加载地球等资源 }, methods: { updateSatellitePosition(newPos) { this.satellitePosition = newPos; // 更新卫星位置 }, }, }; </script> ``` 3. **初始化场景**: 在`mounted`生命周期钩子里,你可以初始化cesium场景,加载地球(Cesium的`Ellipsoid`对象)、太阳(`Sun`对象),然后创建一个`Entity`来表示卫星,并将其放置在地球周围。 4. **模拟运动**: 你可以使用定时器或`requestAnimationFrame`来定期更新卫星的位置,让它按照某种轨迹围绕地球旋转。这通常需要使用`Cartesian3`对象来操作三维坐标。 ```javascript mounted() { // 初始化... const earth = ...; // 获取地球实例 const satellite = new Cesium.Entity({ position: Cesium.Cartesian3.fromDegrees(...), // 初始卫星位置 model: { uri: 'path/to/satellite.glb', // 卫星模型路径 }, }); // 每秒旋转一次卫星 setInterval(() => { const rotation = Cesium.Math.toRadians(1); // 角度变化量 const newPosition = Cesium.Ellipsoid.WGS84.cartesianToGeodetic( earth.geodeticSurfaceNormal(this.satellitePosition) ); this.updateSatellitePosition(Cesium.Ellipsoid.WGS84.geodeticToCartesian( newPosition.x, newPosition.y, newPosition.z, earth )); }, 1000); }, ```
评论 52
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值