首页 > 编程语言 >使用Python进行nc数据转tiff(多图层)

使用Python进行nc数据转tiff(多图层)

时间:2023-05-21 11:32:01浏览次数:44  
标签:Python tiff nc Lon Lat ndvi tif data


最近帮人处理了一批数据,发现matlab处理nc并不是很友好,遂查询了Python方法。

参考文献:lhttp://www.dtmao.cc/news_show_498450.shtml

# -*- 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['K_SVG'])  #将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][::-1]) # 将数据写入内存,此时没有写入硬盘 此处[::-1]用于图像的垂直镜像对称,避免图像颠倒
        out_tif.FlushCache() # 将数据写入硬盘
        out_tif = None # 注意必须关闭tif文件
def main():
    Input_folder = 'D:\\data'
    Output_folder = 'D:\\NC2TIFF'
    # 读取所有nc数据
    data_list = glob.glob(Input_folder + '\\*.nc')
    for i in range(len(data_list)):
        data = data_list[i]
        NC_to_tiffs(data,Output_folder)
        print (data + '-----转tif成功')
    print ('----转换结束----')
main()

修正了原文代码存在的问题,使其适配新版Python 3.9。
请注意下面这一行为数据字段。

ndvi_arr = np.asarray(nc_data_obj.variables['K_SVG'])  #将ndvi数据读取为数组

需要提前pip下面的包:
numpy netCDF4 osgeo gdal
具体代码如下:

pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install netCDF4 scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install osgeo scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install D:\GDAL-3.2.1-cp39-cp39-win_amd64.whl

gdal下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal


标签:Python,tiff,nc,Lon,Lat,ndvi,tif,data
From: https://blog.51cto.com/u_14540126/6318789

相关文章

  • June 2021-Continuous Transition: Improving Sample Efficiency for Continuous Cont
    摘要:尽管深度强化学习(RL)已成功应用于各种机器人控制任务,但由于样本效率较差,将其应用于现实世界任务仍然具有挑战性。为了克服这一缺点,一些工作侧重于在训练过程中重用收集的轨迹数据,将其分解为一组策略无关的离散变迁。然而,它们的改进有些边际,因为i)转换的数量通常很小,ii)值分......
  • Python高级编程技巧:函数式编程和闭包
    Python是一种非常流行的编程语言,可以用于各种应用领域,如Web开发,人工智能,数据科学等。其中,函数式编程和闭包是Python编程中非常重要的概念,本文将深入探讨这两个主题。函数式编程Python是一种多范式语言,既支持面向对象编程,也支持函数式编程。函数式编程的一大特点是强调函数的纯洁性......
  • Python的33个保留字有哪些?关键字大全
    Python的33个保留字包括False、None、True、and、as、assert等,Python的标准库提供了一个keyword模块,可以输出当前Python版本的所有关键字列表,腾讯云服务器网来详细说下Python的33个保留字及保留字查询方法:Python的33个保留字Python的保留字或关键字是指我们不能把它们用作任何标识......
  • Python计算目标检测中的IoU
    Python计算目标检测中的IoU前言前提条件相关介绍实验环境IoU概念代码实现前言本文是个人使用PythonPython处理文件的电子笔记,由于水平有限,难免出现错漏,敬请批评改正。更多精彩内容,可点击进入我的个人主页查看前提条件熟悉Python相关介绍Python是一种跨平台的计算机程序设计语言。......
  • Python操作常用数据库
    Python操作常用数据库前言简介SQLite连接SQLite创建数据表增删改查MySQLmysql-connector操作MySQL创建数据表增删改查pymysql操作MySQLMongoDB连接MongoDB增删改查Redis连接Redis前言本文是个人使用Python操作常用数据库的学习笔记,由于水平有限,难免出现错漏,敬请批评改正。简介数据......
  • 你真的了解Python吗?Python一些常见问题总结(一)
    你真的了解Python吗?Python一些常见问题总结(一)前言Python40问参考链接前言本文整理和解答了关于python的一些常见问题,由于水平有限,难免出现错漏,敬请批评改正。Python40问什么是Python?Python-百度百科Python官网Python3菜鸟教程Python是一种解释型语言。这就是说,与C语言和C的......
  • 为什么只有Python可以爬虫,C++可以吗?
    Python(英国发音:/ˈpaɪθən/;美国发音:/ˈpaɪθɑːn/),是一种广泛使用的解释型、面向对象、动态数据类型的高级程序设计语言。Python支持多种编程范型,包括结构化、过程式、反射式、面向对象和函数式编程。它拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个......
  • Java-Day-23( 线程二:线程终止 + 常用方法 + 用户线程 + 守护线程 + 线程生命周期 + Syn
    Java-Day-23线程终止setLoop()基本说明当线程完成任务后,会自动退出还可以通过使用变量来控制run方法退出的方式停止线程,即通知方式练习使用publicclasstest1{publicstaticvoidmain(String[]args)throwsInterruptedException{Tt1=newT();......
  • synchronized原理
    `synchronized`是Java中用来实现线程同步的关键字,它的主要作用是对代码块或方法进行加锁,保证在同一时刻只有一个线程能够执行被加锁的代码块或方法,从而避免多个线程同时访问共享资源导致的数据不一致问题。`synchronized`的实现原理是基于Java对象头中的monitor(监视器)实......
  • Golang的viper包调用多次OnConfigChange
    问题:修改了一次,而执行了两次这个函数解决方案把配置文件进行md5,保存其md5值。在调用这个函数时,再次读取文件进行md5。两者比对,如果相等就不执行下面的逻辑。这样就解决了,一模一样的配置文件,保存多次,不会执行后续的逻辑。但是,杜绝了大部分的场景,比如修改了一次,保存了两次......