grib文件
一、grib文件简介
WMO是世界气象组织,world meteorology organization。
GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式。最初GRIB表示“二进制格点”(GRIdded Binary),后来扩展为“二进制的通用规则分布信息”(General Regularly-distributed Information in Binary form)。
GRIB 是与计算机无关的压缩的二进制编码,主要用来表示数值天气预报的产品资料。现行的GRIB 码版本有GRIB1 和GRIB2 两种格式。 GRIB2较之GRIB1具有更多优点而被广泛使用。如:表示多维数据、模块性结构、支持多种压缩方式、IEEE标准浮点表示法等。
二、grib相关的库
1、python
grib文件解析有三种方式,pygrib、wgrib、pupygrib。
pupygrib是纯python版的grib文件解析方式,但是它只解析了个大概,并没有解析section7中的数据。
wgrib本身是用C语言实现的库,python中的wgrib是在命令行的基础上做了一些封装。
pupygrib一个例子
···python
import pupygrib as g
filepath = r"C:\Users\weidiao\Desktop\NAFP_T639_1_FTM-38-NEHE-WIU-281X281-100-1000-999998-002-999998-2018111200-216.GRB"
def parse(filepath):
messages = list(g.read(open(filepath, mode='rb')))
if len(messages) > 1:
raise Exception("I didn't expect len(message)>1,but now len(messages)={}".format(len(messages)))
message = messages[0]
for section_id, section in enumerate(message):
print('=' * 10)
print('section', section_id)
for attr in dir(section):
if not attr.startswith('__'):
print(attr, getattr(section, attr))
if not message[5].dataRepresentationTemplateNumber == 40:
# 只能解压jpeg2000格式的文件
raise Exception("cannot parse dataRepresentationTemplateNumber {}".format(message[5].dataRepresentationTemplateNumber))
return message[7]._data[6:]
def get_data(filepath):
data = parse(filepath)
print('\n' * 3)
print(len(data))
print(dir(data))
print(data[:40].tolist())
parse(filepath)
···
2、java
jgrib已经不活跃了:http://jgrib.sourceforge.net/
jgribx是jrib的替代品 https://github.com/spidru/JGribX
github上有好多,但是质量良莠不齐https://github.com/search?q=grib
三、grib文件格式简介
grib文件包含从0到8共9个section,每个section用途不一样。
section0有16个字节,分别表示GRIB(4字节的字符串),接下来5-6字节保留备用,第7个字节表示discipline也就是所遵守的规范,第8字节表示版本号,一般为2。第9到第16字节共8个字节(一个long型数字)表示整个GRIB message所占字节数。
总之,section0描述的是整个message的信息,是统领全文的作用。
section1至少有21字节,表示一堆版本号和时间。
总之,section1描述的也是数据格式的元信息。
section2是给用户自己用的,用户可以在这里自由发挥。
section3是网格定义区域。
section5是数据格式描述区域,描述了section7中数据的压缩方式。
section7是最重要的部分,从第6个字节开始存储的是压缩的字节数据。
NCEP 官网文档
http://www.nco.ncep.noaa.gov/pmb/docs/grib2/grib2_doc/
四、jpeg2000
JPEG 全名为 Joint Photographic Experts Group,它是一个在国际标准组织(ISO)下从事静态图像压缩标准制定的委员会。它制定出了第一套国标静态图像压缩标准:ISO 10918-1 就是我们俗称的 JPEG 了。由于JPEG优良的品质,使得它在短短的几年内就获得极大的成功,目前网站上百分之八十的图像都是采用JPEG的压缩标准。然而,随著多媒体应用领域的激增,传统JPEG压缩技术已无法满足人们对多媒体图像资料的要求。因此,更高压缩率以及更多新功能的新一代静态图像压缩技术 JPEG 2000 就诞生了。JPEG 2000 正式名称为 “ISO 15444” ,同样是由JPEG 组织负责制定。自1997年三月开始筹划,但这几年间,在算法选取问题上耽误了不少时间,人们普遍预计要到2000年十二月JPEG2000才能制定完成! 但在2000年3 月的东京的一个会议上,可能是由于数字照相机厂商们施加压力,规定基本编码系统的最终协议草案提前出台,终于不用改名为 JPEG2001 了。
JPEG 2000是基于小波变换的图像压缩标准,由Joint Photographic Experts Group组织创建和维护。JPEG 2000通常被认为是未来取代JPEG(基于离散余弦变换)的下一代图像压缩标准。JPEG 2000文件的副档名通常为.jp2,MIME类型是image/jp2。
JPEG2000的压缩比更高,而且不会产生原先的基于离散余弦变换的JPEG标准产生的块状模糊瑕疵。JPEG2000同时支持有损压缩和无损压缩。另外,JPEG2000也支持更复杂的渐进式显示和下载。
JPEG2000是国际标准化组织(ISO)发布的标准,文档代码为ISO/IEC 15444-1:2000。虽然JPEG2000在技术上有一定的优势,但是到目前为止(2006年),网络上采用JPEG2000技术制作的图像文件数量仍然很少,并且大多数的浏览器仍然没有内置支持JPEG2000图像文件的显示。但是,由于JPEG2000在无损压缩下仍然能有比较好的压缩率,所以JPEG2000在图像品质要求比较高的医学图像的分析和处理中已经有了一定程度的广泛应用。
JPEG2000的优点
1、JPEG2000 作为JPEG升级版,高压缩(低码率)是其目标,其压缩率比 JPEG 高约 30% 左右。
2、JPEG2000 同时支持有损和无损压缩,而 JPEG 只能支持有损压缩。因此它适合保存重要图片。
3、JPEG2000 能实现渐进传输,这是JPEG2000的一个极其重要的特征。这也就是我们对 GIF 格式图像常说的“渐现”特性。它先传输图像的轮廓,然后逐步传输数据,不断提高图像质量,让图象由朦胧到清晰显示,而不必是像现在的 JPEG 一样,由上到下慢慢显示。
4、JPEG2000 支持所谓的“感兴趣区域”特性,你可以任意指定图像上你感兴趣区域的压缩质量,还可以选择指定的部份先解压缩。这样我们就可以很方便的突出重点了。
JPEG2000存在版权和专利的风险。这也许是目前JPEG2000技术没有得到广泛应用的原因之一。JPEG2000标准本身是没有授权费用,但是,因为编码的核心部分的各种演算法被大量注册专利,所以一般认为,不太可能避开这些专利费用开发出免授权费的商用编码器。
五、glymur并不好用
使用jpg压缩glymur自带j2k图片,结果压缩之后比j2k要小,这说明jpeg2000似乎不太好用,不知是glymur的问题还是jpeg2000的问题。
import glymur
jp2file = glymur.data.nemo() # just a path to a JPEG2000 file
print(jp2file)
jp2 = glymur.Jp2k(jp2file)
fullres = jp2[:]
print(fullres.shape)
io.imsave('nemo.jpg', fullres)
做了其他实验也是这样。
import os
import pylab as plt
from skimage import io
import glymur
def transform(filepath):
target = os.path.join(filepath, 'target')
if not os.path.exists(target):
os.mkdir(target)
for i in filter(lambda file: os.path.isfile(os.path.join(filepath, file)), os.listdir(filepath)):
img = io.imread(os.path.join(filepath, i))
jp = glymur.Jp2k(os.path.join(target, i + '.j2k'), data=img)
print(jp)
def show_difference(filepath):
target = os.path.join(filepath, 'target')
for i in filter(lambda file: os.path.isfile(os.path.join(filepath, file)), os.listdir(filepath)):
original = io.imread(os.path.join(filepath, i))
jp_path = os.path.join(target, i + '.j2k')
jp = glymur.Jp2k(jp_path)
fig, (one, two) = plt.subplots(1, 2)
one.imshow(original)
one.set_title('original {}'.format(os.path.getsize(os.path.join(filepath, i))))
two.imshow(jp[:])
two.set_title('compressed {}'.format(os.path.getsize(jp_path)))
plt.show()
transform('imgs')
print('transform over')
show_difference('imgs')
参考资料
百度百科
https://baike.baidu.com/item/GRIB2/13466125?fr=aladdin
wmo grib2官网文档
http://www.wmo.int/pages/prog/www/WMOCodes/WMO306_vI2/LatestVERSION/LatestVERSION.html
pupygrib官网 https://notabug.org/mjakob/pupygrib
pupygrib pypi https://pypi.org/project/pupygrib/
wgrip官网
http://www.cpc.ncep.noaa.gov/products/wesley/wgrib.html
wgrip用法
https://blog.csdn.net/m0_37600626/article/details/79311129
python glymur解析jpeg2000
https://glymur.readthedocs.io/en/latest/
pyopenjpeg已经不维护了,作者推荐使用glymur
https://github.com/khughitt/pyopenjpeg
glymur和pyopenjpeg是在openjpeg上用python封装了一层,它需要依赖openjpeg动态链接库,所以我们需要把这个动态链接库放到全局路径下。
zygrib:http://www.zygrib.org/#section_windows
zygrib是一个可视化工具。
openjpeg是一个用C语言实现的jpeg2000压缩、解压缩算法,非常高端的算法,一般人实现不了,这整个库都是为了一个jpeg2000算法。
https://www.openjpeg.org/
jpeg2000算法-百度百科
https://baike.baidu.com/item/JPEG 2000/8097196?fr=aladdin
jpeg2000编解码原理
https://blog.csdn.net/ytang_/article/details/76571635
jpeg和jpeg2000
https://blog.csdn.net/lg1259156776/article/details/49010219
java解析grib
http://jgrib.sourceforge.net/
https://mvnrepository.com/search?q=grib
grib文件的更多相关文章
- ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写
参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...
- ecCodes 学习 利用ecCodes Python API对GRIB文件进行读写
参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...
- GRIB格式转换心得(转自博客:http://windforestwing.blog.163.com/blog/static/19545412007103084743804/)
1.wgrib的使用 在cmd命令行下键入wgrib后即可察看wgrib相关命令参数,简要介绍如下: l Inventory/diagnostic–output selections 详 ...
- python grib气象数据可视化
基于Python的Grib数据可视化 利用Python语言实现Grib数据可视化主要依靠三个库——pygrib.numpy和matplotlib.pygrib是欧洲中期天气预报中心 ...
- wgrib读grib数据
该文章来自博客:http://windforestwing.blog.163.c ... 412007103084743804/如有错误 ,大家及时指出啊!ps:meteoinfo可以直接处理grib ...
- python读取grib grib2气象数据
如何读取GRIB数据?快看Python大神整理的干货! 橙子心法 百家号17-11-0116:30 GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式,主要用来表示数值天气预报的产品 ...
- python 读取grib \grib2
一.环境准备(1).python3环境 (2).wgirb工具(用于读取grib1文件),下载地址: ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib (3).wgi ...
- gfs下载文件较大,可以分区域分变量下载
一.下载 所有字段的GFS预报(大致有325个字段),1度的文件有1G多,0.5度的3.5G左右. 若每天下载0.6.12.18四个发布点的数据,那是很费时费力的.而且经常会被IDS/IPS设备 ...
- windows python读取grib2数据
一.环境准备 (1).python3环境 (2).wgirb工具(用于读取grib1文件),下载地址: ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib (3).wg ...
随机推荐
- 文本分类需要CNN?No!fastText完美解决你的需求(前篇)
http://blog.csdn.net/weixin_36604953/article/details/78195462?locationNum=8&fps=1 文本分类需要CNN?No!f ...
- linux命令学习——md5sum
1.简介 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5 全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意长度的信息逐位进行计算,产生一 ...
- Web项目MySQL配置文件运维
root@mysqltest:/etc/mysql/mysql.conf.d# cat mysqld.cnf # # The MySQL database server configuration f ...
- 前端框架 Vue 初探
一.前言 前几日使用微信网页版时,好奇这个网页用了什么前端框架.用Chrome的开发人员模式一探到底,发现原来用了一个名叫 Angular 的框架.好吧,既然微信用了.那我也最好还是看看.等等,你这篇 ...
- Express application generator的使用
首先拷贝express官网的一篇文章: (http://expressjs.com/en/starter/generator.html ) Express application generator ...
- codeforces 551 C GukiZ hates Boxes
--睡太晚了. ..脑子就傻了-- 这个题想的时候并没有想到该这样-- 题意大概是有n堆箱子从左往右依次排列,每堆ai个箱子,有m个人,最開始都站在第一个箱子的左边, 每个人在每一秒钟都必须做出两种选 ...
- Awk使用及站点日志分析
Awk使用及站点日志分析 Awk简单介绍 概述 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入, ...
- bootstrap找不到glyphicons-halflings-regular.woff2
在vue2的项目中是用bootstrap,提示下面的字体文件找不到 http://localhost:8080/static/fonts/glyphicons-halflings-regular.wo ...
- 算法笔记_225:数字密码发生器(Java)
目录 1 问题描述 2 解决方案 1 问题描述 在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如 ...
- hdu 4336 概率dp + 状压
hdu 4336 小吃包装袋里面有随机赠送一些有趣的卡片,如今你想收集齐 N 张卡片.每张卡片在食品包装袋里出现的概率是p[i] ( Σp[i] <= 1 ), 问你收集全部卡片所需购买的食品数 ...