python--转换wrf输出的风场数据为网页可视化的json格式

news/2024/4/30 14:52:09/文章来源:https://blog.csdn.net/weixin_44237337/article/details/126637499

前言:

  • 一般网页可视化风场中的数据都是json格式,而如果我们希望将wrf模式模拟输出的风场数据在网页中进行展示,这就需要先将wrfoutput数据转换为网页可以识别的json格式。

  • 这里主要需要用到json库,主要的实现方式就是将读取的风场风量U,V转换为字典并存到json文件中

  • 同时,由于wrf模拟的数据一般是非等间距的网格,需要先将数据进行插值,插值到等间距的网格,这里可以通过NCL的函数rcm2rgrid_Wrap实现
    举个例子,将模式中设置为兰伯特投影的网格:
    在这里插入图片描述
    插值为等间距网格:
    在这里插入图片描述

主要的编程分为两部分:

  • 第一部分通过NCL脚本将wrfout数据转换为等间距网格,并导出为netcdf格式;
  • 第二部分通过python脚本将第一步导出的nc格式进行转换,并保存输出为json格式。

NCL插值脚本1

  • 需要修改的就是路径和变量,我下面展示脚本不仅有风场数据u,v还有降水,海表面压力,气温等,可自行修改
begina = addfile("/Users/WRF/outdata/2022071000/wrfout_d01_2022-07-10_01:00:00","r")lat2d = a->XLAT(0,:,:)lon2d = a->XLONG(0,:,:)lat1d = lat2d(:,0)lon1d = lon2d(0,:)time = wrf_user_getvar(a,"XTIME",-1)u10 = wrf_user_getvar(a,"U10",0)v10 = wrf_user_getvar(a,"V10",0)slp = wrf_user_getvar(a,"slp",0)t2  = wrf_user_getvar(a,"T2",0)td  = wrf_user_getvar(a,"td",0)rainc = wrf_user_getvar(a,"RAINC",0)rainnc = wrf_user_getvar(a,"RAINNC",0)u10@lat2d = lat2du10@lon2d = lon2du10_ip = rcm2rgrid_Wrap(lat2d,lon2d,u10,lat1d,lon1d,0)v10@lat2d = lat2dv10@lon2d = lon2dv10_ip = rcm2rgrid_Wrap(lat2d,lon2d,v10,lat1d,lon1d,0)slp_ip  =   rcm2rgrid_Wrap(lat2d,lon2d,slp,lat1d,lon1d,0)t2_ip  =   rcm2rgrid_Wrap(lat2d,lon2d,t2,lat1d,lon1d,0)td_ip  =   rcm2rgrid_Wrap(lat2d,lon2d,td,lat1d,lon1d,0)rainc_ip  =   rcm2rgrid_Wrap(lat2d,lon2d,rainc,lat1d,lon1d,0)rainnc_ip  =   rcm2rgrid_Wrap(lat2d,lon2d,rainnc,lat1d,lon1d,0)outf = addfile("/Users/wrfout_d01_2022-07-10_01:00:00.nc","c")outf->time =  timeoutf->lat  =  lat2doutf->lon  =  lon2doutf->u10  =  u10_ipoutf->v10  =  v10_ipoutf->slp  =  slp_ipoutf->t2   =  t2_ipoutf->td   =  td_ipoutf->rainc   =  rainc_ipoutf->rainnc  =  rainnc_ipend

上述脚本的缺点在于只能基于模式模拟的经纬度区域进行插值,意思就是说他的经纬度区域是固定的那么大

NCL插值脚本2

NCL还有一个函数可以实现上述过程,就是ESMF_regrid,该函数的优点在于可以实现任意经纬度范围的插值,但是不足在于对于存在高度层的变量,暂时无法进行高度层的数据读取。(也可能我水平有限不知道。。。。)这里也附上脚本:

load "$NCARG_ROOT/lib/ncarg/nclscripts/esmf/ESMF_regridding.ncl"begina = addfile("/Users/WRF/outdata/2022071000/wrfout_d01_2022-07-10_01:00:00","r")u10 = wrf_user_getvar(a,"U10",0)v10 = wrf_user_getvar(a,"V10",0)slp = wrf_user_getvar(a,"slp",0)t2  = wrf_user_getvar(a,"T2",0)
;  td  = wrf_user_getvar(a,"td",0)rainc = wrf_user_getvar(a,"RAINC",0)rainnc = wrf_user_getvar(a,"RAINNC",0)u10@lat2d = a->XLAT(0,:,:) u10@lon2d = a->XLONG(0,:,:)v10@lat2d = a->XLAT(0,:,:) v10@lon2d = a->XLONG(0,:,:)slp@lat2d = a->XLAT(0,:,:) slp@lon2d = a->XLONG(0,:,:)t2@lat2d = a->XLAT(0,:,:) t2@lon2d = a->XLONG(0,:,:)
;  td@lat2d = a->XLAT(0,:,:) 
;  td@lon2d = a->XLONG(0,:,:)rainc@lat2d = a->XLAT(0,:,:) rainc@lon2d = a->XLONG(0,:,:)rainnc@lat2d = a->XLAT(0,:,:) rainnc@lon2d = a->XLONG(0,:,:)lat2d = a->XLAT(0,:,:)lon2d = a->XLONG(0,:,:)lat1d = lat2d(:,0)lon1d = lon2d(0,:)latS = -20latN = 50lonW = 95lonE = 145Opt = TrueOpt@InterpMethod = "bilinear" Opt@ForceOverwrite = True Opt@SrcMask2D = where(.not. ismissing(v10),1,0) Opt@DstGridType = "0.1deg"Opt@DstLLCorner = (/latS, lonW /) Opt@DstURCorner = (/latN, lonE /) u10_regrid = ESMF_regrid(u10,Opt)v10_regrid = ESMF_regrid(v10,Opt)slp_regrid = ESMF_regrid(slp,Opt)t2_regrid = ESMF_regrid(t2,Opt)
;  td_regrid = ESMF_regrid(td,Opt)rainc_regrid = ESMF_regrid(rainc,Opt)rainnc_regrid = ESMF_regrid(rainnc,Opt)time = wrf_user_getvar(a,"XTIME",-1)nlon = dimsizes(v10_regrid&lon)nlat = dimsizes(v10_regrid&lat)ofile = "wrfout_d01_2022-07-10_01:00:00.nc"system("rm -rf "+ofile) fout = addfile(ofile,"c") dimNames = (/"lat", "lon"/)dimSizes = (/nlat, nlon/)dimUnlim = (/False, False/)filedimdef(fout,dimNames,dimSizes,dimUnlim) ;-- define dimensionsfilevardef(fout,"lat",typeof(v10_regrid&lat),getvardims(v10_regrid&lat))filevardef(fout,"lon",typeof(v10_regrid&lon),getvardims(v10_regrid&lon))filevardef(fout,"u10",typeof(u10_regrid),getvardims(u10_regrid))filevardef(fout,"v10",typeof(v10_regrid),getvardims(v10_regrid))filevardef(fout,"slp",typeof(slp_regrid),getvardims(slp_regrid))filevardef(fout,"t2",typeof(t2_regrid),getvardims(t2_regrid))
;  filevardef(fout,"td",typeof(td_regrid),getvardims(td_regrid))filevardef(fout,"rainc",typeof(rainc_regrid),getvardims(rainc_regrid))filevardef(fout,"rainnc",typeof(rainnc_regrid),getvardims(rainnc_regrid))filevarattdef(fout,"lat",v10_regrid&lat) ;-- copy lat attributesfilevarattdef(fout,"lon",v10_regrid&lon) ;-- copy lon attributesfilevarattdef(fout,"u10",u10_regrid)filevarattdef(fout,"v10",v10_regrid)filevarattdef(fout,"slp",slp_regrid)filevarattdef(fout,"t2",t2_regrid)
;  filevarattdef(fout,"td",td_regrid)filevarattdef(fout,"rainc",rainc_regrid)filevarattdef(fout,"rainnc",rainnc_regrid)setfileoption(fout,"DefineMode",False)fout->u10 = (/u10_regrid/)fout->v10 = (/v10_regrid/) fout->slp = (/slp_regrid/) fout->t2 = (/t2_regrid/) 
;  fout->td = (/td_regrid/) fout->rainc  = (/rainc_regrid/) fout->rainnc = (/rainnc_regrid/) fout->lat = (/v10_regrid&lat/) ;-- write lat to new netCDF filefout->lon = (/v10_regrid&lon/) ;-- write lon to new netCDF filefout->time =  timeend

PS:运行该脚本会生成四个nc文件,分别为:destination_grid_file.nc、source_grid_file.nc、weights_file.nc、wrfout_d01_2022-07-10_01:00:00.nc。其中,wrfout_d01_2022-07-10_01:00:00.nc是我需要的文件,但是其他三个文件如何在运行脚本的过程去掉暂未解决。

python格式转换脚本1

python脚本如下所示:

# -*- coding: utf-8 -*-
"""
Created on %(date)s@author: %(jixianpu)sEmail : 211311040008@hhu.edu.cnintroduction : keep learning althongh walk slowly
""""""
用来读取用ncl插值后的wrfoutput.nc 数据,并生成对应文件名的json格式
"""import pandas as pd
import os
import json
import netCDF4 as nc
import numpy as np
import  datetime
from netCDF4 import Dataset
import argparse
from argparse import RawDescriptionHelpFormatter
import xarray as xr
import sys
import globdate = sys.argv[1]
date = str(date)
frst = sys.argv[2]
step = sys.argv[3]path = r'/Users/WRF/outdata/2022071000/'#只能是已经存在的文件目录且有数据才可以进行读取
start = datetime.datetime.strptime(date,'%Y%m%d%H').strftime("%Y-%m-%d_%H:%M:%S")
end = (datetime.datetime.strptime(date,'%Y%m%d%H')+datetime.timedelta(hours=int(frst))).strftime("%Y-%m-%d_%H:%M:%S")
intp = (datetime.datetime.strptime(date,'%Y%m%d%H')+datetime.timedelta(hours=int(step))).strftime("%Y-%m-%d_%H:%M:%S")
fstart = path+'/wrfout_d01_'+start+'*'
fintp  = path+'/wrfout_d01_'+intp+'*'
fend   = path+'/wrfout_d01_'+end+'*'
file = path+'/*'
filestart = glob.glob(fstart)
fileintp  = glob.glob(fintp)
fileend   = glob.glob(fend)
filelist  = glob.glob(file)
filelist.sort()   
rstart = np.array(np.where(np.array(filelist)==filestart))[0][0]
rintp = np.array(np.where(np.array(filelist)==fileintp))[0][0]
rend   = np.array(np.where(np.array(filelist)==fileend))[0][0]
fn = filelist[rstart:rend:rintp]outroot = 'Users/'    
for i in fn:uhdr = {"header":{"discipline":0,"disciplineName":"Meteorological products","gribEdition":2,"gribLength":131858,"center":0,"centerName":"WRF OUTPUT","subcenter":0,"refTime":"2014-01-31T00:00:00.000Z","significanceOfRT":1,"significanceOfRTName":"Start of forecast","productStatus":0,"productStatusName":"Operational products","productType":1,"productTypeName":"Forecast products","productDefinitionTemplate":0,"productDefinitionTemplateName":"Analysis/forecast at horizontal level/layer at a point in time","parameterCategory":2,"parameterCategoryName":"Momentum","parameterNumber":2,"parameterNumberName":"U-component_of_wind","parameterUnit":"m.s-1","genProcessType":2,"genProcessTypeName":"Forecast","forecastTime":3,"surface1Type":103,"surface1TypeName":"Specified height level above ground","surface1Value":10,"surface2Type":255,"surface2TypeName":"Missing","surface2Value":0,"gridDefinitionTemplate":0,"gridDefinitionTemplateName":"Latitude_Longitude","numberPoints":65160,"shape":6,"shapeName":"Earth spherical with radius of 6,371,229.0 m","gridUnits":"degrees","resolution":48,"winds":"true","scanMode":0,"nx":360,"ny":181,"basicAngle":0,"subDivisions":0,"lo1":0,"la1":90,"lo2":359,"la2":-90,"dx":1,"dy":1}}vhdr = {"header":{"discipline":0,"disciplineName":"Meteorological products","gribEdition":2,"gribLength":131858,"center":0,"centerName":"WRF OUTPUT","subcenter":0,"refTime":"2014-01-31T00:00:00.000Z","significanceOfRT":1,"significanceOfRTName":"Start of forecast","productStatus":0,"productStatusName":"Operational products","productType":1,"productTypeName":"Forecast products","productDefinitionTemplate":0,"productDefinitionTemplateName":"Analysis/forecast at horizontal level/layer at a point in time","parameterCategory":2,"parameterCategoryName":"Momentum","parameterNumber":3,"parameterNumberName":"V-component_of_wind","parameterUnit":"m.s-1","genProcessType":2,"genProcessTypeName":"Forecast","forecastTime":3,"surface1Type":103,"surface1TypeName":"Specified height level above ground","surface1Value":10,"surface2Type":255,"surface2TypeName":"Missing","surface2Value":0,"gridDefinitionTemplate":0,"gridDefinitionTemplateName":"Latitude_Longitude","numberPoints":65160,"shape":6,"shapeName":"Earth spherical with radius of 6,371,229.0 m","gridUnits":"degrees","resolution":48,"winds":"true","scanMode":0,"nx":360,"ny":181,"basicAngle":0,"subDivisions":0,"lo1":0,"la1":90,"lo2":359,"la2":-90,"dx":1,"dy":1}}data = [uhdr, vhdr]newf = Dataset(i)lat = np.array(newf.variables['lat'])# print(fn,lat)lon = np.array(newf.variables['lon'])dys = np.diff(lat, axis = 0).mean(1)dy = float(dys.mean())dxs = np.diff(lon, axis = 1).mean(0)dx = float(dxs.mean())nx = float(lon.shape[1])ny = float(lat.shape[0])la1 = float(lat[-1, -1])la2 = float(lat[0, 0])lo1 = float(lon[0, 0])lo2 = float(lon[-1, -1])time =(newf.variables['time'])dates = nc.num2date(time[:],units=time.units)dt = pd.to_datetime(np.array(dates, dtype='datetime64[s]')).strftime("%Y%m%d%H%M%S")tms =pd.to_datetime(np.array(dates, dtype='datetime64[s]')).strftime("%Y-%m-%d_%H:%M:%S")for ti, time in enumerate(dt):datestr = (dt[0][:8])timestr = (dt[0][8:10])+'00'dirpath = outroot + dateos.makedirs(dirpath, exist_ok = True)outpath = os.path.join(dirpath, '%s.json' % (i[-19:]))for u0_or_v1 in [0, 1]:h = data[u0_or_v1]['header']h['la1'] = la1h['la2'] = la2h['lo1'] = lo1h['lo2'] = lo2h['nx'] = nxh['ny'] = nyh['dx'] = dxh['dy'] = dyh['forecastTime'] = 0h['refTime'] = tms[0] + '.000Z'h['gribLength'] = 1538 + nx * ny * 2if u0_or_v1 == 0:data[u0_or_v1]['data'] = np.array(newf.variables['u10']).ravel().tolist()elif u0_or_v1 == 1:data[u0_or_v1]['data'] = np.array(newf.variables['v10']).ravel().tolist()if ti == 0:outf = open(outpath, 'w')json.dump(data, outf)outf.close()outf = open(outpath, 'w')json.dump(data, outf)outf.close()

上述脚本为Linux系统下运行,运行方式如下:

python  xx.py 起报时间 时常 间隔

举个例子:
我的wrfout数据名称如下:
在这里插入图片描述

python  convert_to_json.py 2022071000 12 06

根据你需要的模式起始时间,起报的时长(小时)以及预报的时间间隔(小时)进行自动化转换。

python 格式转换脚本2

当然,这里也准备了一个windows下的简易脚本,转换出的信息也比较简单,

# -*- coding: utf-8 -*-
"""
Created on %(date)s@author: %(jixianpu)sEmail : 211311040008@hhu.edu.cnintroduction : keep learning althongh walk slowly
"""from __future__ import print_function, unicode_literals
import pandas as pd
import os
import json
import netCDF4 as nc
import numpy as np
import  datetime
from netCDF4 import Dataset
import argparse
from argparse import RawDescriptionHelpFormatter
import xarray as xr# parser = argparse.ArgumentParser(description = """
# """, formatter_class = RawDescriptionHelpFormatter)args = r'J:/wrf自动化/wrfout_d01_2022-07-10_01_00_00.nc'outroot = r'D:/'uhdr = {"header":{"nx":360,"ny":181,"max":11,}}data = [uhdr]
newf = Dataset(args)
lat = np.array(newf.variables['lat'])
lon = np.array(newf.variables['lon'])u10 = np.array(newf.variables['u10'])
v10 = np.array(newf.variables['v10'])# indx = u10>1000# u10[indx] = np.nan
# v10[indx] = np.nanw10 = np.nanmax(np.sqrt(u10*u10+v10*v10))dys = np.diff(lat, axis = 0).mean(1)
dy =    float(dys.mean())
print('Latitude Error:', np.abs((dy / dys) - 1).max())
print('Latitude Sum Error:', (dy / dys - 1).sum())
dxs = np.diff(lon, axis = 1).mean(0)
dx =    float(dxs.mean())
print('Longitude Error:', np.abs(dx / dxs - 1).max())
print('Longitude Sum Error:', (dx / dxs - 1).sum())nx =    float(lon.shape[1])
ny =    float(lat.shape[0])la1 =    float(lat[-1, -1])
la2 =   float(lat[0, 0])
lo1 =   float(lon[0, 0])
lo2 =   float(lon[-1, -1])time =(newf.variables['time'])dates = nc.num2date(time[:],units=time.units)dt = pd.to_datetime(np.array(dates, dtype='datetime64[s]')).strftime("%Y%m%d%H%M%S")ds= {"nx":360,"ny":181,"max":11,# "lo1":0,# "la1":90,# "lo2":359,# "la2":-90,# "dx":1,# "dy":1,# "parameterUnit":"m.s-1",'data':{}}ds['max']   =    float(w10)
ds['nx']    =    (nx)
ds['ny']    =    (ny)for ti, time in enumerate(dt):#2012/02/07/0100Z/wind/surface/level/orthographic=-74.01,4.38,29184datestr = (dt[0][:8])timestr = (dt[0][8:10])+'00'print('Add "#' + datestr + '/' + timestr + 'Z/wind/surface/level/orthographic" to url to see this time')dirpath = os.path.join('D:', *datestr.split('/'))os.makedirs(dirpath, exist_ok = True)outpath = os.path.join(dirpath, '%s-wind-surface-level-gfs-1.0.json' % (timestr,))udata=u10.ravel()data[0]['data']=[]for i in range(len(udata)):data[0]['data'].append([u10.ravel().tolist()[i],v10.ravel().tolist()[i]])ds['data'] = data[0]['data']outf = open(outpath, 'w')
json.dump(ds,outf)
outf.close()

这个脚本正常放在编辑器里面运行即可。
运行完结束,会在你的输出路径下生成一个文件夹:
在这里插入图片描述

里面有个json数据:
在这里插入图片描述
数据信息比较简单,只有nx(经度的大小),ny(纬度的大小)以及最大值:

在这里插入图片描述

ok,以上就是完整的过程,最终将得到的json数据通过.js脚本运行就可以部署到网页上了,简单试了一下,大概如下图所示,可以根据需要自行更改设置:

在这里插入图片描述

水平有限,本人对于NCL脚本不太熟悉,可能有些代码写的比较复杂,欢迎指正!!!

						一个努力学习python的ocean er水平有限,欢迎指正!!!欢迎评论、收藏、点赞、转发、关注。关注我不后悔,记录学习进步的过程~~

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信网课答案公众号题库接口使用

微信网课答案公众号题库接口使用 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台&…

亚马逊审核 美国站安全带ASTMF1772安全绳攀岩绳EN892认证流程

1 登山锁扣定义 登山用锁扣是一种带弹簧门的金属环状物,用于在攀岩和登山时快速可逆地连接各部件,是安全系统关键的一部分。 登山用锁扣可用于将绳索固定到设备上,或者将两件或多件设备连接在一起。它们通常由铝或钢制成。这种锁扣具有不同…

ps2021神经ai滤镜无法使用,ps2021没法用神经元滤镜

如何解决ps2021 新版 AI神经滤镜不能用? 网上买正版,更新下就好了,盗版的都会有各种这样的问题。ps2021神经AI滤镜是需简要上传云端,由Adobe官方服务器人工智能运算的。 Ps2021版本新增了Ai神经元滤镜,它不是与软件一起安装的&…

谣言粉碎机?Python验证股市操盘口诀

更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流。 经常炒股的朋友,应该都听说过这段操盘口诀: 早上大跌要买,早上大涨要卖 下午大涨不追,下午大跌次日买 早上大跌不割,不涨不跌睡觉 我们随手百度,也能发现各大主流论坛,充斥着该口…

Spring入门——Eclipse实现HelloWorld程序

前言 疫情影响又延期开学,只能在家上上网课划划水,刚做完spring入门的一个小作业,来做个总结分享,我也是个刚入门的小白,还望大佬们指点。 步入主题 环境 eclipse/spring-tool-suite-3 jdk1.8.0_221 另外&#xff0…

Linux :mysql数据库自动备份

Linux :mysql数据库自动备份前言使用shell脚本进行数据库的定时备份确定备份数据库备份shell脚本定时shell脚本前言 当项目发布到服务器上后,接下来考虑到就是如何做好数据库的数据备份。为的就是防止服务器突然异常崩溃,而导致的数据丢失问…

使用上下游思维实现系统解耦

在软件开发领域,解耦这个词相信大家都不陌生。在面向对象的语境下,我们会应用SOLID原则来构建高内聚低耦合的应用,实现模块间的解耦;在复杂业务系统分析和建模时,会通过DDD的战略和战术设计帮助划分领域并实现分布式系…

Java毕业设计-校园活动赞助与宣传管理系统

🔥作者主页:疯狂行者🔥 💖✌java领域优质创作者,专注于Java技术领域技术交流✌💖 💖文末获取源码💖 精彩专栏推荐订阅:在 下方专栏👇🏻👇&#x1…

(分布式缓存)Redis持久化

一、RDB持久化 首先需要在Linux系统中安装一个Redis,如果尚未安装的同学,可以参考下面链接教程安装先: (73条消息) 单机安装Redis_其然乐衣的博客-CSDN博客 修改配置文件 创建一个数据 因为设置了只要5秒内有一次修改就会触发一次备份数据&am…

最全 Burp Suite 最新付费稳定版安装教程

介绍 Burp Suite是web应用程序渗透测试集成平台。从应用程序攻击表面的最初映射和分析,到寻找和利用安全漏洞等过程,所有工具为支持整体测试程序而无缝地在一起工作。 平台中所有工具共享同一robust框架,以便统一处理HTTP请求、持久性、认证、上游代理、日志记录、报警和可扩…

《QDebug 2022年8月》

一、Qt Widgets 问题交流 1.QWidget鼠标事件穿透 对于一些透明或者半透明的QWidget,可能需要点击其下方的按钮或其他组件,但是QWidget本身是会接收这些鼠标事件的,需要一些额外的处理。下面是百度到的一些方法: 方式A.设置setA…

Nacos下载和安装-windows

Nacos官网:https://nacos.io/zh-cn/ Nacos官方文档:https://nacos.io/zh-cn/docs/quick-start.html 一、下载 进入nacos官网,选择相应版本下载 github上nacos的zip资源,下载速度奇慢问题。 百度网盘:https://pan.b…

云原生游戏第 2 讲:OpenKruiseGame 设计理念详解

后疫情时代,游戏行业步入高质量发展期,游戏云原生化势在必行。不久前,针对游戏行业云原生落地的难点、游戏玩家服容器化的困境等问题,阿里云容器服务团队通过直播课程《云原生游戏第1讲:游戏玩家服容器化的困境与解法》…

PMP每日一练 | 考试不迷路-9.1(包含敏捷+多选)

!PMP最新考试通知 ! ​2022年6-8月落考考生可免费重考一次! 11月考试可以报名 ​(9月考试改到11月) 每日5道PMP习题助大家上岸PMP!!! ​1.项目经理接到一个开发新产品的项目,这…

一体式城市内涝监测站

一体式城市内涝监测站 计讯物联一体式城市内涝监测站,智能监测城市重点区域视频监控、水位、雨量、水量、流速等,目标数据实时上报云端,相关部门远程云平台同步监控(视频图像、水雨情、积水、排水工况),智能化管理系统实现城市防…

网课答案公众号题库接口使用详情

网课答案公众号题库接口使用详情 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台&…

ATF启动(四):BL31

1、BL2跳转BL31 在上一页在bl2_main函数中的最后一句是: smc(BL1_SMC_RUN_IMAGE, (unsigned long)next_bl_ep_info, 0, 0, 0, 0, 0, 0); 这个是触发smc操作。这个smc的handle在bl1的阶段就被制定了。 这个handle smc id是BL1_SMC_RUN_IMAGE。对应的handle函数是…

猿创征文|全方位快速了解事务的4种隔离级别

MySQL事务隔离级别事务以及事务的隔离级别1. 概念2. 事务的特性3. 事务的隔离级别3.1 Q:那么为什么事务需要有隔离级别呢?3.2 Q:那么什么事务并发会产生的问题?总结:不可重复读的和幻读很容易混淆3.3 Q:事务…

Dubbo - 远程debug

由于Dubbo的特性是远程调用,因此正常来说无法在本地进行debug 因为你调用的方法在别台机器上跑,你只能知道给他的input和他返回的结果,但没办法知道这个接口内部的执行,所以也没办法在裡面打断点进行debug 就算在本地有dubbo代码…

UE4 C++学习 浅析UProperty属性说明符

浅析UE4 UPROPERTY本文就 UProperty是什么?以及UProperty怎么用?做一个简单的总结。 什么是UPROPERTY? 首先看下官方的解释: 感觉还是比较模糊没看懂有什么用,我们接着往下看要知道UPROPERTY有什么用,我们首先要知道反射(Refection)这个机制。这个机制在Java和C#等语言都…