高斯羽烟gis应用java实现模型计算_java生成高斯羽烟等值面格网点,零基础入门到精通, 收藏这篇就够了

1 模拟效果示例

2 高斯模型

2.1 高斯烟团模型


突发性泄漏事故中,经常发生污染源在短时间内突然释放大量的有害气体,此时对地面污染浓度的求解适合采用高斯烟团模型。烟团模型假定污染气云的体积沿水平和垂直方向增长,模拟污染气云在时间和空间上的变化。

2.1.1 方程

式中c为污染物浓度(单位:mg/m3)

Q为源强(单位:mg)

u为泄漏高度的平均风速(单位:m/s)

y、z分别用浓度标准偏差表示的y轴及z轴上的扩散参数

H为泄漏有效高度(单位:m)

2.1.2 适用条件

(1)污染物浓度在y、z轴上的分布符合高斯分布(正态分布);

(2)在全部空间中风速是均匀的、稳定的;

(3)源强一次性排放,短时间释放大量有毒气体;

(4)在扩散过程中污染物质量是守恒的(不考虑转化)。

2.2 高斯烟羽模型


高斯烟羽模式是计算释入大气中的气载污染物下风向浓度的应用最广的方法。此模式假定烟羽中污染物浓度分布在水平方向和垂直方向都遵循高斯分布。对于在恒定气象条件(指风向、风速、大气稳定度不随时间而变)高架点源的连续排放,在考虑了烟羽在地面的全反射后,下风向任一点的污染物浓度C (r,y,z)可由高斯烟羽公式进行模拟。

2.2.1 方程

式中c为污染物浓度(单位:mg/m3)

Q为源强(单位:mg/s)

u为泄漏高度的平均风速(单位:m/s)

y、z分别用浓度标准偏差表示的y轴及z轴上的扩散参数

H为泄漏有效高度(单位:m)

2.2.2 适用条件

(1)污染物浓度在y、z轴上的分布符合高斯分布(正态分布);

(2)在全部空间中风速是均匀的、稳定的;

(3)源强是连续均匀的;

(4)在扩散过程中污染物质量是守恒的(不考虑转化)。

3 高斯羽烟模型参数

3.1 坐标系


高斯模式的坐标系如下图所示,其原点为排放点(无界点源或地面源)或高架源排放点在地面的投影点,x轴正向为平均风向,y轴在水平面上垂直于x轴,正向在x轴的左侧,z轴垂直于水平面xoy,向上为正向,即为右手坐标系。

3.2 烟气抬升


有效源高H,等于烟囱的几何高度与烟气抬升高度△H之和,即

对于一确定的烟囱,其几何高度H是确定值,只要计算出抬升高度△H值,就可以求出有效源高H。我国“制订地方大气污染物排放标准的技术方法”(GB/T13201-91)中规定选用Briggs 公式作为适用计算模型,请参考相关文献。

3.3 大气稳定度


大气稳定度指大气中某一高度上的气团在垂直方向上的相对稳定程度。如果给一团空气一个初始作用力,使其作向上的垂直运动,垂直运动的气块在外力消失后,又逐渐回到原来的位置,这种状况的大气是稳定的;当外力消失后,气块仍继续上升,甚至加速前进,这种状况的大气是不稳定的;当外力消失后,气块停留在其已到达的位置,既不上升也不下降,这种状况的大气处于中性状态。

我国《环境影响评价技术导则》中推荐了用常规地面观测资料划分大气稳定度的方法。大气稳定度的分类方法采用经过修正的帕斯奎尔(Pasquill)稳定度分级法(Ps),将大气扩散稳定度分为强不稳定、不稳定、弱不稳定、中性、弱稳定和稳定六级,分别用A、B、C、D、E、F来表示。确定等级时首先根据云量与太阳高度角按下表查出太阳辐射等级数,再由太阳辐射等级数与地面风速按下表查找稳定度等级。

4 关键技术代码实现

风向因素:计算需使用三角函数进行转换。

package cn.interpolation.controller;

import cn.interpolation.common.HttpUtils;

import cn.interpolation.common.InterpolationUtils;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

import io.swagger.annotations.Api;

import io.swagger.annotations.ApiOperation;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

@Api(tags = “高斯羽烟”)

@RestController

@RequestMapping(“/api/GaussPlume”)

public class GaussPlumeController {

private static final Logger logger = LoggerFactory.getLogger(GaussPlumeController.class);

/********************************************** 图片路径 ***********************************************************/

Double TransferDouble(Object v){

try {

double vr = Double.valueOf(v.toString());

return vr;

}

catch (Exception e){

return 0.0;

}

}

@ApiOperation(value = “GaussPlume”)

@GetMapping(value = “/GaussPlumeVec”)

// @Scheduled(cron = “0 10 * * * ?”)

public String gaussPlumeVec() {

int[] size = new int[]{400, 400};

boolean isclip = true;

double[] dataInterval = new double[]{0.0001, 10, 25, 50, 100, 250} ;

String strJson = InterpolationUtils.calGaussPlumePoints(80,60,3.16 ,1000000000,225,116.2,41.2,dataInterval, size);

return strJson;

}

}

/**

* 生成高斯羽烟等值面格网点

*

* @param z 高度

* @param q 污染物释放速率,单位mg/s

* @param u 平均风速

* @param wind_direction 风向

* @param longitude 源经度

* @param latitude 源纬度

* @param dataInterval 数据间隔double[0.0001,25,50,100,200,300]

* @param size 大小,宽,高new int[]{100, 100};

* @return

*/

public static String calGaussPlumePoints(double z, double h, double u, double q, double wind_direction, double longitude, double latitude, double[] dataInterval, int[] size) {

StringBuffer geojsonpoints = new StringBuffer();

geojsonpoints.append(“{\“type\”: \“FeatureCollection\”, \“crs\”: {\“type\”: \“name\”,\“properties\”: { \“name\”: \“EPSG:4326\” }},\“features\”: [”);

try {

double _undefData = -9999.0;

// 多边形集合

SimpleFeatureCollection polygonCollection = null;

// 多边形线集合

List cPolylineList = new ArrayList ();

// 多边形List

List cPolygonList = new ArrayList ();

int width = size[0], height = size[1];

double[] _X = new double[width];

double[] _Y = new double[height];

double minX=longitude - 0.00001 * width;

double minY=latitude - 0.00001 * height;

double maxX=longitude + 0.00001 * width;

double maxY=latitude + 0.00001 * height;

Interpolate.createGridXY_Num(minX, minY, maxX, maxY, _X, _Y);

double[][] _gridData = new double[width][height];

// 数据间隔长度

int nc = dataInterval.length;

// 高斯羽烟插值 (宽(栅格X阵)、高(栅格Y阵)、默认数(最近邻居数))

_gridData = Interpolate.interpolation_GaussPlume( _X, _Y, z, longitude, latitude, u, q, wind_direction,h);

int rowNum, colNum;

colNum = _X.length;

rowNum = _Y.length;

int i, j;

//---- Do interpolation

for (i = 0; i < rowNum; i++) {

for (j = 0; j < colNum; j++) {

geojsonpoints.append("{\“type\”: \“Feature\”,\“geometry\”: {\“type\”: \“Point\”,\“coordinates\”: [ " +

_X[i] +“, “+ _Y[j] +” ]},\“properties\”: { \“val\”:” +

_gridData[i][j] +" }},");

}

}

geojsonpoints.append(“]}”);

} catch (Exception e) {

e.printStackTrace();

}

return geojsonpoints.toString();

}

try (NDManager manager = NDManager.newBaseManager()) {

// 1. 三角函数

NDArray a = manager.create(new int[]{0, 30, 45, 60, 90});

System.out.println(“不同角度的正弦值:”);

// 通过乘 pi/180 转化为弧度

NDArray b = a.mul(Math.PI / 180).sin();

System.out.println(b.toDebugString(100, 10, 100, 100));

System.out.println(“数组中角度的余弦值:”);

b = a.mul(Math.PI / 180).cos();

System.out.println(b.toDebugString(100, 10, 100, 100));

System.out.println(“数组中角度的正切值:”);

b = a.mul(Math.PI / 180).tan();

System.out.println(b.toDebugString(100, 10, 100, 100));

// 2. 反三角函数

a = manager.create(new int[]{0, 30, 45, 60, 90});

System.out.println(“含有正弦值的数组:”);

NDArray sin = a.mul(Math.PI / 180).sin();

System.out.println(sin.toDebugString(100, 10, 100, 100));

System.out.println(“计算角度的反正弦,返回值以弧度为单位:”);

NDArray inv = sin.asin();

System.out.println(inv.toDebugString(100, 10, 100, 100));

System.out.println(“通过转化为角度制来检查结果:”);

b = inv.toDegrees();

System.out.println(b.toDebugString(100, 10, 100, 100));

System.out.println(“arccos 和 arctan 函数行为类似:”);

NDArray cos = a.mul(Math.PI / 180).cos();

System.out.println(cos.toDebugString(100, 10, 100, 100));

System.out.println(“反余弦:”);

inv = cos.acos();

System.out.println(inv.toDebugString(100, 10, 100, 100));

System.out.println(“角度制单位:”);

b = inv.toDegrees();

System.out.println(b.toDebugString(100, 10, 100, 100));

System.out.println(“tan 函数:”);

NDArray tan = a.mul(Math.PI / 180).tan();

System.out.println(tan.toDebugString(100, 10, 100, 100));

System.out.println(“反正切:”);

inv = tan.atan();

System.out.println(inv.toDebugString(100, 10, 100, 100));

System.out.println(“角度制单位:”);

b = inv.toDegrees();

System.out.println(b.toDebugString(100, 10, 100, 100));

// 3. 舍入函数

// 3.1 四舍五入

a = manager.create(new double[]{1.0, 5.55, 123, 0.567, 25.532});

System.out.println(“原数组:”);

System.out.println(a.toDebugString(100, 10, 100, 100));

System.out.println(“舍入后:”);

b = a.round();

System.out.println(b.toDebugString(100, 10, 100, 100));

// 3.2 向下取整

a = manager.create(new double[]{-1.7, 1.5, -0.2, 0.6, 10});

System.out.println(“提供的数组:”);

System.out.println(a.toDebugString(100, 10, 100, 100));

System.out.println(“修改后的数组:”);

b = a.floor();

System.out.println(b.toDebugString(100, 10, 100, 100));

// 3.3 向上取整

a = manager.create(new double[]{-1.7, 1.5, -0.2, 0.6, 10});

System.out.println(“提供的数组:”);

System.out.println(a.toDebugString(100, 10, 100, 100));

System.out.println(“修改后的数组:”);

b = a.ceil();

System.out.println(b.toDebugString(100, 10, 100, 100));

}

调用生成的geojson成果及拖入查看:

插值成面部分代码

public String gaussPlumePolygonVec(double wd,double z,double height,double u,double q,double lon,double lat, int colums,int rows,int scale) {

int[] size = new int[]{colums, rows};

double[] dataInterval = new double[]{0, 30, 50, 70, 90, 150} ;

String strJson = InterpolationUtils.calGaussPlumeEquiSurface(z,height,u ,q,wd,lon,lat, dataInterval,size,scale);

return strJson;

}

插值成面调用示例

插值成面效果

无风环境模拟可参照:https://blog.csdn.net/weixin_42496466/article/details/130264781

结合风场数据模拟非直线风污染模拟:

如果对您有帮助

Java开发的就业市场正在经历结构性调整,竞争日益激烈

传统纯业务开发岗位(如仅完成增删改查业务的后端工程师)的需求,特别是入门级岗位,正显著萎缩。随着企业技术需求升级,市场对Java人才的要求已从通用技能转向了更深入的领域经验(如云原生、微服务)或前沿的AI集成能力。这也导致岗位竞争加剧,在一、二线城市,求职者不仅面临技术内卷,还需应对学历与项目经验的高门槛。

大模型为核心的AI领域正展现出前所未有的就业热度与人才红利

2025年,AI相关新发岗位数量同比激增543%,单月增幅最高超过11倍,大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡,议价能力极强,跳槽薪资涨幅可达30%-50%。值得注意的是,市场并非单纯青睐算法研究员,而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师,在向“Java+大模型”复合人才转型时拥有独特优势,成为企业竞相争夺的对象,其薪资天花板也远高于传统Java岗位。

在这里插入图片描述

说真的,这两年看着身边一个个搞Java、C++、前端、数据、架构的开始卷大模型,挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis,稳稳当当过日子。

结果GPT、DeepSeek火了之后,整条线上的人都开始有点慌了,大家都在想:“我是不是要学大模型,不然这饭碗还能保多久?”

先给出最直接的答案:一定要把现有的技术和大模型结合起来,而不是抛弃你们现有技术!掌握AI能力的Java工程师比纯Java岗要吃香的多。

即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地!大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇!

如何学习AGI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享**

一、2025最新大模型学习路线

一个明确的学习路线可以帮助新人了解从哪里开始,按照什么顺序学习,以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛,没有明确的学习路线可能会导致新人感到迷茫,不知道应该专注于哪些内容。

我们把学习路线分成L1到L4四个阶段,一步步带你从入门到进阶,从理论到实战。

L1级别:AI大模型时代的华丽登场

L1阶段:我们会去了解大模型的基础知识,以及大模型在各个行业的应用和分析;学习理解大模型的核心原理,关键技术,以及大模型应用场景;通过理论原理结合多个项目实战,从提示工程基础到提示工程进阶,掌握Prompt提示工程。

L2级别:AI大模型RAG应用开发工程

L2阶段是我们的AI大模型RAG应用开发工程,我们会去学习RAG检索增强生成:包括Naive RAG、Advanced-RAG以及RAG性能评估,还有GraphRAG在内的多个RAG热门项目的分析。

L3级别:大模型Agent应用架构进阶实践

L3阶段:大模型Agent应用架构进阶实现,我们会去学习LangChain、 LIamaIndex框架,也会学习到AutoGPT、 MetaGPT等多Agent系统,打造我们自己的Agent智能体;同时还可以学习到包括Coze、Dify在内的可视化工具的使用。

L4级别:大模型微调与私有化部署

L4阶段:大模型的微调和私有化部署,我们会更加深入的探讨Transformer架构,学习大模型的微调技术,利用DeepSpeed、Lamam Factory等工具快速进行模型微调;并通过Ollama、vLLM等推理部署框架,实现模型的快速部署。

整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握;而L3 L4更多的是通过项目实战来掌握大模型的应用开发,针对以上大模型的学习路线我们也整理了对应的学习视频教程,和配套的学习资料。

二、大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

三、大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

四、大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

五、大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

2025最新版CSDN大礼包:《AGI大模型学习资源包》免费分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值