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

news2024/9/17 9:00:16

目录

  • 摘要
  • 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); // dem50p
            let 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/)申请key
                url: URL_CONFIG.BINGMAP
            }));

            //全球影像图层调节
            const imageryLayer = viewer.imageryLayers._layers[1];
            imageryLayer.brightness = 1.2
            imageryLayer.saturation = 0.6
            imageryLayer.contrast = 1.0

            let 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); // dem50p
            let 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://www.coloradmin.cn/o/1962766.html

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

相关文章

Nacos配置到springboot快速入门(笔记)

本人学习中的简单笔记&#xff0c;本文写的极其不详细&#xff0c;慎看&#xff01;&#xff01;&#xff01; Nacos 简介 Nacos 致力于帮助开发者发现、配置和管理微服务。它提供了一组简单易用的特性集&#xff0c;帮助开发者快速实现动态服务发现、服务配置、服务元数据及…

【RL】强化学习入门:从基础到应用

本篇文章是博主强化学习RL领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章强化学习&#xff1a; 强化学习…

ECRS标准工时分析软件:中小企业数字化转型的工时管理利器

在当今全球化竞争日益激烈的背景下&#xff0c;中小企业面临着前所未有的挑战与机遇。为了在市场中脱颖而出&#xff0c;实现可持续发展&#xff0c;数字化转型已成为不可逆转的趋势。然而&#xff0c;对于资源相对有限的中小企业而言&#xff0c;如何高效、精准地管理工时&…

昇思25天学习打卡营第9天|RNN实现情感分类

第十天的不小心把第九天的覆盖了。现在重新补上。 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。输入一句话&#xff0c;然后去语义理解这句话是褒义贬义还是中性的。不同的情感语境下理解的大基调是不同的。 RRN情感分类也是一个分类模型&#xff0c;是…

【提问募集】向世界级软件开发大师“Bob 大叔”Robert C. Martin 提出你的疑虑!

函数式编程作为一种编程范式&#xff0c;其根源可以追溯到 20 世纪 30 年代&#xff0c;当时数学家们正在探索计算理论的基础。1936 年&#xff0c;阿隆佐丘奇提出了 λ 演算&#xff08;Lambda Calculus&#xff09;&#xff0c;这是一种形式系统&#xff0c;用于表达函数抽象…

【EI会议征稿通知】第五届大数据、人工智能与软件工程国际研讨会(ICBASE 2024)

重要信息 会议官网&#xff1a;www.icbase.org&#xff08;查看详情&#xff09; 中文主页&#xff1a;【往届会后3个月检索】第五届大数据、人工智能与软件工程国际研讨会&#xff08;ICBASE 2024&#xff09;_艾思科蓝_学术一站式服务平台 会议时间&#xff1a;2024年9月2…

【优秀python案例】基于Python的京东商城口红商品的爬虫与可视化的设计与实现

摘要&#xff1a;随着互联网的普及&#xff0c;网络购物已经成为了人们购物的首选&#xff0c;用户只需要在电商平台上进行自己喜欢的商品进行搜素&#xff0c;就可以得到成千上万条商品信息。而在购买商品时&#xff0c;商品价格就成为了用户的主要关注对象&#xff0c;而在一…

深入理解 go context

打个广告&#xff1a;欢迎关注我的微信公众号&#xff0c;在这里您将获取更全面、更新颖的文章&#xff01; 原文链接&#xff1a;深入理解 go context 欢迎点赞关注 context 介绍 context 是 Go 语言中用于处理并发操作的一个重要概念。context也被称作上下文&#xff0c;主要…

vue基础知识总结(2)--- axios的使用

一.下载Vue3&#xff1a; 选择自己想要下载的项目文件夹&#xff0c;cmd回车打开命令栏&#xff0c;执行 &#xff1a; cnpm init vuelatest 然后等待一会就可以创建一个项目&#xff0c;并更改项目名&#xff1a; √ 请输入项目名称&#xff1a; ... vue-project 之后按照…

python做简单爬虫的一些常用组件

文章目录 前言requestjsonbs4 前言 最近一直在做零散的一次性的爬虫工作&#xff0c;基本都是用python开发的&#xff0c;整理一下python做小规模爬虫开发常用的一些工具类 request python最简单的发http请求的包&#xff0c;request.get和request.post就可以搞定绝大部分的…

ECMA6Script学习笔记(五)

【摘要】 本文是对自己学习ES6的学习笔记回顾,后面是概要: 本文介绍了ES6中的对象创建和拷贝方法。对象创建方面&#xff0c;ES6通过class关键字支持了面向对象的语法糖&#xff0c;包括属性设置、getter和setter方法、构造器、静态方法以及私有属性的定义。同时&#xff0c;展…

Linux系统root账号密码破解(重置)

如果想不起root账号密码应该怎么做&#xff1f; 先关机再重新启动&#xff08;重启虚拟机&#xff09;做相关操作&#xff0c;开机时不能让服务器完全启动&#xff0c;需要把开机引导系统&#xff08;GRUB&#xff09;调出来 注&#xff1a;在实际生产环境中使用的Linux没有图…

四,系统规划

一&#xff0c;企业系统规划法BSP&#xff08;2009、2010、2018&#xff0c;步骤以及优缺点、用到的工具&#xff09; 企业系统规划法&#xff08;Business Systems Planning&#xff0c;BSP&#xff09;是IBM公司20世纪70年代提出的一种结构化的信息系统规划方法。该方法通过…

Spring Cloud微服务项目公共类抽取

在微服务架构中&#xff0c;代码的重用性和维护性是非常重要的。Spring Cloud 提供了丰富的工具和框架来帮助我们构建和管理微服务应用&#xff0c;但随着项目规模的扩大&#xff0c;我们会遇到大量的重复代码和相似的逻辑。在这种情况下&#xff0c;抽取公共类成为提高代码质量…

回归测试:保障软件质量的利器

目录 前言1. 回归测试的概念1.1 定义1.2 目标 2. 回归测试的主要作用2.1 确保系统稳定性2.2 提高软件质量2.3 节省维护成本 3. 回归测试在整个测试中的地位3.1 单元测试阶段3.2 集成测试阶段3.3 系统测试阶段3.4 验收测试阶段 4. 回归测试的主要工具4.1 Selenium4.2 JUnit4.3 J…

《Redis设计与实现》读书笔记-数据结构(SDS)

目录 SDS定义 SDS结构 SDS与C字符串结构差异 SDS优点 SDS扩容策略 SDS惰性空间回收 SDS定义 SDS&#xff08;简单动态字符串&#xff09;&#xff0c;用于代替C语言自身的字符串&#xff08;字符容量与字符数组强相关&#xff09;。 SDS结构 sdshdr{int free //sds 中…

预警系统最小例程构建

预警系统最小例程构建 引言 为了更直观, 我们使用最小例程来实现这个预警流程, 环境温湿度读取,然后判断阈值, 超标则触发小灯警报。 最小例程工程备份链接: https://ww0.lanzoul.com/iz4wd261k21i 仿真文件工程备份链接: https://ww0.lanzoul.com/i8vTn261syyb 文章目录…

Jeecgboot仪表盘设计器使用https时访问报错

问题 仪表盘设计器设计好后&#xff0c;Nginx配置域名发送https请求时&#xff0c;/drag/page/queryById、/drag/page/addVisitsNumber仍发送http请求。导致发送下面错误&#xff1a; 原因 仪表盘设计器里设计的页面是由后端生成返回给前端的&#xff0c;后端是根据后端服…

docker安装elasticsearch(es)最新版本

docker安装elasticsearch&#xff08;es&#xff09; docker官网 https://hub.docker.com/ https://www.cnblogs.com/balloon72/p/13177872.html 1、拉取最新项目elasticsearch docker pull elasticsearch:8.14.3lscpu 查看架构 2、构建环境 mkdir -p /data/elasticsear…

【TOOLS】Project 2 Maven Central

发布自己的项目到maven中央仓库 Maven Central Account 访问&#xff1a;https://central.sonatype.com/&#xff0c;点击右上角&#xff0c;根据提示注册账号 构建User token &#xff0c;用于访问中央仓库的API&#xff1a; 点击右上角&#xff0c;查看账户点击Generate Us…