SuperMap iDesktopXiClient3D for WebGL 基于确定性空间插值生成水体流场

目录

  • 摘要
  • 1 原始数据解析
  • 2 数据空间插值
    • 2.1流场UVW0.dat文件转xlsx
    • 2.2生成流场点数据
    • 2.3生成U、V栅格数据
    • 2.4裁剪U、V栅格数据
    • 2.5生成零值棋盘网格
    • 2.6生成U、V棋盘栅格
  • 3 棋盘栅格转棋盘点
    • 3.1U、V棋盘栅格矢量化
    • 3.2U、V字段追加
    • 3.3流场数据JSON标准解析
      • 3.3.1流场数据JSON范例
      • 3.3.2参数说明
      • 3.3.3参数信息来源
  • 4 WebGL前端三维呈现

作者:xun

摘要

空间插值常用于将离散点的测量数据转换为连续的数据曲面,以便探究空 间现象的分布模式,按照数学原理来分,分成确定性插值和地统计插值(也可以叫非确定性)。
确定性插值是以研究区域内的相似性,或者以平滑度为基础,由已知样点来创建连续的栅格表面的插值方法。其中距离加权倒数(IDW)插值是较为常见的确定性插值方法,基于样点相近相似的原理,假设每个采样点都具有一定的局部影响能力,两个样点距离越近,则它们的性质越相似,反之,距离越远则相似性越小。它通过计算与到附近区域样点的加权平均值来估算出单元格的值。
每个流场点流速由坐标位置和U、V两个法线向量构成,非均匀分布流场点可按距离加权倒数(IDW)插值的方式分别对U和V进行插值,构建流场U栅格和V栅格,通过栅格矢量化提取每一个栅格格子的中心点,得到类似棋盘网格均匀分布的流场U值和V值点数据。最后,将均匀分布的流程点数据转为json格式可用于WebGL前端三维呈现。
在这里插入图片描述
在这里插入图片描述

1 原始数据解析

流场数据分两批次提供,第一批次为“日日算”Excel数据,第二批次为标准的*.data的流场数据。本文档阐述如何对*.data格式的流场数据处理为棋盘网格均匀分布的点数据。
在这里插入图片描述

原始数据由“体数据”、“原数据”、“坐标转换数据”三个文件夹构成,每个文件夹分别有一份UVW0.dat文件。
“原数据”、“坐标转换数据”文件夹里的UVW0.dat文件可以用记事本等工具打开。选择“原数据”里的UVW0.dat文件作为源数据。
在这里插入图片描述

单个UVW0.dat文件由两部分组成:
第一部分:流场点数据:Variables= “X” “Y” “ZB” “Z” “H” “U” “V” “C”
一行记录对应一个流场的点id,主要关注 “X” “Y” “U” “V” “C”;
一共有“N”条点数据,“Zone N= 47290 E= 91824”
第二部分:Tin数据:“F=FEPOINT ET=TRIANGLE ”,一行记录对应一个tin数据,每一列对应构成tin的三个顶点id;一共有“E”条Tin数据,“Zone N= 47290 E= 91824”。

2 数据空间插值

2.1流场UVW0.dat文件转xlsx

在wps新建xlsx文件,“数据-获取数据-导入数据-直接打开数据文件”选择“原数据”里的UVW0.dat文件,选择分隔符号,完成数据转换。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

由于流场数据只用到Variables= “X” “Y” “ZB” “Z” “H” “U” “V” "C"的数据,剔除第二行“Zone N= 47290 E= 91824 F=FEPOINT ET=TRIANGLE”。及第二部分:Tin数据记录。
在这里插入图片描述

最终的xlsx成果如下:
在这里插入图片描述

2.2生成流场点数据

在超图桌面端SuperMap iDesktopX中新建数据源,选择导入xlsx成果数据,选择“首行为字段信息”,“导入空间数据”,一键生成流场点数据。

在这里插入图片描述

在这里插入图片描述

2.3生成U、V栅格数据

在超图桌面端SuperMap iDesktopX中对选择“空间分析-插值分析-距离反比权重” 分别对流场点数据的U、V值进行插值,分别构建出U和V的流场栅格。
在这里插入图片描述
在这里插入图片描述 在这里插入图片描述

2.4裁剪U、V栅格数据

在超图桌面端SuperMap iDesktopX中导入流场的“范围面shp”数据,得到范围面数据集。
在这里插入图片描述

将2.3得到的U、V栅格数据、范围面数据添加到地图窗口。选择“地图-地图裁剪-选中对象区域裁剪”,裁剪后得到范围面的U、V栅格。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.5生成零值棋盘网格

超图桌面端SuperMap iDesktopX任意选择U或者V栅格数据集,通过复制数据集的方式,得到一份“棋盘网格”栅格数据。
在这里插入图片描述

选择“棋盘网格”栅格数据,“数据-数据处理-代数运算”
在这里插入图片描述
在这里插入图片描述

2.6生成U、V棋盘栅格

超图桌面端SuperMap iDesktopX中“数据-数据处理-栅格镶嵌”,将2.4裁剪生成的U、V栅格数据,分别与2.5生成的零值棋盘网格数据进行镶嵌,分别得到U值棋盘栅格和V值棋盘栅格。

在这里插入图片描述      在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3 棋盘栅格转棋盘点

3.1U、V棋盘栅格矢量化

超图桌面端SuperMap iDesktopX中“空间分析-矢栅转换-栅格矢量化”,将2.6生成的U、V棋盘网格进行栅格矢量化,得到U值棋盘点和V值棋盘点 。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.2U、V字段追加

超图桌面端SuperMap iDesktopX中,通过“数据-数据处理-追加列”功能,将V值棋盘点数据的V字段和值,追加到U值棋盘点中。

在这里插入图片描述
在这里插入图片描述

3.3流场数据JSON标准解析

3.3.1流场数据JSON范例

{“nx”:815,“ny”:704,“max”:1.6841634341693739,“extent”:[114.1492542,30.38561341,114.5745801,30.70384409],“data”:[[0,0],[0,0]…]}
在这里插入图片描述

3.3.2参数说明

名称含义
“nx”棋盘列
“ny”棋盘行
“max”最大流速值
“extent”四至信息,排序[W,S,E,N]
“data”棋盘格点[u,v]数组

3.3.3参数信息来源

1.获取2.5生成零值棋盘网格的栅格信息,记录列和行信息,作为nx和ny的值。
在这里插入图片描述

2.获取2.3生成的U、V栅格数据的Umax、Umin和Vmax、Vmin信息,可计算得到流速的最大值
在这里插入图片描述

3.将3.2得到的点数据进行投影转化为4490大地坐标,记录数据集的四至信息(E、S、W、N),作为"extent"[W,S,E,N]的来源。

在这里插入图片描述

4 WebGL前端三维呈现

所需产品包:supermap-iclient3d-for-webgl_webgpu-11.2.0 及以上版本。下载地址:supermap-iclient3d-for-webgl_webgpu-11.2.0下载链接
对应接口:FieldLayer3D场数据图层类
对应的参数介绍可查看该篇博客: FieldLayer3D场数据图层类接口介绍,可通过ParticleVelocityFieldEffect可修改场数据图层粒子效果渲染效果。
流场数据需要通过fieldLayer.particleVelocityFieldEffect._setDataBounds设置数据的范围,该范围就是流场json中extent的四至范围。
示例代码如下:

            let dataBounds = SuperMap3D.Rectangle.fromDegrees(118.60696, 31.933451, 118.780261, 32.150184); // dem50plet center = SuperMap3D.Rectangle.center(dataBounds);fieldLayer.particleVelocityFieldEffect._setDataBounds(dataBounds);

流场示例代码如下:产品包路径/examples/webglparticleWaterFlow.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"><meta name="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"><title>水场</title><link href="../../Build/SuperMap3D/Widgets/widgets.css" rel="stylesheet"><link href="./css/font-awesome.min.css" rel="stylesheet"><link href="./css/pretty.css" rel="stylesheet"><link href="./css/style.css" rel="stylesheet"><link href="./style/particleWaterFlow.css" rel="stylesheet"><script type="text/javascript" src="./js/jquery.min.js"></script><script src="./js/slider.js"></script><script src="./js/config.js"></script><script src="./js/tooltip.js"></script><script src="./js/spectrum.js"></script><script type="text/javascript" src="../../Build/SuperMap3D/SuperMap3D.js"></script>
</head><body><div id="Container"></div><div id='loadingbar' class="spinner"><div class="spinner-container container1"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container2"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div><div class="spinner-container container3"><div class="circle1"></div><div class="circle2"></div><div class="circle3"></div><div class="circle4"></div></div></div><div class="legend-toolbar"><p style="font-size: 1.3em;">水流速度</p><div id="color-legend"><div class="color-legend-label"> 2 </div><br /><div class="color-legend-label"> 1.5 </div><br /><div class="color-legend-label"> 1 </div><br /><div class="color-legend-label" style="margin-top:0.5em;"> 0.5 </div><br /><div class="color-legend-label" style="margin-top:0.5em;"> 0</div></div></div><script>function onload(SuperMap3D) {let EngineType = getEngineType();const viewer = new SuperMap3D.Viewer('Container', {contextOptions: {infobox: false,skyAtmosphere: true,contextType: Number(EngineType)  // Webgl2:2 ; WebGPU:3}});viewer.scenePromise.then(function (scene) {init(SuperMap3D, scene, viewer);});}function init(SuperMap3D, scene, viewer) {viewer.scene.skyBox.show = false;viewer.scene.sun.show = false;scene.globe.depthTestAgainstTerrain = false;scene.skyBox.show = false;scene.fog.enabled = false;viewer.imageryLayers.addImageryProvider(new SuperMap3D.BingMapsImageryProvider({key: URL_CONFIG.BING_MAP_KEY,//当场景出现黑球时可至官网(https://www.bingmapsportal.com/)申请keyurl: URL_CONFIG.BINGMAP}));//全球影像图层调节const imageryLayer = viewer.imageryLayers._layers[1];imageryLayer.brightness = 1.2imageryLayer.saturation = 0.6imageryLayer.contrast = 1.0let floor = 0.1;let ceil = 1.6841634341693739;let dx = (ceil - floor) / 5;const colorTable = new SuperMap3D.ColorTable();colorTable.insert(floor, new SuperMap3D.Color(255 / 255, 35 / 255, 35 / 255, 1.0));colorTable.insert(floor + dx, new SuperMap3D.Color(223 / 255, 202 / 255, 67 / 255, 1.0));colorTable.insert(floor + dx * 2, new SuperMap3D.Color(116 / 255, 205 / 255, 180 / 255, 1.0));colorTable.insert(floor + dx * 3, new SuperMap3D.Color(107 / 255, 159 / 255, 204 / 255, 1.0));colorTable.insert(floor + dx * 4, new SuperMap3D.Color(107 / 255, 143 / 255, 204 / 255, 1.0));const fieldLayer = new SuperMap3D.FieldLayer3D(scene.context); //场数据图层fieldLayer.particleVelocityFieldEffect.colorTable = colorTable;fieldLayer.particleVelocityFieldEffect.velocityScale = 0.1; //初始化效果fieldLayer.particleVelocityFieldEffect.particleSize = 4;fieldLayer.particleVelocityFieldEffect.paricleCountPerDegree = 500;let dataBounds = SuperMap3D.Rectangle.fromDegrees(118.60696, 31.933451, 118.780261, 32.150184); // dem50plet center = SuperMap3D.Rectangle.center(dataBounds);fieldLayer.particleVelocityFieldEffect._setDataBounds(dataBounds);scene.camera.setView({destination: SuperMap3D.Cartesian3.fromRadians(center.longitude, center.latitude, 10000),orientation: {heading: 6.28316380083,pitch: -1.5707876933496}});scene.primitives.add(fieldLayer); //添加场图层let particleWindField = [];let particleWindInverseField = [];//加载风场数据$.ajax({url: './data/grid-wind1.json',success: function (data) {let p = 0;for (let j = 0; j < data.ny; j++) {particleWindField[j] = [];particleWindInverseField[j] = [];for (let i = 0; i < data.nx; i++, p++) {particleWindField[j][i] = data.data[p];particleWindInverseField[j][i] = [-data.data[p][0], -data.data[p][1]];}}$('#loadingbar').remove();setTimeout(function () {fieldLayer.fieldData = particleWindField;}, 3000)}});}if (typeof SuperMap3D !== 'undefined') {window.startupCalled = true;onload(SuperMap3D);}</script>
</body></html>

效果展示

流场效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3281246.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法-索引堆及其优化

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、索引堆…

基于SpringBoot+Vue的档案管理系统(带1w+文档)

基于SpringBootVue的档案管理系统(带1w文档) 基于SpringBootVue的档案管理系统(带1w文档) 随着信息化的不断发展&#xff0c;科技的进步也越来越大。软件编程是一个不断发展的行业&#xff0c;每个行业都必须进行适合自身特点的系统开发&#xff0c;才能在机构中生存和发展。当…

区块链技术在智能城市中的创新应用探索

随着全球城市化进程的加速和信息技术的快速发展&#xff0c;智能城市成为了未来城市发展的重要方向。在智能城市建设中&#xff0c;区块链技术作为一种去中心化、安全和透明的分布式账本技术&#xff0c;正逐渐展现出其在优化城市管理、提升公共服务和增强城市安全性方面的潜力…

【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架

简介 Vanna是基于检索增强(RAG)的sql生成框架 Vanna 使用一种称为 LLM&#xff08;大型语言模型&#xff09;的生成式人工智能。简而言之&#xff0c;这些模型是在大量数据&#xff08;包括一堆在线可用的 SQL 查询&#xff09;上进行训练的&#xff0c;并通过预测响应提示中最…

JVM: 堆上的数据存储

文章目录 一、对象在堆中的内存布局1、对象在堆中的内存布局 - 标记字段2、JOL打印内存布局 二、元数据指针 一、对象在堆中的内存布局 对象在堆中的内存布局&#xff0c;指的是对象在堆中存放时的各个组成部分&#xff0c;主要分为以下几个部分&#xff1a; 1、对象在堆中的…

真没想到BitLocker加密的系统碰上CrowdStrike蓝屏故障也能恢复如初!

网管小贾 / sysadm.cc 三声金钟响&#xff0c;六阵御鼓催。 百官列两扉&#xff0c;天子临朝威。 是日早朝&#xff0c;八宝金殿之中&#xff0c;天子端坐龙椅上。 群臣山呼&#xff1a;“万岁&#xff0c;万岁&#xff0c;万万岁……&#xff01;” 天子面沉似水、不怒自威…

【数学建模】【优化算法】:【MATLAB】从【一维搜索】到】非线性方程】求解的综合解析

目录 第一章&#xff1a;一维搜索问题 黄金分割法 股票交易策略优化 总结&#xff1a; 第二章&#xff1a;线性规划 线性规划&#xff08;Simplex 算法&#xff09; 生产计划优化 总结&#xff1a; 第三章&#xff1a;无约束非线性优化问题 梯度下降法 神经网络训练…

elementUI 的el-date-picker日期,开始时间不能大于结束时间

需求描述:form表单里有开始日期和结束日期,要求开始日期不能大于结束日期,但是开始日期可以等于结束日期。 效果如下: 实现代码: <el-form ref="form" :model="form" :rules="rules" label-width="140px"><el-form-it…

Docker镜像拉取失败解决方案

文章目录 问题及分析解决方案1.先排查DNS2.修改源3.重启docker服务 问题解决 问题及分析 今天我用docker拉取镜像的时候报错 error pulling image configuration: download failed after attempts6: dial tcp xxx.xx.xxx.xx:xxx: i/o timeout 连接超时大概率以下两个问题 1.DN…

队列...

队列的定义 队列是一种操作受限的线性表,只允许表的一端在进行插入,而在表的另一端进行删除,其操作特征为先进先出. 队头:允许删除的一端 队尾:允许插入的一端 队列的基本操作 InitQueue(&Q) 初始化 isEmpty(Q) 判断空 EnQueue(&Q,x)入队 DeQueue(&Q,&…

基于北京市空气质量影响因素研究系统【城市可换爬虫获取、LSTM、Flask、Echarts、MySQL、TensorFlow】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主研究背景国内外研究现状研究目的研究意义关键技术理论介绍数据采集数据分析与大屏设计大屏相关性分析LSTM模型训练系统集成展示总结每文一语 有需要本项目的代码或文档以及全部资源&#xf…

【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…

Python面试宝典第23题:分发糖果

题目 n 个孩子站成一排&#xff0c;给你一个整数数组 ratings 表示每个孩子的评分。你需要按照以下要求&#xff0c;给这些孩子分发糖果。 &#xff08;1&#xff09;每个孩子至少分配到 1 个糖果。 &#xff08;2&#xff09;相邻两个孩子评分更高的孩子会获得更多的糖果。 请…

【linux上快速安装python】

linux上安装python 1.下载必须的编译工具【前置条件】2. 下载python源码3.解压3.1 配置环境变量3.2 SSL证书生成4.配置安装5.配置软连接6. 给pip配置软连接7.使用pip安装gbase8sdeploy8. pip安装pyinstaller9.遇到问题 1.下载必须的编译工具【前置条件】 sudo yum install gcc…

苦学Opencv的第十四天:人脸检测和人脸识别

Python OpenCV入门到精通学习日记&#xff1a;人脸检测和人脸识别 前言 经过了十三天的不懈努力&#xff0c;我们终于也是来到了人脸检测和人脸识别啦&#xff01;相信大家也很激动吧。接下来我们开始吧&#xff01; 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识…

一些数据结构面试题

常见时间复杂度代码 时间复杂度&#xff1a;执行时间和数据规模之间的增长关系 O(logn) while (i <n) {i i * 2; } O(n * logn)

丹摩智算:如何在云端开发一个AI应用——基于UNet的眼底血管分割案例

目录 0 写在前面1 云实例&#xff1a;配置选型与启动1.1 登录注册1.2 配置SSH密钥对1.3 创建实例1.4 登录云实例 2 云存储&#xff1a;数据集上传与下载3 云开发&#xff1a;眼底血管分割案例3.1 案例背景3.2 网络搭建3.3 网络训练3.4 模型测试 总结粉丝福利 0 写在前面 DAMOD…

PHP回收废品平台系统小程序源码

&#x1f30d;绿色行动&#xff0c;从“回收废品平台系统”开始&#xff01;&#x1f69a; &#x1f6aa;【家门口的环保站&#xff0c;废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已&#xff0c;不知该如何处理&#xff1f;现在&#xff0c;“…

Vue3 加载条(LoadingBar)

效果如下图&#xff1a;在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小&#xff0c;单位 pxnumber2falsecolorLoading加载中颜色string‘…

二进制部署k8s集群之cni网络插件flannel和calico工作原理

3、部署 CNI 网络组件 在 master01 节点上操作 上传flannel-v0.21.5.zip并解压 unzip flannel-v0.21.5.zipscp flannel*.tar 192.168.80.20:/opt/k8s/ scp flannel*.tar 192.168.80.30:/opt/k8s/ node两个节点操作 cd /opt/k8s/ docker load -i flannel.tar docker load -i …