1

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


#!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

这给出了一个 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: Input z must be at least a (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)

在此处输入图像描述

4

1 回答 1

1

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

hres (float) – 生成网格的水平分辨率,以与 x 和 y 参数相同的单位给出。默认为 50000。

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

于 2020-10-28T20:55:19.720 回答