我在连接两个
xarray
数据文件时遇到问题。这两个文件(MODIS LST,通过 STAC API 访问)来自相同的日期/时间,但对应于相邻的地理图块(并排,按经度或 x)。当我使用 xr.concat()
函数时,一切正常,没有任何错误,但是当我可视化数据时,我注意到许多垂直白线,如下图所示(似乎是无数据值)。当我绘制各个文件(来自同一时间步骤)时,数据存在于出现垂直线的区域中(这些数字此处未显示)。
如果有人想尝试的话,下面提供了一个可重现的示例:
import pystac_client
import stackstac
import planetary_computer
import xarray as xr
import pandas as pd
catalog = pystac_client.Client.open(
"https://planetarycomputer.microsoft.com/api/stac/v1",
modifier=planetary_computer.sign_inplace,
)
# time range
time_range = "2000-10-01/2000-10-30"
# tile 1
bbox = [75, 30, 80, 32]
search = catalog.search(collections=["modis-11A2-061"], bbox=bbox, datetime=time_range)
items = search.get_all_items()
ds_d_t1 = stackstac.stack(items, epsg=4326, chunksize='auto', assets=["LST_Day_1km"], properties=False)
ds_d_t1 = ds_d_t1.rename("LST")
# tile 1
bbox = [66, 35, 67, 37]
search = catalog.search(collections=["modis-11A2-061"], bbox=bbox, datetime=time_range)
items = search.get_all_items()
ds_d_t2 = stackstac.stack(items, epsg=4326, chunksize='auto', assets=["LST_Day_1km"], properties=False)
ds_d_t2 = ds_d_t2.rename("LST")
# lets handle the time, because there is no proper time coordinate
# extract year and day of the year from MODIS ID
def get_date(modis_id):
year = int(modis_id.split('.')[1][1:5])
day_of_year = int(modis_id.split('.')[1][5:])
date = pd.to_datetime(str(year) + str(day_of_year), format='%Y%j')
return date
# create a new time coordinate variable using the get_date function
ds_d_t1['time'] = xr.DataArray([get_date(modis_id) for modis_id in ds_d_t1['id'].values],
dims='time', coords={'time': ds_d_t1['time']})
ds_d_t2['time'] = xr.DataArray([get_date(modis_id) for modis_id in ds_d_t2['id'].values],
dims='time', coords={'time': ds_d_t2['time']})
ds_d_t1 = ds_d_t1.sortby('time')
ds_d_t2 = ds_d_t2.sortby('time')
# concat
ds_m = xr.concat([ds_d_t1, ds_d_t2], dim="x")
ds_m = ds_m.sortby('x')
# visualise
ds_m[0].plot()
任何有关正确连接这些文件的帮助将不胜感激。
不确定它是否有帮助,但这似乎与两个图块中的 x 坐标不相同这一事实有关。人们可以通过检查(运行代码后)来验证这一点:
xmin = 69.270598
ds_d_t1[0].x[ds_d_t1[0].x > xmin].values
ds_d_t2[0].x[ds_d_t2[0].x > xmin].values
看到网格坐标不一样。
如果 xarray 合并失败(我找不到一个好的方法来使其正常工作),绘图的解决方法可能是:
import matplotlib.pyplot as plt
# Plot the first dataset with a single colorbar
plt.figure(figsize=(10, 6))
ds_d_t1[0].plot(add_colorbar=False)
ds_d_t2[0].plot()
# extend plot to entire boundaries
min_lon, max_lon = ds_m.x.min().values, ds_m.x.max().values
min_lat, max_lat = ds_m.y.min().values, ds_m.y.max().values
ax = plt.gca()
ax.set_xlim([min_lon, max_lon])
ax.set_ylim([min_lat, max_lat])
# Add labels and legend
plt.title("Combined")
plt.show()
这至少应该可以让您避免看到的伪影: