【问题标题】:How to convert a netCDF4 file to a geoTiff如何将 netCDF4 文件转换为 geoTiff
【发布时间】:2019-09-19 22:32:57
【问题描述】:

我目前正在尝试获取 geoTiff 格式的 Tropomi 数据。我下载了一些 netCDF4 格式的数据。这样我就获得了三个 numpy 数组。一种是纬度坐标,一种是经度坐标,一种是一氧化碳值。

所以我有一个矩阵,其中包含我的栅格值,每个值我都知道相应值的经度和纬度。

有了这些信息,我如何构建地理参考栅格?

我读入数据如下 导入 netCDF4 从 netCDF4 导入数据集 将 numpy 导入为 np

file = '/home/daniel/Downloads/S5P_NRTI_L2__CO_____20190430T171319_20190430T171819_08006_01_010301_20190430T175151.nc'

rootgrp = Dataset(file, "r",format="NETCDF4")

lat = rootgrp.groups['PRODUCT']['latitude'][:] 
lon = rootgrp.groups['PRODUCT']['longitude'][:]
carbon = rootgrp.groups['PRODUCT']['carbonmonoxide_total_column'][:]

得到3个形状为(1,290,215)的矩阵

现在我想将其转换为墨卡托投影的 geoTIFF,但我不知道该怎么做。

【问题讨论】:

标签: python gdal netcdf rasterio


【解决方案1】:

gdal_translate 选项似乎有效。但这是我做的另一种显式方式。

#importing packages
import numpy as np
from scipy import interpolate
from netCDF4 import Dataset
from shapely.geometry import Point
import geopandas as gpd
from geopy.distance import geodesic
import rasterio
import matplotlib.pyplot as plt

#load data 
file = '/home/daniel/Ellipsis/db/downloaded/rawtropomi/S5P_NRTI_L2__CO_____20190430T171319_20190430T171819_08006_01_010301_20190430T175151.nc'
rootgrp = Dataset(file, "r",format="NETCDF4")
lat = rootgrp.groups['PRODUCT']['latitude'][:]
lon = rootgrp.groups['PRODUCT']['longitude'][:]
carbon = rootgrp.groups['PRODUCT']['carbonmonoxide_total_column'][:]
carbon = carbon.filled(0)
lat = lat.filled(-1000)
lon = lon.filled(-1000)

carbon = carbon.flatten()
lat = lat.flatten()
lon = lon.flatten()

#calculate the real distance between corners and get the widht and height in pixels assuming you want a pixel resolution of at least 7 by 7 kilometers
w = max(geodesic((min(lat),max(lon)), (min(lat),min(lon))).meters/7000 , geodesic((max(lat),max(lon)), (max(lat),min(lon))).meters/14000)
h = geodesic((min(lat),max(lon)), (max(lat),max(lon))).meters/14000

# create a geopandas with as its rows the latitude, longitude an the measrument values. transfrom it to the webmercator projection (or projection of your choosing)
points = [Point(xy) for xy in zip(lon, lat)]
crs = {'init': 'epsg:4326'}
data = gpd.GeoDataFrame({'value':carbon}, crs=crs, geometry=points)
data = data.to_crs({'init': 'epsg:3395'})
data['lon'] = data.bounds['maxx'].values
data['lat'] = data.bounds['maxy'].values

#make grid of coordinates. You nee de calculate the coordinate of each pixel in the desired raster
minlon = min(data['lon'])
maxlon = max(data['lon'])
minlat = min(data['lat'])
maxlat = max(data['lat'])

lon_list = np.arange(minlon, maxlon, (maxlon-minlon)/w )
lat_list = np.arange(minlat, maxlat, (maxlat-minlat)/h)

lon_2d, lat_2d = np.meshgrid(lon_list, lat_list)



#use the values in the geopandas dataframe to interpolate values int the coordinate raster
r = interpolate.griddata(points = (data['lon'].values,data['lat'].values), values = data['value'].values, xi = (lon_2d, lat_2d))
r = np.flip(r, axis = 0)

#check result
plt.imshow(r)


#save raster
transform = rasterio.transform.from_bounds(south = minlat, east = maxlon, north =     maxlat, west = minlon, width = r.shape[1], height = r.shape[2]   )
file_out = 'test.tiff'
new_dataset = rasterio.open(file_out , 'w', driver='Gtiff', compress='lzw',
                                    height = r.shape[1], width = r.shape[2],
                                    count= r.shape[0], dtype=str( r.dtype),
                                    crs=   data.crs,
                                    transform= transform)
new_dataset.write(r)
new_dataset.close()

【讨论】:

  • 您的方法似乎很有用。但我无法弄清楚为什么你从 netcdf 中拉平你的纬度和经度:它们不应该是一维数组吗?
  • 不幸的是,在尝试此操作时,我的 r 只有两个维度(我将 height 更改为 r.shape[0] 并将宽度更改为 r,shape[1] 和 count = 1 in rasterio.open),因为它返回一个元组维度错误。但是我现在有错误Source shape is inconsistent with given indexesr 应该有 3 个维度吗?
【解决方案2】:

我建议在这里使用 gdal_translate 查看这个答案:

Convert NetCDF (.nc) to GEOTIFF

gdal_translate -of GTiff file.nc test.tiff

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2021-08-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多