Python处理NetCDF格式数据为TIFF数据(附脚本代码)
博客小序: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数据(附脚本代码)的更多相关文章
- Python:GeoJson格式的多边形裁剪Tiff影像并计算栅格数值
		JSON是通过键值对表示数据对象的一种格式,其全称为JavaScript Object Notation,它采用完全独立于编程语言的文本格式来存储和表示数据,轻量级.简洁清晰的层次结构.容易解析等特点 ... 
- Python反编译调用有道翻译(附完整代码)
		网易有道翻译是一款非常优秀的产品,他们的神经网络翻译真的挺无敌.无奈有道客户端实在是太难用了,而且在某些具体场景 (比如对网站进行批量翻译) 无法使用,而有道的云服务又特别的贵,一般人是无法 ... 
- python打印表格式数据,留出正确的空格和段落星号或注释
		python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ... 
- python中json格式数据输出实现方式
		python中json格式数据输出实现方式 主要使用json模块,直接导入import json即可. 小例子如下: #coding=UTF-8 import json info={} info[&q ... 
- (数据科学学习手札65)利用Python实现Shp格式向GeoJSON的转换
		一.简介 Shp格式是GIS中非常重要的数据格式,主要在Arcgis中使用,但在进行很多基于网页的空间数据可视化时,通常只接受GeoJSON格式的数据,众所周知JSON(JavaScript Obje ... 
- python打印表格式数据-星号或注释
		python打印表格式数据,留出正确的空格,格式化打出 代码如下: def printPicnic(itemsDict,leftWidth,rightWidth): print('PICNIC ITE ... 
- 【231】◀▶ 利用 IDL 读取 TIFF 数据
		参考:Create Latitude/Longitude Arrays for GeoTIFF Image 用到的函数为 READ_TIFF,通过此函数可以获取 TIFF 数据的数组信息,同时可以获取 ... 
- 使用python将mysql数据库的数据转换为json数据
		由于产品运营部需要采用第三方个推平台,来推送消息.如果手动一个个键入字段和字段值,容易出错,且非常繁琐,需要将mysql的数据转换为json数据,直接复制即可. 本文将涉及到如何使用Python访问M ... 
- python 爬取天猫美的评论数据
		笔者最近迷上了数据挖掘和机器学习,要做数据分析首先得有数据才行.对于我等平民来说,最廉价的获取数据的方法,应该是用爬虫在网络上爬取数据了.本文记录一下笔者爬取天猫某商品的全过程,淘宝上面的店铺也是类似 ... 
随机推荐
- Java EE.JavaBean
			JavaBean是一组可移植.可重用.并可以组装到应用程序中的Java类.一个Model类(属性+构造函数). 
- DH、RSA与ElGamal非对称加密算法实现及应用
			1.对称加密与非对称加密概述 关于对称加密与非对称加密的概念这里不再多说,感兴趣可以看下我之前的几篇文章,下面说一说两者的主要区别. 对称加密算法数据安全,密钥管理复杂,密钥传递过程复杂,存在密钥泄露 ... 
- mysql语句汇总
			MySQL常用命令: show databases; 显示数据库 create database name; 创建数据库 use databasename; 选择数据库 drop database ... 
- "A valid provisioning profile for this executable was not found"问题
			时间:2015年8月14日 初接触iOS,这两天真机调试的时候遇到了这个问题.如图所示: 上网查后发现,解决方法大致有以下两种: 1. provisioning profile没有被找到,需要重新导入 ... 
- OLE--SWT高级控件
			OLE和ActiveX控件的支持 OLE(Object Link Embeded)是指在程序之间链接和嵌入对象数据.通过OLE技术可以在一个应用程序中执行其他的应用程序. 而ActiveX ... 
- 四、Python基础(1)
			目录 四.Python基础(1) 四.Python基础(1) 1.什么是变量? 一种变化的量,量是记录世界上的状态,变指得是这些状态是会变化的. 2.为什么有变量? 因为计算机程序的运行就是一系列状态 ... 
- Service 使用详解
			极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ... 
- 使用 PowerShell 远程管理
			要求 PowerShell 版本要求至少是2.0版本以上,目前PowerShell 2.0 支持最低的操作系统版本为Windows XP.本次操作使用的是 PowerShell 5.1 请使用管理员身 ... 
- 使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)
			前言 笔者查阅很多资料,才写成此文章,如有错误,请读者们及时提出. 一般大家使用远程桌面(Remote Desktop)连接Windows Server时,总会有一个警告提示,如图1 图1 出现此警告 ... 
- Asp.NetCore源码学习[2-1]:配置[Configuration]
			Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ... 
