首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Metpython和底图进行点插值

使用Metpython和底图进行点插值
EN

Stack Overflow用户
提问于 2018-07-02 22:10:08
回答 1查看 222关注 0票数 0
代码语言:javascript
复制
# Copyright (c) 2016 MetPy Developers.
# Distributed under the terms of the BSD 3-Clause License.
# SPDX-License-Identifier: BSD-3-Clause
"""   
[Point_Interpolation](https://unidata.github.io/MetPy/latest/examples/gridding/Point_Interpolation.html?highlight=basic_map)

"""

导入一些库:

代码语言:javascript
复制
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib.colors import BoundaryNorm
import matplotlib.pyplot as plt
from matplotlib import cm as CM
from mpl_toolkits.basemap import Basemap
from matplotlib.patches import Polygon
from metpy.cbook import get_test_data
from metpy.gridding.gridding_functions import (interpolate, remove_nan_observations,
                                               remove_repeat_coordinates)
import pandas as pd
import numpy as np
import numpy.ma as ma

下面是一些函数:

代码语言:javascript
复制
def basic_map(proj):
    """Make our basic default map for plotting"""
    fig = plt.figure(figsize=(15, 10))
    #add_metpy_logo(fig, 0, 80, size='large')
    view = fig.add_axes([0, 0, 1, 1], projection=proj)
    view.set_extent([100, 130, 20, 50])
    view.add_feature(cfeature.STATES.with_scale('50m'))
    view.add_feature(cfeature.OCEAN)
    view.add_feature(cfeature.COASTLINE)
    view.add_feature(cfeature.BORDERS, linestyle=':')
    return fig, view

获取station_test_data:

代码语言:javascript
复制
def station_test_data(variable_names, proj_from=None, proj_to=None):
    #with get_test_data('station_data.txt') as f:
    all_data = np.loadtxt('2016072713.000', skiprows=1,
    #     all_data = np.loadtxt(f, skiprows=1,delimiter=',',
    
                              usecols=(0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11),
                              dtype=np.dtype([('stid', '5S'), ('lat', 'f'), ('lon', 'f'),
                                              ('aqi', 'f'), ('grade', 'f'),
                                              ('pm25', 'f'), ('pm10', 'f'),
                                              ('co', 'f'),('no2','f'),('o3','f'),
                                              ('o38h', 'f'), ('so2', 'f')]))
   
    all_stids = [s.decode('ascii') for s in all_data['stid']]
    data = np.concatenate([all_data[all_stids.index(site)].reshape(1, ) for site in all_stids])

    value = data[variable_names]
    lon = data['lon']
    lat = data['lat']

    if proj_from is not None and proj_to is not None:

        try:

            proj_points = proj_to.transform_points(proj_from, lon, lat)
            return proj_points[:, 0], proj_points[:, 1], value

        except Exception as e:

            print(e)
            return None

    return lon, lat, value
def remove_inf_x(x, y, z):
    x_ = x[~np.isinf(x)]
    y_ = y[~np.isinf(x)]
    z_ = z[~np.isinf(x)]

    return x_, y_, z_
def remove_inf_y(x, y, z):
    x_ = x[~np.isinf(y)]
    y_ = y[~np.isinf(y)]
    z_ = z[~np.isinf(y)]

    return x_, y_, z_

添加ploygen图

代码语言:javascript
复制
def plot_rec(map,lower_left,upper_left,upper_right,lower_right,text):
    lon_poly = np.array([lower_left[0], upper_left[0],upper_right[0], lower_right[0]])
    lat_poly = np.array([lower_left[1], upper_left[1],upper_right[1], lower_right[1]])
    X, Y  = map(lon_poly, lat_poly)
    xy = np.vstack([X,Y]).T

    poly = Polygon(xy, closed=True, \
            facecolor='None',edgecolor='red', \
            linewidth=1.\
            )
    ax, ay = map(lower_left[0],lower_left[1])
    plt.text(ax, ay,text,fontsize=6,fontweight='bold',
                    ha='left',va='bottom',color='k')
    plt.gca().add_patch(poly)

获取数据:

代码语言:javascript
复制
from_proj = ccrs.Geodetic()
to_proj = ccrs.AlbersEqualArea(central_longitude=110.0000, central_latitude=32.0000)
x, y, temp = station_test_data('pm25', from_proj, to_proj)

x, y, temp = remove_nan_observations(x, y, temp)
x, y, temp = remove_inf_x(x, y, temp)
x, y, temp = remove_inf_y(x, y, temp)
x, y, temp = remove_repeat_coordinates(x, y, temp)

###########################################

代码语言:javascript
复制
gx, gy, img1 = interpolate(x, y, temp, interp_type='barnes', hres=75000, search_radius=100000)
img1 = np.ma.masked_where(np.isnan(img1), img1)

然后我画出了这个图:

代码语言:javascript
复制
fig = plt.figure(figsize=(8, 8))
#fig, view = basic_map(to_proj)
m = Basemap(width=8000000,height=7000000,
            resolution='l',projection='aea',\
            lat_1=0.,lat_2=40,lon_0=110,lat_0=20)
#m.shadedrelief()
m.drawparallels(np.arange(20.,40,2.5),linewidth=1, dashes=[4, 2], labels=[1,0,0,0], color= 'gray',zorder=0, fontsize=10)
m.drawmeridians(np.arange(100.,125.,2.),linewidth=1, dashes=[4, 2], labels=[0,0,0,1], color= 'gray',zorder=0, fontsize=10)
m.readshapefile('dijishi_2004','state',color='gray')
levels = list(range(0, 200, 10))
cmap = plt.get_cmap('viridis')
norm = BoundaryNorm(levels, ncolors=cmap.N, clip=True)
mmb = m.pcolormesh(gx, gy, img1, cmap=cmap, norm=norm)
plt.colorbar(label=r'$PM_{2.5}(\mu g/m^3 $)') 
plt.show()

It seems the location is wrong!

也许我使用的是Point_Interpolation,它改变了坐标。

99306 31.1654 121.412 NaN 37.000 0.875 10.000 141.000 NaN NaN

99302 31.1907 121.703 NaN NaN 75.000 112.000 1.571 54.000 167.000 NaN 34.000

99300 31.3008 121.467 NaN NaN 53.000 NaN 0.414 21.000 128.000 NaN 10.000

EN

回答 1

Stack Overflow用户

发布于 2018-07-04 05:05:44

我的猜测是,您需要调整网格位置或投影。底图将(0,0)定义为地图的左下角,而您的数据似乎假设(0,0)为中心。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51138137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档