博客小序:NetCDF格式数据广泛应用于科学数据的存储,最近几日自己利用python处理了一些NetCDF数据,特撰此博文以记之。

参考博客:

https://www.cnblogs.com/shoufengwei/p/9068379.html

https://blog.csdn.net/EWBA_GIS_RS_ER/article/details/84076201

http://www.clarmy.net/2018/11/01/python%E8%AF%BB%E5%8F%96nc%E6%96%87%E4%BB%B6%E7%9A%84%E5%85%A5%E9%97%A8%E7%BA%A7%E6%93%8D%E4%BD%9C/

1.NetCDF数据简介

NetCDF官方文档

https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_introduction.html

2.Python对NetCDF数据基本操作

python中专门用于处理NetCDF数据的库为netCDF4库,需在自己的python路径中安装

In[1]:import netCDF4 as nc #模块导入 

In[2]:data = 'F:\\data___python_test\\nc_to_tif\\nc\\ndvi3g_geo_v1_1990_0106.nc4'
nc_data = nc.Dataset(data) #利用.Dataset()方法读取nc数据
nc_data
Out[2]: <type 'netCDF4._netCDF4.Dataset'> In[3]:nc_data.variables #以存储ndvi的nc数据为例,查看nc文件包含的变量
Out[3]:OrderedDict([(u'lon', <type 'netCDF4._netCDF4.Variable'>
float64 lon(lon)
unlimited dimensions:
current shape = (4320,)
filling on, default _FillValue of 9.96920996839e+36 used),
(u'lat', <type 'netCDF4._netCDF4.Variable'>
float64 lat(lat)
unlimited dimensions:
current shape = (2160,)
filling on, default _FillValue of 9.96920996839e+36 used),
(u'time', <type 'netCDF4._netCDF4.Variable'>
float64 time(time)
unlimited dimensions:
current shape = (12,)
filling on, default _FillValue of 9.96920996839e+36 used),
(u'satellites', <type 'netCDF4._netCDF4.Variable'>
int16 satellites(time)
unlimited dimensions:
current shape = (12,)
filling on, default _FillValue of -32767 used),
(u'ndvi', <type 'netCDF4._netCDF4.Variable'>
int16 ndvi(time, lat, lon)
units: 1
scale: x 10000
missing_value: -5000.0
valid_range: [-0.3 1. ]
unlimited dimensions:
current shape = (12, 2160, 4320)
filling on, default _FillValue of -32767 used),
(u'percentile', <type 'netCDF4._netCDF4.Variable'>
int16 percentile(time, lat, lon)
units: %
scale: x 10
flags: flag 0: from data flag 1: spline interpolation flag 2: possible snow/cloud cover
valid_range: flag*2000 + [0 1000]
unlimited dimensions:
current shape = (12, 2160, 4320)
filling on, default _FillValue of -32767 used)]) In[4]:ndvi = nc_data.variables['ndvi'] #单独查看nc文件中存储的变量信息
ndvi
Out[4]:<type 'netCDF4._netCDF4.Variable'>
int16 ndvi(time, lat, lon)
units: 1
scale: x 10000
missing_value: -5000.0
valid_range: [-0.3 1. ]
unlimited dimensions:
current shape = (12, 2160, 4320)
filling on, default _FillValue of -32767 used

3.代码——利用Python将NetCDF文件转存为Tiff文件

此代码是自己在处理NDVI数据时所写的脚本,目的是将每一期NDVI的NC格式数据提取并另存为12期的TIFF数据,便于后期分析处理。

# -*- coding: utf-8 -*-

# 模块导入
import numpy as np
import netCDF4 as nc
from osgeo import gdal,osr,ogr
import os
import glob # 单个nc数据ndvi数据读取为多个tif文件,并将ndvi值化为-1-1之间
def NC_to_tiffs(data,Output_folder):
nc_data_obj = nc.Dataset(data)
Lon = nc_data_obj.variables['lon'][:]
Lat = nc_data_obj.variables['lat'][:]
ndvi_arr = np.asarray(nc_data_obj.variables['ndvi']) #将ndvi数据读取为数组
ndvi_arr_float = ndvi_arr.astype(float)/10000 #将int类型改为float类型,并化为-1 - 1之间 #影像的左上角和右下角坐标
LonMin,LatMax,LonMax,LatMin = [Lon.min(),Lat.max(),Lon.max(),Lat.min()] #分辨率计算
N_Lat = len(Lat)
N_Lon = len(Lon)
Lon_Res = (LonMax - LonMin) /(float(N_Lon)-1)
Lat_Res = (LatMax - LatMin) / (float(N_Lat)-1) for i in range(len(ndvi_arr[:])):
#创建.tif文件
driver = gdal.GetDriverByName('GTiff')
out_tif_name = Output_folder + '\\'+ data.split('\\')[-1].split('.')[0] + '_' + str(i+1) + '.tif'
out_tif = driver.Create(out_tif_name,N_Lon,N_Lat,1,gdal.GDT_Float32) # 设置影像的显示范围
#-Lat_Res一定要是-的
geotransform = (LonMin,Lon_Res, 0, LatMax, 0, -Lat_Res)
out_tif.SetGeoTransform(geotransform) #获取地理坐标系统信息,用于选取需要的地理坐标系统
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) # 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]
out_tif.SetProjection(srs.ExportToWkt()) # 给新建图层赋予投影信息 #数据写出
out_tif.GetRasterBand(1).WriteArray(ndvi_arr_float[i]) # 将数据写入内存,此时没有写入硬盘
out_tif.FlushCache() # 将数据写入硬盘
out_tif = None # 注意必须关闭tif文件 def main():
Input_folder = 'F:\\data___python_test\\nc_to_tif\\nc'
Output_folder = 'F:\\data___python_test\\nc_to_tif\\tif_result' # 读取所有nc数据
data_list = glob.glob(Input_folder + '\\*.nc4') for i in range(len(data_list)):
data = data_list[i]
NC_to_tiffs(data,Output_folder)
print data + '-----转tif成功' print'----转换结束----' main()

本文作者:DQTDQT

限于作者水平有限,如文中存在任何错误,欢迎不吝指正、交流。

联系方式:

QQ:1426097423

E-mail:duanquntaoyx@163.com

本文版权归作者和博客园共有,欢迎转载、交流,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如果觉得本文对您有益,欢迎点赞、探讨。

Python处理NetCDF格式数据为TIFF数据(附脚本代码)的更多相关文章

  1. Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值

    JSON是通过键值对表示数据对象的一种格式,其全称为JavaScript Object Notation,它采用完全独立于编程语言的文本格式来存储和表示数据,轻量级.简洁清晰的层次结构.容易解析等特点 ...

  2. Python反编译调用有道翻译(附完整代码)

         网易有道翻译是一款非常优秀的产品,他们的神经网络翻译真的挺无敌.无奈有道客户端实在是太难用了,而且在某些具体场景 (比如对网站进行批量翻译) 无法使用,而有道的云服务又特别的贵,一般人是无法 ...

  3. python打印表格式数据,留出正确的空格和段落星号或注释

    python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ...

  4. python中json格式数据输出实现方式

    python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ...

  5. (数据科学学习手札65)利用Python实现Shp格式向GeoJSON的转换

    一.简介 Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON(JavaScript Obje ...

  6. python打印表格式数据-星号或注释

    python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ...

  7. 【231】◀▶ 利用 IDL 读取 TIFF 数据

    参考:Create Latitude/Longitude Arrays for GeoTIFF Image 用到的函数为 READ_TIFF,通过此函数可以获取 TIFF 数据的数组信息,同时可以获取 ...

  8. 使用python将mysql数据库的数据转换为json数据

    由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问M ...

  9. python 爬取天猫美的评论数据

    笔者最近迷上了数据挖掘和机器学习,要做数据分析首先得有数据才行.对于我等平民来说,最廉价的获取数据的方法,应该是用爬虫在网络上爬取数据了.本文记录一下笔者爬取天猫某商品的全过程,淘宝上面的店铺也是类似 ...

随机推荐

  1. 《VR入门系列教程》之22---GearVR SDK代码剖析

    GearVR SDK代码剖析     接下来我们来了解一下GearVR开发包的底层代码,它底层的代码和之前在第三章中讲的桌面SDK代码非常类似,当然,也有许多不同的地方.     首先,我们看看如何构 ...

  2. 今天来聊Java ClassLoader

    背景 类加载机制作为一个高频的面试题经常会在面试中被问到,前几天一个电话面试就问到,之前有了解过,但是没有梳理成自己的体系,所以说的有点凌乱,今天花点时间整理一下,分享给大家同时自己也好好梳理一下,顺 ...

  3. 【Demo 1】基于object_detection API的行人检测 1:环境与依赖

    环境 系统环境: win10.python3.6.tensorflow1.14.0.OpenCV3.8 IDE: Pycharm 2019.1.3.JupyterNotebook 依赖 安装objec ...

  4. Prometheus 整合 AlertManager

    简介 Alertmanager 主要用于接收 Prometheus 发送的告警信息,它很容易做到告警信息的去重,降噪,分组,策略路由,是一款前卫的告警通知系统.它支持丰富的告警通知渠道,可以将告警信息 ...

  5. jquery插件——仿新浪微博限制输入字数的textarea

    内容链接地址:http://www.cnblogs.com/jone-chen/p/5213851.html: <!DOCTYPE html> <html> <head& ...

  6. 使用钉钉对接禅道的bug系统,实现禅道提的bug实时在钉钉提醒并艾特对应的开发人员处理

    现在公司测试中有一个痛点是每次测试人员提完bug后,需要定期去提醒开发人员查看禅道的bug记录及修复bug. 导致测试人员在项目测试中不仅要测试整个软件,还要负起实时监督提醒功能的“保姆角色”,身心疲 ...

  7. 我与微笑哥以及 Java 极客技术的前世今生

    ​关注公众号,大家可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. Hello,大家好,我是子悠,Java 极客技术团队的作者之一,本周是六月的第三周,将由我给大家编辑 ...

  8. 给最近正在找工作(iOS)的朋友一些建议/经验

    众所周知, iOS开发找工作越来越难, 企业要求越来越高,一方面是资本寒冬期+七八月是企业招人淡季, 另外一方面也是iOS市场饱和.最近有出去看新机会, 所以下面记录一下面试XimalayaFM的大概 ...

  9. zabbix监控WEB网站性能

    一直在纠结用什么实例来给大家演示呢?想来想去还是官方的好,那我们怎么用zabbix监控web性能和可用性呢?我们这边分为几个步骤:打开网站.登陆.登陆验证.退出,一共4个小step,看实例. 检测流程 ...

  10. Linux命令- echo、grep 、重定向、1>&2、2>&1的介绍

    最近笔试遇到一道题,关于Linux命令的,题目如下 下面两条命令分别会有怎样的输出 echo  hello 1>&2 |grep aaa echo  hello 2>&1 ...