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相关推荐

  1. python批量实现labelImg标注的 xml格式数据转换成 txt格式保存

    labelImg标注的 xml格式数据如下: 单个xml文件数据打开如下: python实现labelImg标注的 xml格式数据转换成 txt格式数据的代码xml2txt.py如下: # -*- c ...

  2. 基于Python+GDAL实现nc格式转geotiff格式

    基于Python+GDAL实现nc格式转geotiff格式 1. 目的 2. 版本 3. 基础知识  3.1 什么是nc文件?  3.2 基于Python处理nc文件需要用到的库 4. 程序示例 5. ...

  3. python 根据word生成ppt_未明学院:利用Python将Wordamp;PPT批量转成PDF

    Python中的许多库,像一个个具有不同功能的"工具",能帮助我们解决工作中的不同问题,提高工作效率! 本期将继续为大家放松python中的实用技能,本期的主题是:利用Python ...

  4. python读取csv和txt数据转换成向量的实例_python_脚本之家

    最近写程序需要从文件中读取数据,并把读取的数据转换成向量. 查阅资料之后找到了读取csv文件和txt文件两种方式,下面结合自己的实验过程,做简要记录,供大家参考: 1.读取csv文件的数据 使用上面的 ...

  5. android 将数据转换成JSON数据格式并使用JSONObject解析JSON格式的数据

    比起XML文件解析,JSON数据解析的有点在于他的体积小,在网络上传输的时候可以更省流量.同时它也有缺点,Json数据的语义性较差,看起来没有XML直观.现在JSON已经被大多数开发人员所接受,在网络 ...

  6. 把php数据转成json格式转换,php将从数据库中获得的数据转换成json格式并输出的方法...

    php将从数据库中获得的数据转换成json格式并输出的方法 如下所示: header('content-type:application/json;charset=utf8'); $results = ...

  7. TensorFlow学习笔记之 bmp格式、txt格式数据转换成tfrecord 格式

    目录 一.前言 二.bmp 格式数据转换成 tfrecord 格式的代码 三.txt 格式数据转换成 tfrecord 格式的代码 一.前言 之前我们讲过了关于 tfrecord 格式的相关内容,在这 ...

  8. 利用Python脚本实现批量格式转换(视频转音频)

    利用Python脚本实现批量格式转换(视频转音频) 利用ffmpeg工具和Python,实现批量视频/音频格式转换.本例只给出视频转音频(.wav)方法,更多格式转换可百度ffmpeg用法,修改代码中 ...

  9. 将Excel中的数据转换成JSON格式

    将Excel中的数据转换成JSON格式 第一步:下载jxl.jar包 <dependency> <groupId>net.sourceforge.jexcelapi</g ...

最新文章

  1. 调用支付宝接口android最新,Android 外接sdk之支付宝
  2. 十七、字符类 GPIOS
  3. 冀教版五年级计算机教学计划,冀教版五年级科学教学计划
  4. 微信抢红包应用要哭了,让我们来给微信红包设计一个新交互
  5. 记一次httpclient调用失败
  6. Linux:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限
  7. Log4j 2配置与IntelliJ IDEA控制台颜色
  8. 中国国家高速公路网详细布局
  9. (117)System Verilog类继承详解
  10. (16)FPGA面试题MOORE 与 MEELEY状态机
  11. 贝索斯前妻再捐2.81亿美元
  12. sysbench mysql 测试_sysbench MySQL测试例子
  13. 一个模型搞定十大自然语言任务:NLP全能选手来了 | 论文+代码
  14. Python列表常用操作,浅拷贝及深拷贝
  15. “对比Excel”系列再添新成员,手把手教你用Python实现报表自动化!
  16. 阿里云oss完成简单上传
  17. ArcGIS 9.3 For JavaScript API 学习笔记
  18. qq截图和ps相结合的功能
  19. HeadFirstJava——10_数字与静态
  20. 雷达多普勒频率计算公式_雷达导论PART-III.5 脉冲雷达的工作机理

热门文章

  1. 如何联系二手重型货架回收公司上门回收重型货架
  2. 知名大厂大数据平台搭建案例分享
  3. ThinkPad R400 windows 2008 下网卡、蓝牙驱动程序安装过程记录
  4. 北京电视台《解码区块链》 ——国内首家真正的区块链商品溯源应用来了!
  5. LCP 16. 游乐园的游览计划
  6. metasploitable3靶机
  7. 有7克,2克砝码各一个,天平一只,如何只用这些物品三次将140克的盐分成50、90克各一份?
  8. 【超分辨率】3分钟带你读懂
  9. 走向灵活软件之路-面向对象的六大原则
  10. 一个代码搞定所有花括号公式形式