metpy interpolate_to_grid 不适用于简单数据

metpy interpolate_to_grid not working for me with simple data

我在调整简单数据集以从点生成温度插值图时遇到问题


#!apt-get update
#!apt-get -qq install python-cartopy python3-cartopy

#!pip install metpy

使用 colab 笔记本安装依赖项

import cartopy.crs as ccrs
import cartopy.feature as cfeature
import matplotlib.pyplot as plt

import requests
from pandas.io.json import json_normalize
import pandas as pd

!curl "https://climaya.com/fp-weather/api/api.php?q=GT_forecast&d=3" > data.json
df = pd.read_json("data.json")
#df

lat=df['latitude'].values
lon=df['longitude'].values
#lat,lon

这给出了一个经纬度数组

mapcrs=ccrs.PlateCarree(central_longitude=-90)
datacrs = ccrs.PlateCarree()

fig=plt.figure(figsize=(10,8))
ax=fig.add_subplot(1,1,1,projection=mapcrs)
ax.scatter(lon,lat,c=df['temp_high'].values*1,transform=datacrs)

这表明数据点正常


from metpy.interpolate import interpolate_to_grid, remove_nan_observations

lon=df['longitude'].values*1.
lat=df['latitude'].values*1.
dat=df['temp_high'].values*1.0

#lon,lat,dat data seems ok shape is 56, each just to asure numeric values

xp, yp, _ = mapcrs.transform_points(datacrs, lon, lat).T

x_masked, y_masked, dat = remove_nan_observations(xp, yp, dat)

gridx, gridy, gridz = interpolate_to_grid(x_masked, y_masked, dat, interp_type='cressman', minimum_neighbors=1, search_radius=40000, hres=5000)
#command in notebook ok no errors

import numpy as np
fig=plt.figure(figsize=(10,8))
ax=fig.add_subplot(1,1,1,projection=mapcrs)
ax.contourf(gridx,gridy,gridz,np.arange(0,35.1,1))

这会产生一个错误 TypeError: 输入 z 必须至少是一个 (2, 2) 形状的数组,但具有形状 (1, 1)

作为 python 的新手,metpy 一直在努力寻找解决方案,感谢您的帮助。

**编辑: 谢谢@dopplerShift,就是这样,这是修复和结果

gridx, gridy, gridz = interpolate_to_grid(lon, lat, dat, interp_type='cressman', minimum_neighbors=1, search_radius=.75, hres=.1)

所以问题出在文档中的这一行:

hres (float) – The horizontal resolution of the generated grid, given in the same units as the x and y parameters. Default 50000.

在这里你传递 hres=5000,意思是“生成一个点之间有 5000 个单位的网格”。对于通过地图投影的点,这通常是米,除了,你正在使用 PlateCarree(),其中给出点度数。因此,对于您当前的地图投影,您应该使用 hres 度数值,因此可能是 0.25 或 0.1。您还需要将 search_radius 调整为以度为单位的值(而不是当前的 40 公里)——或者将其保留下来,它会尝试计算一些合理的值。