内嵌Group的nc数据,看成文件夹下的子文件夹里有数据集
使用数据为特殊的哨兵卫星(S5P)数据
直接上代码,该代码实现的是简单的提取netcdf4数据提取为含经纬度和value的点集(TXT),可供Arcgis导入使用,可参考另一篇博文,直接将获取的点击输出为shp文件
# -*- coding: utf-8 -*-
import numpy as np
import netCDF4n
import os
class Create_nc_addxy:
def __init__(self, filePath):
self.filePath = filePath # 文件路径
def creat_addxy(self):
# 写成传参
# filePath = nc数据路径
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
rootDir = os.path.split(rootPath)[0]
projDir = os.path.split(rootDir)[0]
filename = os.path.splitext(os.path.split(self.filePath)[1])[0]
outputfile = projDir + '/data/workspace/txtfile/' + filename + '.txt'
# outputfile = txt路径
dataset = 'nitrogendioxide_tropospheric_column'
# 剔除了-9999
# scanline Y 3245 & ground_pixel X 450
file_info = netCDF4.Dataset(self.filePath, mode='r')
# 获取数据
ntc = file_info.groups['PRODUCT'].variables[dataset][()]
lon = file_info.groups['PRODUCT'].variables['longitude'][()]
lat = file_info.groups['PRODUCT'].variables['latitude'][()]
# 取出数据并转为一维数组
z, row, col = ntc.shape
ntc_arr = np.asarray(ntc).reshape((row * col))
lon_arr = np.asarray(lon).reshape((row * col))
lat_arr = np.asarray(lat).reshape((row * col))
# 剔除-9999
null_index = np.where((ntc_arr > 9.1e+35) | (ntc_arr < 0))
index = list(null_index[0])
ntc_arr = np.delete(ntc_arr, index)
lon_arr = np.delete(lon_arr, index)
lat_arr = np.delete(lat_arr, index)
# TROPOMI用的是标准单位,然而通用的是 10^15 molec./cm^2,所以要乘上系数6.02214x10^4来转换(6.02214e+4) 看官网数据说明
ntc_arr = ntc_arr * (6.02214e+4)*(1.0e+15)
# 制作文本数据fid,lon,lat,value
fid = np.array(range(len(ntc_arr))).tolist()
ntc_arr_list = ntc_arr.tolist()
lon_arr_list = lon_arr.tolist()
lat_arr_list = lat_arr.tolist()
all_arr = [fid, lon_arr_list, lat_arr_list, ntc_arr_list]
all_arr = np.array(all_arr)
all_arr = np.transpose(all_arr)
all_arr = all_arr.tolist()
# a=','.join(all_arr)
a = [str(i).replace('[', '').replace(']', '').replace(' ', '') for i in all_arr]
# 添加头文件
with open(outputfile, 'w') as f:
f.write('fid,lon,lat,value' + '\n')
with open(outputfile, 'a') as f:
s = '\n'.join(a)
f.write(s)
return outputfile