利用PYTHON将netcdf(.nc)格式数据转换成JSON GeoJSON
PYTHON netcdf(.nc)格式数据转JSON GeoJSON
- 代码
- 代码解释
代码
废话不多,直接上代码
#%%
import xarray as xr
import json
from datetime import datetime,timedelta
import numpy as np
from glob import glob# %%
def gen_data_dict(data_array, reftime, parameterNumber, parameterNumberName):"""data_array: an xarray data with two dimensions;parameterNumber: the number the same as example data;parameterNumberName: the same as example data."""numberPoints = np.size(data_array)nx, ny = data_array.shape[:]parameterNumberName = 'U_component_of_current'parameterNumber = 2lo1 = data_array['lon_uv'].min()la1 = data_array['lat_uv'].max()lo2 = data_array['lon_uv'].max()la2 = data_array['lat_uv'].min()dx = np.gradient(data_array['lon_uv']).mean()dy = np.gradient(data_array['lat_uv']).mean()header_dict = {'discipline': 10,'disciplineName': 'Oceanographic_products','center': 0,'centerName': 'Ocean Modeling and Observation Laboratory','refTime': reftime,'significanceOfRT': 0,'significanceOfRTName': 'Analysis','parameterCategory': 1,'parameterCategoryName': 'Currents','parameterNumber': parameterNumber,'parameterNumberName': parameterNumberName,'parameterUnit': 'm.s-1','forecastTime': 0,'surface1Type': 160,'surface1TypeName': 'Depth below sea level','surface1Value': 15,'numberPoints': numberPoints,'shape': 0,'shapeName': 'Earth spherical with radius = 6,367,470 m','scanMode': 0,'nx': nx,'ny': ny,'lo1': float(lo1),'la1': float(la1),'lo2': float(lo2),'la2': float(la2),'dx': dx,'dy': dy}nan_to_none = np.fliplr(np.where(np.isnan(data_array), None, data_array))data_list = list(nan_to_none.ravel('F'))return {'header':header_dict,'data':data_list}#%%
if __name__ == '__main__':file_path = '20090101-20090103\*.nc'file_list = glob(file_path)file_list.sort()for file_name in file_list:ds = xr.open_dataset(file_name,decode_times=False)#%% -----------------covert time --------------matlab_datenum = ds['time'].values[0]# file_time = datetime.fromordinal(int(matlab_datenum)) + timedelta(days=matlab_datenum%1) - timedelta(days = 366)file_time = datetime.fromordinal(int(matlab_datenum)) - timedelta(days = 366)print(file_time)# ds['time'] = file_timereftime = file_time.strftime('%Y-%m-%dT00:00:00.000Z')# step = 10depth_layer = 14u = np.squeeze(ds['u'][depth_layer])parameterNumberName = 'U_component_of_current'parameterNumber = 2json_u = gen_data_dict(u, reftime,parameterNumber, parameterNumberName)v = np.squeeze(ds['v'][depth_layer])parameterNumberName = 'V_component_of_current'parameterNumber = 3json_v = gen_data_dict(v, reftime,parameterNumber, parameterNumberName)json_list = [json_u, json_v]date_str = file_time.strftime('%Y%m%d')if depth_layer==0:surface = 'surface'else:# surface = f'{depth_layer}m'surface = '100m'#%% ------------------output-------------------with open(f'public\data\oscar\{date_str}-{surface}-currents-oscar-0.33.json', 'w') as fp:json.dump(json_list, fp)# ds2 = xr.combine_by_coords([u,v])# ds2.to_netcdf(f'20090101-20090103\ROMS_0_{date_str}.nc')print('Done')
代码解释
首先是定义了一个函数,要求输入的第一个参数为一个二维的矩阵,实际上是个xarray的dataarray,对xarray不熟悉的可以参阅 官方文档 ,第二和第三个参数是按照给的geojson例子设定的,在本例子中u v方向分量的number分别是2和3,第三个参数是变量描述名。函数的功能是计算nx, ny, dx, dy和转换数据等功能,注意使用ravel转换成一维数据时要使用参数’F’, 才是符合JS读取的顺序的。
在实际运行中,利用xarray把数据从文件夹里挨个读取出来,然后把nc数据的时间转换一下,如果读取的时间是cftime的格式则不需要转换,可以直接读取得到datetime格式的数据,然后提取某一深度的进行转换,代码中给的是第14层,也可以加多一个对深度的循环进行循环读取,随后调用函数即可。单个JSON数据的格式其实是:
{'header':header_dict,'data':data_list}
但因为要把u v分量同时写进一个JSON中,所以则需要两个字典组成一个列表,因此使用了
json_u = gen_data_dict(u, reftime,parameterNumber, parameterNumberName)
json_v = gen_data_dict(v, reftime,parameterNumber, parameterNumberName)
json_list = [json_u, json_v]
最后利用json.dump的方式写入文件就完成了转换。
利用PYTHON将netcdf(.nc)格式数据转换成JSON GeoJSON相关推荐
- python批量实现labelImg标注的 xml格式数据转换成 txt格式保存
labelImg标注的 xml格式数据如下: 单个xml文件数据打开如下: python实现labelImg标注的 xml格式数据转换成 txt格式数据的代码xml2txt.py如下: # -*- c ...
- 基于Python+GDAL实现nc格式转geotiff格式
基于Python+GDAL实现nc格式转geotiff格式 1. 目的 2. 版本 3. 基础知识 3.1 什么是nc文件? 3.2 基于Python处理nc文件需要用到的库 4. 程序示例 5. ...
- python 根据word生成ppt_未明学院:利用Python将Wordamp;PPT批量转成PDF
Python中的许多库,像一个个具有不同功能的"工具",能帮助我们解决工作中的不同问题,提高工作效率! 本期将继续为大家放松python中的实用技能,本期的主题是:利用Python ...
- python读取csv和txt数据转换成向量的实例_python_脚本之家
最近写程序需要从文件中读取数据,并把读取的数据转换成向量. 查阅资料之后找到了读取csv文件和txt文件两种方式,下面结合自己的实验过程,做简要记录,供大家参考: 1.读取csv文件的数据 使用上面的 ...
- android 将数据转换成JSON数据格式并使用JSONObject解析JSON格式的数据
比起XML文件解析,JSON数据解析的有点在于他的体积小,在网络上传输的时候可以更省流量.同时它也有缺点,Json数据的语义性较差,看起来没有XML直观.现在JSON已经被大多数开发人员所接受,在网络 ...
- 把php数据转成json格式转换,php将从数据库中获得的数据转换成json格式并输出的方法...
php将从数据库中获得的数据转换成json格式并输出的方法 如下所示: header('content-type:application/json;charset=utf8'); $results = ...
- TensorFlow学习笔记之 bmp格式、txt格式数据转换成tfrecord 格式
目录 一.前言 二.bmp 格式数据转换成 tfrecord 格式的代码 三.txt 格式数据转换成 tfrecord 格式的代码 一.前言 之前我们讲过了关于 tfrecord 格式的相关内容,在这 ...
- 利用Python脚本实现批量格式转换(视频转音频)
利用Python脚本实现批量格式转换(视频转音频) 利用ffmpeg工具和Python,实现批量视频/音频格式转换.本例只给出视频转音频(.wav)方法,更多格式转换可百度ffmpeg用法,修改代码中 ...
- 将Excel中的数据转换成JSON格式
将Excel中的数据转换成JSON格式 第一步:下载jxl.jar包 <dependency> <groupId>net.sourceforge.jexcelapi</g ...
最新文章
- 调用支付宝接口android最新,Android 外接sdk之支付宝
- 十七、字符类 GPIOS
- 冀教版五年级计算机教学计划,冀教版五年级科学教学计划
- 微信抢红包应用要哭了,让我们来给微信红包设计一个新交互
- 记一次httpclient调用失败
- Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限
- Log4j 2配置与IntelliJ IDEA控制台颜色
- 中国国家高速公路网详细布局
- (117)System Verilog类继承详解
- (16)FPGA面试题MOORE 与 MEELEY状态机
- 贝索斯前妻再捐2.81亿美元
- sysbench mysql 测试_sysbench MySQL测试例子
- 一个模型搞定十大自然语言任务:NLP全能选手来了 | 论文+代码
- Python列表常用操作,浅拷贝及深拷贝
- “对比Excel”系列再添新成员,手把手教你用Python实现报表自动化!
- 阿里云oss完成简单上传
- ArcGIS 9.3 For JavaScript API 学习笔记
- qq截图和ps相结合的功能
- HeadFirstJava——10_数字与静态
- 雷达多普勒频率计算公式_雷达导论PART-III.5 脉冲雷达的工作机理