Skip to content

Commit

Permalink
修复了球面距离计算时nanbug
Browse files Browse the repository at this point in the history
  • Loading branch information
liucouhua committed Jun 14, 2022
1 parent 5b9da67 commit c8856c4
Show file tree
Hide file tree
Showing 5 changed files with 1,280 additions and 0 deletions.
2 changes: 2 additions & 0 deletions meteva/base/tool/math_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -308,11 +308,13 @@ def distance_on_earth_surface(lon1,lat1,lon2,lat2):
:param lat2:
:return:
'''

a1 = lon1 * math.pi/180
b1 = lat1 * math.pi/180
a2 = lon2 * math.pi/180
b2 = lat2 * math.pi/180

dis = meteva.base.ER * np.arccos(np.cos(b1)*np.cos(b2)*np.cos(a1-a2) + np.sin(b1)*np.sin(b2))
dis[np.isnan(dis)] =0

return dis
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"import meteva.method as mem\n",
"import meteva.base as meb\n",
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"#生成算法测试数据\n",
"lon_ob = np.array([130,131,132,133])\n",
"lat_ob = np.array([30,31,32,33])\n",
"\n",
"lon_fo = np.array([131,132,133,134])\n",
"lat_fo = np.array([31,32,33,34])\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 位置误差\n",
"**<font face=\"黑体\" color=blue size = 5> distance(lon_ob,lat_ob,lon_fo,lat_fo,on_earth_surface = True)</font>** \n",
" \n",
"计算两组位置之间的两两距离的平均。\n",
"\n",
"|参数|说明| \n",
"|:--|:--| \n",
"|**<font face=\"黑体\" color=blue size = 5>lon_ob</font>**|观测的经度,numpy数组| \n",
"|**<font face=\"黑体\" color=blue size = 5>lat_ob</font>**|观测的纬度,numpy数组,和lon_ob的shape必须一致| \n",
"|**<font face=\"黑体\" color=blue size = 5>lon_fo</font>**|预报的经度,numpy数组,numpy可以比lat_ob高一维(用于同时进行多家预报结果检验),lon_fo.shape低维与lat_ob.shape保持一致| \n",
"|**<font face=\"黑体\" color=blue size = 5>lat_fo</font>**|预报的纬度,numpy数组,numpy可以比lat_ob高一维(用于同时进行多家预报结果检验),lat_fo.shape低维与lat_ob.shape保持一致,和lon_fo的shape必须一致| \n",
"|<font face=\"黑体\" color=blue size=5>return</font>|位置误差的平均值,如果lat_fo和lat_ob的shape一致,说明只有一家预报,则返回实数,否则说明是在同时检验多家预报,返回结果为一维数组| \n",
"\n",
"**调用示例:** \n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"145.79061830031182\n"
]
}
],
"source": [
"dis = mem.distance(lon_ob,lat_ob,lon_fo,lat_fo)\n",
"print(dis)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 位置误差统计中间量\n",
"**<font face=\"黑体\" color=blue size = 5> tdis(lon_ob,lat_ob,lon_fo,lat_fo,on_earth_surface = True)</font>** \n",
" \n",
"为方便开展并行计算,计算两组位置之间的误差的平均值统计两个中间量:样本数,位置误差总和。\n",
"\n",
"|参数|说明| \n",
"|:--|:--| \n",
"|**<font face=\"黑体\" color=blue size = 5>lon_ob</font>**|观测的经度,numpy数组| \n",
"|**<font face=\"黑体\" color=blue size = 5>lat_ob</font>**|观测的纬度,numpy数组,和lon_ob的shape必须一致| \n",
"|**<font face=\"黑体\" color=blue size = 5>lon_fo</font>**|预报的经度,numpy数组,numpy可以比lat_ob高一维(用于同时进行多家预报结果检验),lon_fo.shape低维与lat_ob.shape保持一致| \n",
"|**<font face=\"黑体\" color=blue size = 5>lat_fo</font>**|预报的纬度,numpy数组,numpy可以比lat_ob高一维(用于同时进行多家预报结果检验),lat_fo.shape低维与lat_ob.shape保持一致,和lon_fo的shape必须一致| \n",
"|<font face=\"黑体\" color=blue size=5>return</font>|根据预报和观测的风向数据,统计得到的样本数、位置误差的总和,lat_fo和lat_ob的shape一致,则说明只有一家预报,此时返回一维的数据,size= 2。 如果lat_fo和lat_ob的shape不一致,则说明有多个预报,则返回的数据shape = (预报成员数,2)| \n",
"\n",
"**调用示例:** \n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 4. 583.1624732]\n"
]
}
],
"source": [
"tdis_array = mem.tdis(lon_ob,lat_ob,lon_fo,lat_fo)\n",
"print(tdis_array)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 位置误差(并行)\n",
"**<font face=\"黑体\" color=blue size = 5>distance_tdis(tdis_array)</font>** \n",
"\n",
"基于中间统计量计算位置误差的平均值\n",
"\n",
"|参数|说明| \n",
"|:--|:--| \n",
"|**<font face=\"黑体\" color=blue size = 5>tdis_array</font>**|包含检验中间结果的多维数组,其中最后一维长度为2,分别记录了样本数数,位置误差的总和,它通常是tdis函数的计算结果,或者计算结果的累加| \n",
"|<font face=\"黑体\" color=blue size=5>return</font>|位置误差的平均值,nasws_array少了最后一维| \n",
"\n",
"**调用示例:** "
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"145.79061830031182\n"
]
}
],
"source": [
"dis = mem.distance_tdis(tdis_array)\n",
"print(dis)"
]
}
],
"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.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Loading

0 comments on commit c8856c4

Please sign in to comment.