公众气象服务产品平台的设计与实现

2023-06-15 01:03郑文全肖鹏王英
计算机时代 2023年6期
关键词:线程委托

郑文全 肖鹏 王英

摘  要: 为了提高公众气象服务产品制作效率,以天气网等网站数据为基础,结合预报值班人员本地化订正,使用Visual Basic.Net设计了批量生成公众气象服务产品的制作平台。该平台具有集中显示、对比订正、批量制作、信息查询等功能,提高了值班人员气象工作效率。

关键词: 公众气象服务; VB; .Net; 正则表达式; 线程; 委托

中图分类号:TP317.1          文献标识码:A     文章编号:1006-8228(2023)06-157-05

Design and implementation of public meteorological service product platform

Zheng Wenquan1, Xiao Peng1, Wang Ying2

(1. Dazhou Meteorological Bureau, Dazhou, Sichuan 635000, China; 2. Dazhou Quxian Meteorological Bureau)

Abstract: In order to improve the production efficiency of public meteorological service products, based on the data of websites such as weather.com.cn, combined with the localized correction by forecast duty personnel, a production platform for batch generation of public meteorological service products is designed using Visual Basic.Net. The platform has functions such as centralized display, comparison and correction, batch production, and information query, which improves the meteorological work efficiency of duty personnel.

Key words: public meteorological service; VB; .Net; regular expression; threads; delegation

0 引言

公众气象服务[1]是气象服务系统及时地为社会各界各部门指挥生产、组织防灾减灾,以及在气候资源合理开发利用和环境保护等方面进行科学决策提供气象信息。公众气象服务产品包括天气预报警报、气候服务、环境质量预报以及气象科普等,本文主要指日常例行制作的公众生活、工作、出行、旅游、健康等多种公众气象服务产品(以下简称产品),产品包括48/72小时等天气预报、生活气象指数、旅游风景区预报、铁路/高速公路气象服务、电视天气预报等多个产品。气象值班人员每日按时制作对应产品,由于产品数量多,且产品使用的气象预报数据(指温度、天气现象、生活气象指数等,以下简称数据)多,往往制作产品费时费力,人工出错概率大,牵制了值班人员大量精力,迫切需要开发一套方便快捷的产品制作平台(以下简称平台)。

1 制作设计

本平台由Visual Basic.Net 2015(基于微软.NET Framework之上的面向对象的编程语言,以下简称VB.Net)在Windows10下编写,在Windows7/10及Word2010/2016调试通过。

1.1 框架

平台从天气网以及达州市公共气象服务网收集基础数据,值班人员对其进行本地化订正,形成最终数据。再由设计好的Word模板产品,批量生成多个最终Word产品(图1)。基础数据仅为值班员提供种类丰富的数据来源,以及方便订正的锚定值。

1.2 数据存储

基础数据的收集遵循前瞻性、尽量多全的原则,如,本市、县、区、乡镇、景区,周边市及景区等1~15天多个数据。所有数据存储在两个公共数组变量DzWeather和LifeIndex中。

三维数组变量DzWeather(56,7,22)存储天气网上的数据(表1)。站号50~56单独收集天气网8~15天数据。例:DzWeather(6,7,2)为渠县第六天最高温度,DzWeather(56,0,2)为渠县第七天最高温度。

二维数组变量LifeIndex(14,3)存储达州市公共气象服务网上的14个生活气象指数,分别对应指数名称、等级及描述,专为“城区生活出行天气预报”产品提供指数选用。

1.3 文件和目录

程序当前目录下“0配置文件”文件夹,放置设计好的Word产品模板,以及预报员、天气现象等配置文本文件;同时,产品目录按年份名每年自动建立,存储具体产品。该目录设置只读共享便于他人查詢。

Word产品模板有:48/72小时天气预报、城区生活出行天气预报、旅游风景区天气预报、铁路/公路气象服务等共14个产品。Word模板用隐形(无框线)或显形的表格固定位置及格式,或用特别字串占位(如,YYYY,xxx等),便于程序用替换或单元格填充完成数据更新。例如,Word产品版头[2]部分表格(隐形表格)里的预报员、签发人、日期等,程序控制单元格填充数据。产品按“产品名_制作日期_期数”进行命名,方便查询使用。例,2022年12月2日周末天气预报(每周五制作)命名为“周末天气预报_20221202_048.docx”。

2 程序实现

2.1 程序流程

程序启动加载窗体时(图2),进行初始化:表格(图3中名为dgvD的DataGridView控件,以下“表格”均指此控件)格式化,检查配置文件(无则自动生成初始配置),加载预报员、签发人、天气现象等选项数据,重置7天切换按钮,检查产品生成目录等等。

点击“读取”检查预报员与签发人后,读取多个站点的网页源码,分别提取网页源码中的数据,存储到公共数组变量中(见1.2)。切换图3表格下面的7天按键,分别显示各日数据。值班员逐一订正修改后,可一键输出到Word,形成最终的多个产品。

2.2 数据获取

使用统一的网页源码获取过程,分别提取各个站号网页中的数据。例,获取达州(站号为10)数据:GetSiteData("http://www.weather.com.cn/weathern/101270601.shtml", 10, "达州"),代码如下:

Private Sub GetSiteData(ByVal url, ByVal num, ByVal site) '网址,站号,站名

mythread=New Thread(AddressOf GetCode) '新建线程

mythread.Start(url)

Do

System.Windows.Forms.Application.DoEvents()

'等待完成

Loop Until mythread.IsAlive=False

GetElem(strCode, num) '正则提取

End Sub

由于网页源码获取是异步[3],且多个网站连续读取容易造成主线程“假死”现象[4],故上面代码使用了线程[5]和等待。线程中获取网页源码的程序代码:

Private Sub GetCode(ByVal web As String)

Dim wc As New WebClient

Try

Invoke(New voidShowMessage(AddressOf

ShowMessage), "请求源码中...")

wc.Proxy=Nothing

strCode=Encoding.UTF8.GetString

(wc.DownloadData(web))

Catch ex As Exception

Invoke(New voidShowMessage(AddressOf

ShowMessage), ex.Message)

strCode = ""

End Try

‘失败时状态信息,代码略

Invoke(New voidShowMessage(AddressOf

ShowMessage), "获取源码成功!")委托

wc.Dispose()

wc=Nothing

mythread.Abort()

End Sub

线程中获取源码的状态信息,是无法直接显示在主线程窗体。因此在新建线程的代码中使用了委托[6]。委托需在类中定义Private Delegate Sub voidShowMessage(ByVal strM As String),这样图3表格下面可即时显示线程进行状态。

Private Sub ShowMessage(ByVal s As String)

lblState.Text="状态:" & s

End Sub

源码获取成功后,用正则表达式[7]解析对应的数据,存储到公共数组变量中,部分代码:

Private Sub GetElem(ByVal strCode_All As String,

ByVal dz As Integer)

Dim strT() As String, m As Integer, k As Integer,

i As Integer

Dim reg As New Regex("blueFor-container.*?

click_wrap", RegexOptions.Singleline)

m=reg.Matches(strCode_All).Count

If m<1 Then

lblState.Text="状态:网页中无数据,请查找原因如网页改版!"

Exit Sub

End If

strCode=reg.Matches(strCode_All)(0).Value

lblState.Text="状态:提取" & dz & "区域日期..."

reg=New Regex("(?<=""date"">).*?(?=

)", RegexOptions.Singleline)'讀取日期8

m = reg.Matches(strCode).Count

If reg.Matches(strCode).Count <> 8 Then

lblState.Text="状态:数据异常(不是7天数据),请查找原因!"

Exit Sub

End If

For k=0 To m - 1

DzWeather(dz, k, 0) = reg.Matches(strCode)(k)

.Value.Replace(vbCrLf, "")

Next

‘提取天气现象、最高温度、最低温度、风、生活气象指数等类似,略

End Sub

景区与达州市公共气象服务网的网页源码各不相同,另写过程修改正则匹配字串即可。

2.3 修改订正

2.3.1 数据显示

7天数据显示由表格下面d1~d7共七个按键进行切换。图3为第五天(2023年1月)10日数据,程序代码:

Private Sub d5_Click(senderAs Object, e As

EventArgs) Handles d5.Click

cboWeather.Visible=False  '隐藏天气现象ComboBox

cboWeather.Width=0

SaveArry()  '存储当前数据

intDay=5 '第五天

LoadToTable(intDay) '第五天数据入表

Rest7Back() '七个按键背景重置

D5.BackColor=Color.LightBlue

End Sub

按键切换时,保存当前修改的数据到公共数组变量,之后调入对应按键日期的數据在表格显示,注意第七天数据的站点变成了50+的处理(见1.2)。

2.3.2 订正修改

值班员对基础数据的本地化修改订正,提供了三种方式。①直接双击表格中单元格,即可进行编辑修改。②选择其中一个数据,点击“行数据相同”使同行的所有数据将变成一样,方便对比微调修改。③针对表格第一行天气现象进行下拉选项修改。添加一个cboWeather(为ComboBox控件),平时隐藏。点击第一行天气现象时激活显示(图3右侧),选择其中天气现象完成修改。焦点离开第一行自动隐藏。

Private Sub DV_CurrentCellChanged(……) Handles

dgvD.CurrentCellChanged

Dim x As Integer=dgvD.CurrentCell.RowIndex '行

Dim y As Integer=dgvD.CurrentCell.ColumnIndex '列

If x=0 Then'仅对第一行定位显示,除此外隐藏

If y>0 And y<8 Then '仅限达州更改,预留扩展

cboWeather.Visible=False

cboWeather.Width=0

cboWeather.Left=dgvD.Location.X+dgvD

.GetCellDisplayRectangle(y, x, True).Left

cboWeather.Top=dgvD.Location.Y + dgvD

.GetCellDisplayRectangle(y, x, True).Top

cboWeather.Width=dgvD.GetCellDisplayRectangle

(y, x, True).Width

cboWeather.Height=dgvD.GetCellDisplayRectangle

(y, x, True).Height

cboWeather.Text=dgvD.CurrentCell.Value

cboWeather.Visible=True

End If

Else

cboWeather.Visible=False

cboWeather.Width=0

End If

End Sub

当对cboWeather修改时,应及时更新到表格,其他修改方式类似。

Private Sub cboWeather_SelectedValueChanged(……)

Handles cboWeather.SelectedValueChanged

dgvD.CurrentCell.Value=cboWeather.Text

End Sub

2.4 生成产品

所有数据人工订正完毕后,点击“输出到Word”,形成最终产品。其中景区与乡镇的数据,可以由主站(表1一维0~6站号)根据现有的已经研究出的乡镇/景区预报订正模型,由程序在内部做自动订正,无须人工修改。

VB.Net操作Word前,需引用“Microsoft Word 16.0 Object Library”类库[8]。每个产品的制作编写一个处理过程,逐个调用完成所有产品制作。以数据量较少的48小时分县天气预报产品为例,使用替换及单元格填充,过程代码:

Private Sub Hour48Forecast() '内含两个表,版头隐形表

为tables(1),正文中显形表为tables(2)

Dim strFile As String = strPath & "0配置模板\=

48小时分县天气预报.docx" '使用模板

Dim w As New Application, i As Integer

Dim d As Document=w.Documents.Open(strFile)

Dim intNum As Integer=Now.DayOfYear '期数,每天一期

FillHeader(d, intNum.ToString("000")) '产品版头填充

For i = 0 To 6‘站号0~6

d.Tables(2).Cell(3 + i, 2).Range.Text=DzWeather

(i, 2, 1) '24小时天气现象

d.Tables(2).Cell(3 + i, 3).Range.Text=DzWeather

(i, 2, 3) & "~" & DzWeather(i, 2, 2) '温度

d.Tables(2).Cell(3 + i, 4).Range.Text=DzWeather

(i, 3, 1) ‘48小时

d.Tables(2).Cell(3 + i, 5).Range.Text=DzWeather

(i, 3, 3) & "~" & DzWeather(i, 3, 2)

Next

d.SaveAs(strYear & "\常规服务产品\48小时分县天气

预报_" & Now.ToString("yyyyMMdd_") & intNum.ToString("000") & ".docx")  '另存,产品输出

d.Close()

w.Quit()

w=Nothing

End Sub

各产品的版头是一致的,单独用一个过程来处理。

Private Sub FillHeader(ByVal d As Document, ByVal

num As String) '填充版头

d.Range.Find.Execute("YYYY",,,,,,,,, Now.Year

.ToString, WdReplace.wdReplaceAll) '年

d.Range.Find.Execute("xxx",,,,,,,,, num, WdReplace

.wdReplaceAll) '期數,替换字串xxx

d.Tables(1).Cell(1, 3).Range.Text=cbYby.Text  '预报员,

隐形表格中的单元格(见1.3)

d.Tables(1).Cell(2, 3).Range.Text=cbQfr.Text  '签发人

d.Tables(1).Cell(1, 4).Range.Text=Format(Now,"yyyy年

MM月dd日HH时") '时间

End Sub

3 结束语

本平台经过四年的使用已经较为成熟,产品制作时间由原手工二小时左右缩短成平台制作八分钟左右,有效地节约了时间;方便数据对比校对,减少了输入失误,提高了气象工作效率,是值班人员工作的好帮手。几年来,产品经历多次新增和变更,但因平台模块化设计及前瞻性考虑,使得平台维护只须几分钟即可迅速满足业务需求。

本平台适合市、县级公共气象服务产品的自动化制作,成本低廉、部署简单、移植方便。未来,根据需求还可利用Excel、Surfer、插件等增加图表功能,实现数据的可视化。

参考文献(References):

[1] 刘艳华,白钰,隋红艳,等.浅谈如何写好省级公众天气形势

服务信息[J].黑龙江气象,2021,38(2):34-36

[2] 韩亮.信息化的公文格式管理中常见问题分析及解决措施[J].

信息记录材料,2017,18(7):111-112

[3] 纪铭涵,齐林,张杨,等.面向异步机制的自动重构方法研究[J].

河北科技大学学报,2021,42(5):499-507

[4] 周岚.多线程在WinForm窗体开发中的应用研究[J].软件

工程,2017,20(3):21-23

[5] H.M.Deitel,P.J.Deitel,T.R.Nieto(美).Visual Basic.NET程序

设计专家指南[M].北京:机械工业出版社,2003:520-557

[6] Francesco Balena(意).Visual Basic 2005技术内幕[M].北京:

清华大学出版社,2006:229-236

[7] Francosis Liger,Craig McQueen,Paul Wilto(美).VB.NET

字符串和正则表达式[M].北京:清华大学出版社,2002:118-14

[8] 唐云婷.基于.NET技术的文档自动化处理研究[J].黑龙江

科学,2021,12(10):26-27,31

猜你喜欢
线程委托
浅谈linux多线程协作
绩效评价在委托管理酒店中的应用
治理现代化:委托制下的权力清单制
招标代理中的授权委托——以案说法
委托理财忌保底 投资风险需自负
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究
么移动中间件线程池并发机制优化改进