Python: 如何合并两个不同空间分辨率的netCdf文件?
Python: how to merge two different netCdf filles with different spatial resolution?
是否可以合并两个具有不同空间分辨率的 netCDF 文件?
我有两个数据集。
第一个是 ESA Land Cover dataset,作为 netCDF 的空间分辨率为 300m
。
第一个是居住在意大利的人口,空间分辨率为 100m
,从 WorldPop 为 geoTIFF
,我将其转换为 netCDF
。
这就是我正在做的
## convert GeoTiff to netCDF
from osgeo import gdal
fin = ita_ppp_2000.tif'
fout = 'ita_ppp_2000.nc'
ds = gdal.Translate(fout, fin, format='NetCDF')
我下载 ESA CCI 数据
year = 2000
import cdsapi
c.retrieve(
'satellite-land-cover',
{
'variable': 'all',
'format': 'zip',
'version': 'v2.1.1',
'year': str(y),
},
'download_%d.zip'%y) ## we need to unzip it
fn = 'ESACCI-LC-L4-LCCS-Map-300m-P1Y-%d-v2.0.7cds.nc'%year## Global 300m resolution
我得到了意大利的数据
def clipEsa(fn,x0,x1,y0,y1):
dnc = xr.open_dataset(fn)
lat = dnc.variables['lat'][:]
lon = dnc.variables['lon'][:]
# All indices in bounding box:
where_j = np.where((lon >= x0) & (lon <= x1))[0]
where_i = np.where((lat >= y0) & (lat <= y1))[0]
# Start and end+1 indices in each dimension:
i0 = where_i[0]
i1 = where_i[-1]+1
j0 = where_j[0]
j1 = where_j[-1]+1
longitude = dnc["lccs_class"]["lon"].values[j0:j1]
latitude = dnc["lccs_class"]["lat"].values[i0:i1]
time = dnc['lccs_class']['time'][0]
return dnc.sel(time=time, lon=longitude, lat=latitude)
wp = xr.open_dataset(fout) ## Italian population with 100m resolution
bb = [wp.lon[0].values, wp.lon[-1].values, wp.lat[0].values, wp.lat[-1].values] ## bounding box
esaItaly = clipEsa(fn,bb[0],bb[1],bb[2],bb[3]) ## ESA CCI clipped for Italy
新 我希望两个数据集都具有 300m
的空间分辨率。特别是我想用 wp
数据集的总和从 100m
到 300m
在 esaItaly
的相同像素中重新采样
这是我试过的
wp_inter = wp.interp(lat=esaItaly["lat"], lon=esaItaly["lon"])
但人口总量要少得多
sum(wp_inter['Band1'].values[wp_inter['Band1'].values>0])
5038174.5 ## population interpolated
sum(wp.Band1.values[wp.Band1.values>0])
56780870.0 ## original population
有很多方法可以做到,但可能最简单的方法是 gdalbuildvrt
。
使用 gdalbuildvrt
- 来自 command-line 或来自 Python 库 - 并构建一个 VRT
数据集。确保最高分辨率的文件在最后列出 - 如果有重叠,则最终数据集获胜。
记得使用 [-resolution {highest|lowest|average|user}]
选项。
获得复合数据集后,使用 gdal_translate
- CLI 或 Python - 以您喜欢的格式将其合并为单个整体数据集。
不要尝试自己实施 - 它比看起来更复杂。
是否可以合并两个具有不同空间分辨率的 netCDF 文件?
我有两个数据集。
第一个是 ESA Land Cover dataset,作为 netCDF 的空间分辨率为 300m
。
第一个是居住在意大利的人口,空间分辨率为 100m
,从 WorldPop 为 geoTIFF
,我将其转换为 netCDF
。
这就是我正在做的
## convert GeoTiff to netCDF
from osgeo import gdal
fin = ita_ppp_2000.tif'
fout = 'ita_ppp_2000.nc'
ds = gdal.Translate(fout, fin, format='NetCDF')
我下载 ESA CCI 数据
year = 2000
import cdsapi
c.retrieve(
'satellite-land-cover',
{
'variable': 'all',
'format': 'zip',
'version': 'v2.1.1',
'year': str(y),
},
'download_%d.zip'%y) ## we need to unzip it
fn = 'ESACCI-LC-L4-LCCS-Map-300m-P1Y-%d-v2.0.7cds.nc'%year## Global 300m resolution
我得到了意大利的数据
def clipEsa(fn,x0,x1,y0,y1):
dnc = xr.open_dataset(fn)
lat = dnc.variables['lat'][:]
lon = dnc.variables['lon'][:]
# All indices in bounding box:
where_j = np.where((lon >= x0) & (lon <= x1))[0]
where_i = np.where((lat >= y0) & (lat <= y1))[0]
# Start and end+1 indices in each dimension:
i0 = where_i[0]
i1 = where_i[-1]+1
j0 = where_j[0]
j1 = where_j[-1]+1
longitude = dnc["lccs_class"]["lon"].values[j0:j1]
latitude = dnc["lccs_class"]["lat"].values[i0:i1]
time = dnc['lccs_class']['time'][0]
return dnc.sel(time=time, lon=longitude, lat=latitude)
wp = xr.open_dataset(fout) ## Italian population with 100m resolution
bb = [wp.lon[0].values, wp.lon[-1].values, wp.lat[0].values, wp.lat[-1].values] ## bounding box
esaItaly = clipEsa(fn,bb[0],bb[1],bb[2],bb[3]) ## ESA CCI clipped for Italy
新 我希望两个数据集都具有 300m
的空间分辨率。特别是我想用 wp
数据集的总和从 100m
到 300m
在 esaItaly
这是我试过的
wp_inter = wp.interp(lat=esaItaly["lat"], lon=esaItaly["lon"])
但人口总量要少得多
sum(wp_inter['Band1'].values[wp_inter['Band1'].values>0])
5038174.5 ## population interpolated
sum(wp.Band1.values[wp.Band1.values>0])
56780870.0 ## original population
有很多方法可以做到,但可能最简单的方法是 gdalbuildvrt
。
使用 gdalbuildvrt
- 来自 command-line 或来自 Python 库 - 并构建一个 VRT
数据集。确保最高分辨率的文件在最后列出 - 如果有重叠,则最终数据集获胜。
记得使用 [-resolution {highest|lowest|average|user}]
选项。
获得复合数据集后,使用 gdal_translate
- CLI 或 Python - 以您喜欢的格式将其合并为单个整体数据集。
不要尝试自己实施 - 它比看起来更复杂。