HDF转CSV CSV转tif

HDF转CSV CSV转tif

网上基本没有这些代码,需要的可以看看,仅供参考
HDF直接转成Tif的也有代码,可以看看我的其他博文

HDF转CSV

from pyhdf.SD import SD
import  numpy as np
import os

filepath="E:\CO2" #文件位置,存放hdf文件的文件夹
filenames=os.listdir(filepath)
print(filenames)

for i,filename in enumerate(filenames):
    pathhdf=filepath+'\\'+filename
    print(pathhdf)
    hdfarr = pathhdf.split("\\")[-1].split("_")[2].split(".")
    csvname = pathhdf.split("\\")[-1].split(".")[0] + "." + pathhdf.split("\\")[-1].split(".")[1]
    print(hdfarr)
    y = hdfarr[0]
    m = hdfarr[1]
    ylist = []
    mlist = []

    for i in range(41 * 71):
        ylist.append(y)
        mlist.append(m)

    hdf = SD(pathhdf)

    print(hdf.info())  # 信息类别数

    data = hdf.datasets()
    a = []
    b = []
    CO2Amount_grid = []
    for i in data:
        print(i)  # 具体类别
        Lat = hdf.select(i)[:]
        lat = np.array(Lat)
        print(lat.shape)
        if i == 'lat_grid':
            a.append(lat)
        if i == 'lon_grid':
            b.append(lat)
        if i == 'CO2Amount_grid':
            CO2Amount_grid.append(lat)
    print(type(CO2Amount_grid))
    CO2Amount_grid = np.array(list(CO2Amount_grid)).reshape(-1)
    # print(a)

    grid = []
    grid_1 = []
    for i in range(41):
        for k in range(71):
            grid_1.append(a[0][i])
    grid_1 = np.array(grid_1).squeeze()
    print(grid_1.shape)
    grid_1 = grid_1.reshape(-1)
    print(grid_1.shape)

    grid_2 = []
    for k in range(41):
        grid_2.append(b)
    grid_2 = np.array(grid_2).squeeze()
    print(grid_2.shape)
    grid_2 = grid_2.reshape(-1)
    print(grid_2.shape)

    grid.append(ylist)
    grid.append(mlist)
    grid.append(grid_1)
    grid.append(grid_2)
    grid.append(CO2Amount_grid)

    head = ["year", "month", "lat", "lon", "CO2Amount"]

    grid = np.array(grid, dtype=np.str)
    print(grid.shape)
    grid = grid.T
    print(grid.shape)

    grid = np.insert(grid, 0, np.array(head), axis=0)
    print(grid.shape)
    # print(CO2Amount_grid)
    np.savetxt("E:\\temp\\"+csvname + ".csv", grid, delimiter=",", fmt='%s')

效果如下
在这里插入图片描述
CSV转tif

import numpy as np
from osgeo import gdal, osr
from glob import glob
import os
import datetime
import pandas as pd
os.environ['PROJ_LIB'] = r'D:\python\pythonData\venv\Lib\site-packages\osgeo\data\proj'
def csv2array(filen):
    df = pd.read_csv(filen)
    lat = (np.array((df.loc[:,'lat']).tolist())).reshape(-1,1)
    lon = (np.array((df.loc[:,'lon']).tolist())).reshape(-1,1)
    co2 = (np.array((df.loc[:,'CO2Amount']).tolist())).reshape(-1,1)
    
    ns = []
    nl = []
    for line in lon:
        ns.append(int(line))
    ns = sorted(ns)
    unique_data1 = np.unique(ns)
    
    for line in lat:
        nl.append(int(line))
    nl = sorted(nl)
    unique_data2 = np.unique(nl)
    
    xx,yy = [len(unique_data2),len(unique_data1)]
    outdata = co2.reshape(xx,yy)
    res_lon = abs(unique_data1[1] - unique_data1[0])
    res_lat = -abs(unique_data2[1] - unique_data2[0])
    latmax = np.max(unique_data2)
    lonmin = np.min(unique_data1)
    return outdata,res_lon,res_lat,latmax,lonmin
def writetif(data,outname,geotransform):
    nl,ns = [data.shape[0],data.shape[1]] 
    bands = 1               
    driver = gdal.GetDriverByName("GTiff")
    out_tif = driver.Create(outname, ns, nl, bands, gdal.GDT_Float32)        
    out_tif.SetGeoTransform(geotransform)     
    srs = osr.SpatialReference()
    proj_type = 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]'
    out_tif.SetProjection(proj_type)  # 给新建图层赋予投影信息       
    out_tif.GetRasterBand(1).WriteArray(data)
    del out_tif


inpath = 'E:/temp'
outpath = 'E:/temp'


dirs = os.listdir(inpath)  # 获取指定路径下的文件
file_name = []

for x in dirs:  # 循环读取路径下的文件并筛选输出
    if os.path.splitext(x)[1] == '.csv' or os.path.splitext(x)[1] == '.CSV':   # 筛选.HDF文件
        file_name.append(x)
for k in range(len(file_name)):
    filename = inpath+'/'+file_name[k]
    tt = file_name[k]
    outdata,res_lon,res_lat,latmax,lonmin = csv2array(filename)
    geotransform =  (lonmin, res_lon, 0, latmax, 0, res_lat)
    outname = outpath + '/' + tt[0:len(tt)-3] + 'tif'
    writetif(outdata,outname,geotransform)

注意,有些库 python3版本不能直接下载,例如proj这个包,pychram可能识别不到,需要下载下来进行本地安装,我的另一篇博客解决了这个问题

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值