Репроектирование набора данных Xarray - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь перепроецировать конформный набор данных Ламберта на Плату Карри. Я знаю, что это легко сделать визуально с помощью картопии. Однако я пытаюсь создать новый набор данных, а не просто показать перепроецированное изображение. Ниже приведена методология, которую я наметил, но не могу правильно установить набор данных (Python 3.5, MacOSx).

from siphon.catalog import TDSCatalog
import xarray as xr
from xarray.backends import NetCDF4DataStore
import numpy as np
import cartopy.crs as ccrs
from scipy.interpolate import griddata
import numpy.ma as ma
from pyproj import Proj, transform
import metpy

# Declare bounding box
min_lon = -78
min_lat = 36
max_lat = 40
max_lon = -72
boundinglat = [min_lat, max_lat]
boundinglon = [min_lon, max_lon]

# Load the dataset
cat = TDSCatalog('https://thredds.ucar.edu/thredds/catalog/grib/NCEP/HRRR/CONUS_2p5km/latest.xml')
dataset_name = sorted(cat.datasets.keys())[-1]
dataset = cat.datasets[dataset_name]
ds = dataset.remote_access(service='OPENDAP')
ds = NetCDF4DataStore(ds)
ds = xr.open_dataset(ds)

# parse the temperature at 850 and @ 0z reftime
tempiso = ds.metpy.parse_cf('Temperature_isobaric')
t850 = tempiso[0][2]

# transform bounding lat/lons to src_proj
src_proj = tempiso.metpy.cartopy_crs #aka lambert conformal conical
extents = src_proj.transform_points(ccrs.PlateCarree(), np.array(boundinglon), np.array(boundinglat))

# subset the data using the indexes of the closest values to the src_proj extents
t850_subset = t850[(np.abs(tempiso.y.values - extents[1][0])).argmin():(np.abs(tempiso.y.values - extents[1][1])).argmin()][(np.abs(tempiso.x.values - extents[0][1])).argmin():(np.abs(tempiso.x.values - extents[0][0])).argmin()]

# t850_subset should be a small, reshaped dataset, but it's shape is 0x2145
# now use nplinspace, npmeshgrid & scipy interpolate to reproject

Моя точка преобразования> найти подмножество ближайшего значения не работает. Он утверждает, что самые близкие точки находятся за пределами набора данных. Как уже отмечалось, я планирую использовать интерполяцию nplinspace, npmeshgrid и scipy для создания нового квадратного набора данных lat / lon из t850_subset.

Есть ли более простой способ изменить размер и перепроектировать набор данных xarray?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Ваш самый простой путь вперед - воспользоваться способностью xarray делать выбор данных, подобный пандам; это ИМО лучшая часть xarray. Замените последние две строки на:

# By transposing the result of transform_points, we can unpack the
# x and y coordinates into individual arrays.
x_lim, y_lim, _ = src_proj.transform_points(ccrs.PlateCarree(),
    np.array(boundinglon), np.array(boundinglat)).T
t850_subset = t850.sel(x=slice(*x_lim), y=slice(*y_lim))

Дополнительную информацию можно найти в документации по функциям выбора и индексирования xarray . Возможно, вас также заинтересует встроенная поддержка xarray для интерполяции . И если методы интерполяции помимо SciPy представляют интерес, у MetPy также есть набор других методов интерполяции .

0 голосов
/ 15 января 2019

В Iris у нас есть различные методы «перерисовки», если это не слишком много для вас - переключение контекста.
Xarray объясняет свое отношение к Iris здесь и предоставляет метод to_iris () .

...