简体   繁体   English

如何将 netCDF4 文件转换为 geoTiff

[英]How to convert a netCDF4 file to a geoTiff

I'm currently trying to get Tropomi data in geoTiff format.我目前正在尝试获取 geoTiff 格式的 Tropomi 数据。 I downloaded some data in netCDF4 format.我下载了一些 netCDF4 格式的数据。 This way I obtain three numpy arrays.这样我获得了三个 numpy 数组。 one with latitude coordinates, one with longitude coordinates and one with carbon-mono-oxide values.一个带有纬度坐标,一个带有经度坐标,一个带有一氧化碳值。

So I have a matrix with values for my raster and of each value I know the longitude and latitude of that respective value.所以我有一个矩阵,其中包含我的栅格值和每个值,我知道相应值的经度和纬度。

With this information how can I construct a georeferenced raster?有了这些信息,我如何构建地理参考栅格?

I read in the data as follows import netCDF4 from netCDF4 import Dataset import numpy as np我读入数据如下 import netCDF4 from netCDF4 import Dataset import numpy as 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'][:]

obtaining 3 matrices with shape (1,290,215)获得 3 个形状为 (1,290,215) 的矩阵

Now I would like to convert this to a Mercator projected geoTIFF, but I do not know how to go about it.现在我想将其转换为墨卡托投影的 geoTIFF,但我不知道该怎么做。

the gdal_translate option seems to work. gdal_translate 选项似乎有效。 But here is an alternative explicit way I did it.但这是我做这件事的另一种明确方式。

#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()

I would suggest looking at this answer here using gdal_translate:我建议使用 gdal_translate 查看此答案:

Convert NetCDF (.nc) to GEOTIFF 将 NetCDF (.nc) 转换为 GEOTIFF

gdal_translate -of GTiff file.nc test.tiff

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM