一、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. Vue上传图片预览组件

    父组件: <template> <div> <h4>基于Vue.2X的html5上传图片组件</h4> <div style="widt ...

  2. Python3爬虫:利用Fidder抓取手机APP的数据

    1.什么是Fiddler? Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,ht ...

  3. 【转】深入理解line-height

    原文: http://www.cnblogs.com/dolphinX/p/3236686.html https://www.cnblogs.com/yangjie-space/p/4858132.h ...

  4. 解决webstom failed to change read-only files

    我百思不得其解的是,为何我的文件不让我更改,变成了只读模式,后来我仔细回忆了一下,原来是因为我使用了root权限,来安装thinkjs之后,webstom没有root权限,所以我使用root,在终端敲 ...

  5. javascript的冒泡排序, 快速排序, 选择排序, 插入排序

    冒泡排序, 最经典的排序, 把比较大的数字往后放, 和选择排序恰恰相反: <!DOCTYPE html> <html lang="en"> <head ...

  6. ArcGIS10.3新体验

    自2012年ESRI更新10.2以后,终于在2014年12月8日,官方推出了10.3版本,前几天忙于抢票,今天终于可以在虚拟机中体验一把. 由于使用的是预览版,所有安装包只有800多M,包括桌面核心程 ...

  7. CAD中批量打印

    同事在网上找各种软件来实现CAD图的批量打印,总是问题多多.于是,我想到一个更方便的解决方法,即只要我将一个打印出来,然后就可以用批量处理来实现. 1.在CAD中输入plot命令(或快捷键Ctrl+P ...

  8. Jenkins 集成Unity3D Xcode

    如果Mac 上没有安装brew.先安装:ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)& ...

  9. C++ 第四课:ASCII 码表

    下面的 ASCII 码表包含数值在0-127之间的字符的十进制.八进制以及十六进制表示. 十进制 八进制 十六进制 字符 描述 0 0 00 NUL   1 1 01 SOH start of hea ...

  10. Android——gradle files have changed since last project sync

    这个报错,会引起锁死代码,不能编辑.不能编译等情况.    主要原因是:上一次修改gradle后,添加依赖失败.可能引进了过期.无效的依赖. 解决办法:把最近一次添加的依赖删除,重新编译项目.然后上网 ...