nmc_met_io/examples/retrieve_micaps_server.ipynb

334 lines
291 KiB
Plaintext
Raw Normal View History

2020-02-17 13:29:11 +00:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a name=\"top\"></a>\n",
"<div style=\"width:1000 px\">\n",
"\n",
"<div style=\"float:right; width:68 px; height:68px;\">\n",
"<img src=\"http://image.nmc.cn/static/site/nmc/themes/basic/images/nmc_logo.png\" alt=\"NMC Logo\" style=\"height: 68px;\">\n",
"</div>\n",
" \n",
"<h1>MICAPS Cassandra Server 分布式数据库数据读取</h1>\n",
"\n",
"<div style=\"clear:both\"></div>\n",
"</div>\n",
"\n",
"<hr style=\"height:2px;\">\n",
"\n",
"<div style=\"float:right; width:350 px\"><img src=\"http://www.micaps.cn/MiFun/resources/M4-PNG/1.png\" alt=\"NumPy Logo\" style=\"height: 300px;\"></div>\n",
"\n",
"MICAPS分布式数据环境BDIPS提供WEBService API方式来检索海量气象数据信息. [nmc_met_io](https://github.com/nmcdev/nmc_met_io)程序库的[retrieve_micaps_server](https://github.com/nmcdev/nmc_met_io/blob/master/nmc_met_io/retrieve_micaps_server.py)模块, 基于WEBService API接口实现了Python语言对BDIPS数据的检索和读取.\n",
"\n",
"### retrieve_micaps_server模块主要功能:\n",
"* 使用WEBService API接口, 无需额外的MICAPS Cassandra Server读取程序库;\n",
"* 引入的本地文件缓存技术, 加快数据的快速读取;\n",
"* 支持模式数据标量场, 矢量场及集合成员数据的读取; \n",
"* 支持模式单点时间序列, 单点廓线及廓线时序的读取;\n",
"* 支持站点, 探空观测数据的读取;\n",
"* 支持awx格式的静止气象卫星等经纬度数据读取;\n",
"* 支持LATLON格式的雷达拼图数据读取;\n",
"* 统一的返回数据类型, 格点数据返回为[xarray](http://xarray.pydata.org/en/stable/)类型, 站点数据返回为[pandas.DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html)类型.\n",
"\n",
"### 参考网站\n",
"* https://github.com/nmcdev/nmc_met_io\n",
"* http://www.micaps.cn/MifunForum/topic/list?fId=7\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 安装和配置nmc_met_io程序库\n",
"\n",
"建议安装[Anaconda](https://www.anaconda.com/distribution/)的Python环境. [nmc_met_io](https://github.com/nmcdev/nmc_met_io)为开源程序库, 放置在GitHub网站上, 目前尚不支持[Pypi](https://pypi.org/)和[conda](https://conda-forge.org/)安装. 安装命令如下:\n",
"> pip install git+git://github.com/nmcdev/nmc_met_io.git\n",
"\n",
"该安装过程会自动安装numpy, scipy, tqdm, ...等支持库.\n",
"\n",
"MICAPS分布式服务器的网络地址和端口在配置文件*config.ini*中设置. *config.ini*文件放置在系统用户目录下:\n",
"* Windows, \"C:/Users/用户名/.nmcdev/\"\n",
"* Linux, \"/home/用户名/.nmcdev/\"\n",
"\n",
"*config.ini*遵循Python的[配置文件](https://docs.python.org/3/library/configparser.html)格式:\n",
"```Python\n",
"[MICAPS]\n",
"GDS_IP = xx.xx.xx.xx\n",
"GDS_PORT = xxxx\n",
"# Cached file directory, if not set,\n",
"# /home/user/.nmcdev/cache will be used.\n",
"# CACHE_DIR = ~ \n",
"```\n",
"文件中`GDS_IP`为服务器地址, `GDS_PORT`为端口, 把`CACHE_DIR`的注释#去掉, 可以指定缓存文件地址(默认缓存地址为\".nmcdev/cache/\").\n",
"\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# set up things\n",
"%matplotlib inline\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [],
"source": [
"# load necessary libraries\n",
"# you should install cartopy with 'conda install -c conda-forge cartopy'\n",
"import xarray as xr\n",
"import numpy as np\n",
"import cartopy.crs as ccrs\n",
"import matplotlib.pyplot as plt\n",
"from nmc_met_io.retrieve_micaps_server import get_model_grid, get_model_grids"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 数值模式预报数据读取\n",
"<div style=\"float:right; width:350 px\"><img src=\"http://www.micaps.cn/forum-upload/ueditor/jsp/upload/image/20170829/1504018337040003312.png\" alt=\"image\" style=\"height: 250px;\"></div>\n",
"\n",
"模块`retrieve_micaps_server`提供读取数值模式网格预报数据的函数:\n",
" * `get_model_grid`: 读取单个时次标量, 矢量或集合成员的2D平面预报数据;\n",
" * `get_model_grids`: 读取多个时次标量, 矢量或集合成员的2D平面预报数据;\n",
" * `get_model_points`: 获取指定经纬度点的模式预报数据;\n",
" * `get_model_3D_grid`: 获得单个时次标量, 矢量或集合成员的[lev, lat, lon]3D预报数据;\n",
" * `get_model_3D_grids`: 获得多个时次标量, 矢量或集合成员的[lev, lat, lon]3D预报数据;\n",
" * `get_model_profiles`: 获得制定经纬度单点的模块廓线预报数据.\n",
"\n",
"每个函数都有固定的参数`directory`和`filename`(或`filenames`), 如\n",
"```Python\n",
"# MICAPS分布式服务器上的数据地址, 可通过MICAPS4的数据源检索界面查找,\n",
"# 如右图, 找到数据存放的目录, 鼠标右键点击\"保存路径到剪切板\", 粘贴去掉\"mdfs:///\"\n",
"directory = 'ECMWF_HR/TMP/850'\n",
"# 指定具体的数据文件, 一般格式为\"起报时间.预报时效\", 若不指定, 则自动获得目录下最新数据的文件名\n",
"filename = '18021708.024'\n",
"# 调用函数读取数据\n",
"data = get_model_grid(directory, filename=filename)\n",
"```\n",
"\n",
"### 读取单个时次模式标量预报数据"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<xarray.Dataset>\n",
"Dimensions: (lat: 281, level: 1, lon: 361, time: 1)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 2020-02-17T08:00:00\n",
" * level (level) float32 850.0\n",
" * lat (lat) float64 60.0 59.75 59.5 ... -9.5 -9.75 -10.0\n",
" * lon (lon) float64 60.0 60.25 60.5 ... 149.5 149.8 150.0\n",
" forecast_reference_time datetime64[ns] 2020-02-16T08:00:00\n",
" forecast_period (time) float64 24.0\n",
"Data variables:\n",
" data (time, level, lat, lon) float32 -7.594082 ... 18.874668\n",
"Attributes:\n",
" Conventions: CF-1.6\n",
" Origin: MICAPS Cassandra Server\n"
]
}
],
"source": [
"directory = 'ECMWF_HR/TMP/850'\n",
"filename = '20021608.024'\n",
"data = get_model_grid(directory, filename=filename, cache=False)\n",
"if data is not None:\n",
" print(data)\n",
"else:\n",
" print(\"Retrieve failed.\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<div class=\"alert alert-success\">\n",
" <b>返回xarray数据结构</b>:\n",
" <ul>\n",
" <li>返回的数据类型为[xarray](http://xarray.pydata.org/en/stable/)的Dataset结构数据(如下图所示).</li>\n",
" <li>xarray为在numpy数组基础上增加维度, 坐标和属性信息, 其数据模型来自于netCDF文件结构.</li>\n",
" <li>xarray提供直观,简介且可靠的格点数据操作功能, 已成为地球环境科学的标准数据处理程序库, 与很多现有的开源软件兼容.</li>\n",
" <li><em>get_model_grid</em>根据读取数据类型返回不同维度的Dataset数据. 如上对于高空数据, 返回数据的维度分别为(time, level, lat, lon).</li>\n",
" <li>在坐标Coordinate信息中, 除了数组维度的信息, 还给出起报时间forecast_reference_time和预报时效forecast_period</li>\n",
" </ul>\n",
"</div>\n",
"\n",
"<img src=\"http://xarray.pydata.org/en/stable/_images/dataset-diagram.png\" width=\"600\">"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\u001b[0;31mSignature:\u001b[0m\n",
"\u001b[0mget_model_grid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mdirectory\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mfilename\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0msuffix\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'*.024'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mvarname\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'data'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mvarattrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'units'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mscale_off\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mlevattrs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m{\u001b[0m\u001b[0;34m'long_name'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'pressure_level'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'units'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'hPa'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'_CoordinateAxisType'\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m'Pressure'\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m \u001b[0mcache\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n",
"\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mDocstring:\u001b[0m\n",
"Retrieve numeric model grid forecast from MICAPS cassandra service.\n",
"Support ensemble member forecast.\n",
"\n",
":param directory: the data directory on the service\n",
":param filename: the data filename, if none, will be the latest file.\n",
":param suffix: the filename filter pattern which will be used to\n",
" find the specified file.\n",
":param varname: set variable name.\n",
":param varattrs: set variable attributes, dictionary type.\n",
":param scale_off: [scale, offset], return values = values*scale + offset.\n",
":param levattrs: set level coordinate attributes, diectionary type.\n",
":param cache: cache retrieved data to local directory, default is True.\n",
":return: data, xarray type\n",
"\n",
":Examples:\n",
">>> data = get_model_grid(\"ECMWF_HR/TMP/850\")\n",
">>> data_ens = get_model_grid(\"ECMWF_ENSEMBLE/RAW/HGT/500\", filename='18021708.024')\n",
">>> data_ens = get_model_grid('ECMWF_ENSEMBLE/RAW/TMP_2M', '19083008.024')\n",
"\u001b[0;31mFile:\u001b[0m /media/kan-dai/work01/DK_WORK_CODE/repository/nmc_met_io/nmc_met_io/retrieve_micaps_server.py\n",
"\u001b[0;31mType:\u001b[0m function\n"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 使用?可以获得函数的帮助信息.\n",
"?get_model_grid"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<xarray.DataArray 'TEM' (time: 1, level: 1, lat: 281, lon: 361)>\n",
"array([[[[ -7.594082, -7.906582, -8.578457, ..., -14.937832,\n",
" -14.781582, -14.750332],\n",
" [ -7.187832, -7.734707, -8.578457, ..., -14.594082,\n",
" -14.515957, -14.594082],\n",
" [ -6.922207, -7.797207, -8.781582, ..., -14.640957,\n",
" -14.687832, -14.797207],\n",
" ...,\n",
" [ 18.343418, 18.499668, 18.718418, ..., 19.296543,\n",
" 18.984043, 19.124668],\n",
" [ 18.343418, 18.484043, 18.609043, ..., 19.593418,\n",
" 19.155918, 19.093418],\n",
" [ 18.312168, 18.484043, 18.515293, ..., 19.452793,\n",
" 19.265293, 18.874668]]]], dtype=float32)\n",
"Coordinates:\n",
" * time (time) datetime64[ns] 2020-02-17T08:00:00\n",
" * level (level) float32 850.0\n",
" * lat (lat) float64 60.0 59.75 59.5 ... -9.5 -9.75 -10.0\n",
" * lon (lon) float64 60.0 60.25 60.5 ... 149.5 149.8 150.0\n",
" forecast_reference_time datetime64[ns] 2020-02-16T08:00:00\n",
" forecast_period (time) float64 24.0\n",
"Attributes:\n",
" long_name: temperature\n",
" units: degree\n"
]
}
],
"source": [
"# 可以指定数据的变量名称, 变量属性等信息\n",
"data = get_model_grid(directory, filename=filename, varname='TEM', varattrs={'long_name':'temperature', 'units':'degree'}, cache=False)\n",
"if data is not None:\n",
" print(data.TEM)\n",
"else:\n",
" print(\"Retrieve failed.\")"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 864x576 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# 绘制图像\n",
"fig = plt.figure(figsize=(12,8))\n",
"ax = plt.axes(projection=ccrs.LambertConformal(central_longitude=120))\n",
"data.TEM.plot(ax=ax, transform=ccrs.PlateCarree(), cbar_kwargs={'shrink': 0.8})\n",
"ax.coastlines()\n",
"ax.gridlines()\n",
"ax.set_extent([80,130,15,54], crs=ccrs.PlateCarree())"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}