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 公里)——或者将其保留下来,它会尝试计算一些合理的值。
我在调整简单数据集以从点生成温度插值图时遇到问题
#!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 公里)——或者将其保留下来,它会尝试计算一些合理的值。