一、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文件的更多相关文章

  1. ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  2. ecCodes 学习 利用ecCodes Python API对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  3. GRIB格式转换心得(转自博客:http://windforestwing.blog.163.com/blog/static/19545412007103084743804/)

    1.wgrib的使用 在cmd命令行下键入wgrib后即可察看wgrib相关命令参数,简要介绍如下: l        Inventory/diagnostic–output selections 详 ...

  4. python grib气象数据可视化

    基于Python的Grib数据可视化           利用Python语言实现Grib数据可视化主要依靠三个库——pygrib.numpy和matplotlib.pygrib是欧洲中期天气预报中心 ...

  5. wgrib读grib数据

    该文章来自博客:http://windforestwing.blog.163.c ... 412007103084743804/如有错误 ,大家及时指出啊!ps:meteoinfo可以直接处理grib ...

  6. python读取grib grib2气象数据

    如何读取GRIB数据?快看Python大神整理的干货! 橙子心法 百家号17-11-0116:30 GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式,主要用来表示数值天气预报的产品 ...

  7. python 读取grib \grib2

    一.环境准备(1).python3环境 (2).wgirb工具(用于读取grib1文件),下载地址:  ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib (3).wgi ...

  8. gfs下载文件较大,可以分区域分变量下载

       一.下载 所有字段的GFS预报(大致有325个字段),1度的文件有1G多,0.5度的3.5G左右. 若每天下载0.6.12.18四个发布点的数据,那是很费时费力的.而且经常会被IDS/IPS设备 ...

  9. windows python读取grib2数据

    一.环境准备 (1).python3环境 (2).wgirb工具(用于读取grib1文件),下载地址:  ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib (3).wg ...

随机推荐

  1. CSS-图像映射

    图像映射是将一些区域变成热点,我们在网上获取搜索图片,图片上会有关于任务的简短信息介绍,还有一个接触更多的就是QQ空间的相册,浏览QQ空间照片鼠标滑动到人物头像的时候让你选择标记人物,都是将图片和内容 ...

  2. 解决电脑上PPT频繁刷新的问题

    操作步骤: 桌面鼠标右击--->屏幕分辨率-----> 高级设置 ----->监视器----->颜色----->选择:增强色(16位)--->确定完成

  3. 页面显示This is the initial start page for the WebDriver server.的解决办法

    今天在做项目的时候,遇到一个奇怪的问题,打开浏览器是正常的,但是页面不会跳转到需要的URL,而是提示一行白字,如图: 反复研究了脚本,没有问题啊,但是就是不跳转. 后来查了下,在某论坛上找到了答案: ...

  4. SNS网站的用户流失率怎么会高得如此惊人?

    作者:黄绍麟 原51.com高管 用户典型的SNS体验 甲先生是个普通白领,白天工作使用互联网找资料连络客户,下班后回家偶而会上网闲逛.互联网是他日常接触的媒介,但是在他生命中这个东西并不显得特别重要 ...

  5. myeclipse单元测试

    步骤:1.新建new-other 2.选择Junit Test Case 3.注意红线圈出部分 4.选择需要测试的方法5.Finish后出现如下 示例代码: package com.jrgc.dao; ...

  6. 【高德地图Android SDK】视频教学

    前两天参加了高德在北航举办的公开课,感觉非常不错.完成老师布置的作业之后,还顺利地拿到了高德开发者认证证书!! 现在来跟大家分享一下,如何快速学习[高德地图Android SDK]的开发.一天包会!连 ...

  7. UiTextField 限制输入长度

    -(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...

  8. javascript基于原型的语言的特点

    一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  “原型对象”是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己 ...

  9. vSphere Data Protection – a new backup product included with vSphere 5.1

    August 27, 2012 By Vladan SEGET This new backup product replaces VMware Data Recovery, which has bee ...

  10. POI3.10读取Excel模板填充数据后生成新的Excel文件

    private final DecimalFormat df = new DecimalFormat("#0.00"); public void test(){ String fi ...