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 ...
随机推荐
- CSS-图片不变形设置
不管网页做的美还是丑,有一个问题始终是无法躲避的,就是有的时候会遇到图片变形的问题,之前遇到过这种问题解决过,不过还是整体的重新研究了一下图片,其中主要涉及到的知识点就是max-width和max-h ...
- 魅族推送 简介 集成 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 超酷实用的jQuery焦点图赏析及源码
焦点图应用在现代网页中使用十分广泛,有注重简单小巧的,也有注重华丽美观的,大部分jQuery焦点图都可以滑动和切换图片,并且在切换图片时产生不同的动画特效.今天我们要分享一些超酷而且实用的jQuery ...
- postgres配置只能让某一个ip的主机登陆
https://stackoverflow.com/questions/11753296/configure-postgresql-to-work-for-only-localhost-or-spec ...
- Structured Streaming编程向导
简介 Structured Streaming is a scalable and fault-tolerant stream processing engine built on the Spark ...
- VS2013第一个应用boost的程序
下载boost binary https://sourceforge.net/projects/boost/files/boost-binaries/1.67.0_b1/ 由于我用的是Windows1 ...
- CodeForces 569B Inventory 货物编号
原题: http://codeforces.com/contest/569/problem/B 题目: Inventory time limit per test1 second memory lim ...
- WIN7系统开题提示loli.vbs 操作超时怎么办
这个是魔兽争霸的一个病毒,但是该病毒没有任何危害性,只是作为检测进入房间的地图是否含有作弊脚本,主动提供了清除工具 搜索loli,删除所有bat和exe,vbs文件 如果魔兽争霸3安装目录存在 ...
- Go语言中Path包用法
// path package main import ( "fmt" "os" "path" "path/filepath&qu ...
- Go语言中的RPC调用
首先,说一下目录结构: 一.HttpRPC 1.建立服务文件 /*Go RPC的函数只有符合下面的条件才能被远程访问,不然会被忽略,详细的要求如下: 函数必须是导出的(首字母大写) 必须有两个导出类型 ...