说明

因为公司业务需求,要在web前端做一个水流分析的功能。但是提供的数据并不像风场数据一样,带有方向和速度信息。只有坐标点和高程。所以简单做了一个根据点的流向分析动画,里边没有用什么很复杂的算法,所以效果不是很好,但希望能给读者带来一点功能实现上的思路。对于流水路径的计算,肯定有更好的方法,这里只做简单示例。

先上功能实现图:

数据阶段

因为本功能所用的只是带高程的点的合集,所以要对点进行分析

首先从提供的excel表中读取数据,也可能数据来源于其他文件,但最终得到的数据格式相同。

得到点的集合如下图所示:

经过高程点坐标转换与拼接,坐标系转换可参考Proj4js转换坐标的方法,这里暂不展开讲解。

最后经过数组的抽稀与拼接获得高程点集合:

后面我用了一个笨办法,其实并不好,如果路过的大佬有更好的算法请踢我一下,我要学习。

            let direction = [];allPoint.forEach((itema) => {let arr = [];allPoint.forEach((itemb) => {if (itema.value > itemb.value) {arr.push([itemb.lon, itemb.lat]);}});if (arr.length !== 0) {let targetPoint = turf.point([itema.lon, itema.lat]);let computearr = [];arr.forEach((item) => {computearr.push(turf.point(item));});let points = turf.featureCollection(computearr);let nearest = turf.nearestPoint(targetPoint, points);direction.push([[itema.lon, itema.lat], nearest.geometry.coordinates]);}});

作为测试用,上边方法并不推荐,可以优化筛选,比如添加距离限制等。大体思路就是,遍历数组中所有的点,找到离当前点最近且比当前点高程低的点,两个点拼接成一个数组对。

最后得到如下数组对:

流线生成

利用之前筛选出的数组对,做一个流线动画,大体思路就是,一个数组对刚好连成线,从高处往低处流。

流线动画代码参考示例如下:

要定义轨迹动态线的着色器,该部分代码可以加到创建cesium地图方法里,哪儿都可以,只要能把这个材质定义上就行。

// 定义线的轨迹动态线纹理-->function PolylineTrailLinkMaterialProperty(color, duration) {this._definitionChanged = new Cesium.Event();this._color = undefined;this._colorSubscription = undefined;this.color = color;this.duration = duration;this._time = new Date().getTime();}Object.defineProperties(PolylineTrailLinkMaterialProperty.prototype, {isConstant: {get: function () {return false;},},definitionChanged: {get: function () {return this._definitionChanged;},},color: Cesium.createPropertyDescriptor('color'),});PolylineTrailLinkMaterialProperty.prototype.getType = function (time) {return 'PolylineTrailLink';};PolylineTrailLinkMaterialProperty.prototype.getValue = function (time, result) {if (!Cesium.defined(result)) {result = {};}result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.WHITE, result.color);result.image = Cesium.Material.PolylineTrailLinkImage;result.time = ((new Date().getTime() - this._time) % this.duration) / this.duration;return result;};PolylineTrailLinkMaterialProperty.prototype.equals = function (other) {return this === other || (other instanceof PolylineTrailLinkMaterialProperty && Property.equals(this._color, other._color));};// 在Material上挂载相关的流动线纹理 可以根据自己的需要进行封装Cesium.PolylineTrailLinkMaterialProperty = PolylineTrailLinkMaterialProperty;Cesium.Material.PolylineTrailLinkType = 'PolylineTrailLink';Cesium.Material.PolylineTrailLinkImage = './images/line.png';// 定义着色器源码 核心部分Cesium.Material.PolylineTrailLinkSource ='czm_material czm_getMaterial(czm_materialInput materialInput)\n\{\n\czm_material material = czm_getDefaultMaterial(materialInput);\n\vec2 st = materialInput.st;\n\vec4 colorImage = texture2D(image, vec2(fract(st.s - time), st.t));\n\material.alpha = colorImage.a;\n\material.diffuse = colorImage.rgb;\n\return material;\n\}';Cesium.Material._materialCache.addMaterial(Cesium.Material.PolylineTrailLinkType, {fabric: {type: Cesium.Material.PolylineTrailLinkType,uniforms: {color: new Cesium.Color(0.0, 0.0, 1.0, 0.5),image: Cesium.Material.PolylineTrailLinkImage,time: 0,},source: Cesium.Material.PolylineTrailLinkSource,},translucent: function (material) {return true;},});

然后遍历数组生成流线:注意这个材质定义要放在遍历的外边,如果每次都new一个材质的话,cesium会报错。

         let linematerial = new Cesium.PolylineTrailLinkMaterialProperty(Cesium.Color.ORANGE,3000,'./images/line.png');direction.forEach((item) => {let position = Cesium.Cartesian3.fromDegreesArrayHeights([item[0][0], item[0][                1], 300, item[1][0], item[1][1], 300]);let route = Viewer.entities.add({// name: 'Rescue Route',polyline: {positions: position,width: 5,material: linematerial,},});
});

以上就可以生成流线分析了,我这里用的是1.78版本cesium,注意你如果使用的是高版本的cesium,这里的GLSL语法低了,需要自己该新版本的GLSL语法。

代码中所用的line.png图片就是个渐变图,文章受限并不好发。

大体长这样:

这个文章里的水印不知道咋去...........如果需要图片素材可免费私信索要。

我的想法

本来我想象中应该能有个算法,把这些点根据流向连成一条条的线,这样会好看些,并且连成线后,可以用truf等算法库进行平滑处理,肯定比现在好看的多。类似风场动画那种。但是目前我水平有限,时间也比较紧张,没有做更多的优化处理。希望我的这个例子能给大家带来一点思路。

cesium根据高程点实现简易地下水水流分析相关推荐

  1. wireshark简易抓包分析——ping指定大小包长多28Byte

    wireshark简易抓包分析 测试ping时会发现一个现象: 在指定ping包长度后,实际发出的包总长=指定ping包长度+28 为什么ping -s指定大小n后,发出的包长为n+28呢? 先在不涉 ...

  2. cesium获取模型高度_Cesium专栏-空间分析之剖面分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  3. DEJA_VU3D - Cesium功能集 之 076-缓冲区分析

    前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小130个左右的功能,后续也会不断的追加,所以暂时 ...

  4. Cesium实战记录(五)天际线分析

    老规矩看下效果:(版本是1.94的) 实现思路:(引用网上大佬的) 利用Cesium 的边缘检测和后期处理效果的叠加.即在地图上检测此视角下的地形边缘,叠加标价效果层,叠加针对边缘实例和前一个边缘效果 ...

  5. DEJA_VU3D - Cesium功能集 之 034-可视域分析(纯前端)完整版

    前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有实现130个左右的功能,后续也会不断的追加,所以暂时打算一周 ...

  6. Cesium ClippingPlane剖切 改造 限高分析

    近期看了看原生沙盘 的剖切功能,简单记录整理,顺便改造成限高 示例:https://sandcastle.cesium.com/?src=3D%20Tiles%20Clipping%20Planes. ...

  7. Gephi简易学习[五]———— 分析红楼梦数据,了解Gephi操作流程

    处理数据 链接:https://pan.baidu.com/s/11mzYYnU4DBucH0lUhvXrrw 密码:wgbr 操作流程 统计分析→外观→布局→过滤 : 具体操作步骤: 打开hongl ...

  8. 记录-简易多媒体流分析工具参数

    Simple multimedia streams analyzer usage: ffprobe [OPTIONS] [INPUT_FILE] Main options: -L show licen ...

  9. Cesium 可视域分析代码段(源码)补充

    很抱歉之前的博客里的代码段是贴的截图:关于可视域分析的实现_总要学点什么的博客-CSDN博客_可视域分析 功能优化后的完整demo: Cesium功能集 之 034-可视域分析(纯前端)完整版 现在将 ...

最新文章

  1. js / jquery 零散收集
  2. bug4 导入新工程时报 Target runtime com.genuitec.runtime.generic.jee60 is not defined
  3. SpringBoot 项目中使用velocity模板(转载)
  4. Kubernetes实用技巧
  5. linux cp -d复制软链接文件
  6. 无招胜有招之语言基础
  7. spring配置xml文件_XML配置文件中的Spring配置文件
  8. 【Python】IDLE工具
  9. 【ABP框架系列学习】N层架构(3)
  10. springcloud生产环境一般怎么部署_机器学习模型生产环境部署的四种系统架构总结...
  11. 计算机网络复习整理(二三四章习题)
  12. 社保到底是多交好,还是少交好?
  13. Mentor Graphics IPC-7351 LP Viewer 10.5使用说明
  14. 齐岳DSPE-mPEG2000|二硬脂酸磷脂酰乙醇胺-聚乙二醇2000
  15. linux怎么打开rpm文件怎么打开,RPM格式文件怎么打开
  16. Zookeeper中NullPointerException
  17. transparent
  18. 华为虚拟系统的相关配置
  19. ubuntu键盘输入中文延迟卡顿问题
  20. excel自动排班有假期_在Excel中计划您的假期晚餐

热门文章

  1. linux学习--在虚拟机中安装RedFlag
  2. mysql知识整理_Mysql知识点整理
  3. js实现多屏/跨屏窗口放置
  4. Unity之正确设置手机显示布局获取手机朝向
  5. Handlebars.java学习笔记
  6. 计算机网络曼彻斯特编码与差分曼彻斯特编码
  7. JavaScript,Mysql,Java中substring,substr区别
  8. 应用系统之间数据传输的几种方案
  9. 编程之禅 -- 写给自己的话
  10. SSM练手项目:米米商城