meteva

提供气象产品检验相关python程序


几何特征检验

<p>[TOC]</p> <pre><code class="language-python">%matplotlib inline %load_ext autoreload %autoreload 2 import meteva.base as meb import meteva.method as mem import meteva.perspact as mps import numpy as np import pandas as pd import datetime import meteva import math</code></pre> <h1>几何特征检验</h1> <p>计算和对比观测预报落区的面积、数目和周长等特征</p> <p>参考文献</p> <ul> <li>AghaKouchak, A., Nasrollahi, N., Li, J., Imam, B. and Sorooshian, S. (2011) Geometrical characterization of precipitation patterns. J. Hydrometeorology, 12, 274–285, doi:10.1175/2010JHM1298.1.</li> </ul> <p>以下构建两组简单的落区的示例,已对函数功能和效果进行说明</p> <pre><code class="language-python">grid1 = meb.grid([100, 120, 0.05], [24, 40, 0.05]) dat_ob1 = np.zeros((grid1.nlat,grid1.nlon)) for j in range(grid1.nlat): for i in range(grid1.nlon): dat_ob1[j,i] =20* math.exp(-0.001*(i-200)**2 - 0.001*(j-200)**2) grd_ob1 = meb.grid_data(grid1,dat_ob1) grid1 = meb.grid([100, 120, 0.05], [24, 40, 0.05]) dat_fo1 = np.zeros((grid1.nlat,grid1.nlon)) for j in range(grid1.nlat): for i in range(grid1.nlon): dat_fo1[j,i] =10* math.exp(-0.001*(i-240)**2 - 0.0003*(j-240)**2) dat_fo1[j,i] +=10* math.exp(-0.001*(i-170)**2 - 0.0003*(j-170)**2) grd_fo1= meb.grid_data(grid1,dat_fo1) look_ff1 = mem.mode.feature_finder(grd_ob1,grd_fo1,smooth = 0,threshold = 5,minsize = 1) mem.mode.plot_label(look_ff1)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=420d1750c7252b21de1e80f373c8cf9e&amp;amp;file=file.png" alt="" /></p> <pre><code class="language-python">grid2 = meb.grid([100, 120, 0.05], [24, 40, 0.05]) dat_ob2 = np.zeros((grid2.nlat,grid2.nlon)) for j in range(grid2.nlat): for i in range(grid2.nlon): dat_ob2[j,i] =20* math.exp(-0.001*(i-200)**2 - 0.001*(j-200)**2) grd_ob2 = meb.grid_data(grid2,dat_ob2) grid2 = meb.grid([100, 120, 0.05], [24, 40, 0.05]) dat_fo2 = np.zeros((grid2.nlat,grid2.nlon)) for j in range(grid2.nlat): for i in range(grid2.nlon): dat_fo2[j,i] =10* math.exp(-0.001*(i-230)**2 - 0.0003*(j-230)**2) dat_fo2[j,i] +=10* math.exp(-0.001*(i-170)**2 - 0.0003*(j-170)**2) grd_fo2= meb.grid_data(grid2,dat_fo2) look_ff2 = mem.mode.feature_finder(grd_ob2,grd_fo2,smooth = 0,threshold = 5,minsize = 1) mem.mode.plot_label(look_ff2)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=fa718ae6559c28f0688a9dd231f40eb7&amp;amp;file=file.png" alt="" /></p> <h2>面积指数</h2> <p>Aindex = A/Aconvex, A 代表图形面积, and Aconvex 代表图形凸包面积, 其值在0到1之间,越接近1则图形越规则,相反则越离散</p> <p>&lt;font face=&quot;黑体&quot; color=Blue size=3&gt;<strong>area_index(grd_ob,grd_fo,thresholds)</strong>&lt;/font&gt;</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;grd_ob&lt;/font&gt;</strong></td> <td style="text-align: left;">网格数据形式的观测数据,只支持包含单一平面场的网格数据</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;grd_fo&lt;/font&gt;</strong></td> <td style="text-align: left;">网格数据形式的预报数据,只支持包含单一平面场的网格数据</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;thresholds&lt;/font&gt;</strong></td> <td style="text-align: left;">等级阈值列表</td> </tr> </tbody> </table> <p>&lt;font face=&quot;黑体&quot; color=green size=4&gt;<strong>返回结果内容说明</strong>&lt;/font&gt;</p> <table> <thead> <tr> <th style="text-align: left;">一级关键词</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;area_index&lt;/font&gt;</strong></td> <td style="text-align: left;">面积指数</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;total_area&lt;/font&gt;</strong></td> <td style="text-align: left;">面积和</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;total_convex_area&lt;/font&gt;</strong></td> <td style="text-align: left;">最大凸包面积</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">result = mem.space.area_index(grd_ob1,grd_fo1,thresholds=5) print(result)</code></pre> <pre><code>{'area_index': [0.9661953159522757, 0.961511708787387], 'total_area': [4373, 8294], 'total_convex_area': [4526.0, 8626.0]}</code></pre> <pre><code class="language-python">result = mem.space.area_index(grd_ob2,grd_fo2,thresholds=5) print(result)</code></pre> <pre><code>{'area_index': [0.9661953159522757, 0.8596507352941176], 'total_area': [4373, 9353], 'total_convex_area': [4526.0, 10880.0]}</code></pre> <h2>数量指数</h2> <p>count_index = 1 - (NC - 1)/(sqrt(NP) + NC), NP 代表图像中非0的格点数, NC 代表连通域数量, 其值在0到1之间,越接近1则图形连通程度越高,相反则越少</p> <p>&lt;font face=&quot;黑体&quot; color=Blue size=3&gt;<strong>count_index(grd_ob,grd_fo,thresholds)</strong>&lt;/font&gt;</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;grd_ob&lt;/font&gt;</strong></td> <td style="text-align: left;">网格数据形式的观测数据,只支持包含单一平面场的网格数据</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;grd_fo&lt;/font&gt;</strong></td> <td style="text-align: left;">网格数据形式的预报数据,只支持包含单一平面场的网格数据</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;thresholds&lt;/font&gt;</strong></td> <td style="text-align: left;">等级阈值列表</td> </tr> </tbody> </table> <p>&lt;font face=&quot;黑体&quot; color=green size=4&gt;<strong>返回结果内容说明</strong>&lt;/font&gt;</p> <table> <thead> <tr> <th style="text-align: left;">一级关键词</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;count_index&lt;/font&gt;</strong></td> <td style="text-align: left;">数量指数</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;count_nonzero&lt;/font&gt;</strong></td> <td style="text-align: left;">达到阈值的格点数</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;count_connect&lt;/font&gt;</strong></td> <td style="text-align: left;">联通的目标数</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">result = mem.space.count_index(grd_ob1,grd_fo1,thresholds=5) print(result)</code></pre> <pre><code>{'count_index': [1.0151220357808053, 1.0], 'count_nonzero': [4373, 8294], 'count_connect': [1, 2]}</code></pre> <pre><code class="language-python">result = mem.space.count_index(grd_ob2,grd_fo2,thresholds=5) print(result)</code></pre> <pre><code>{'count_index': [1.0151220357808053, 1.010340095094156], 'count_nonzero': [4373, 9353], 'count_connect': [1, 1]}</code></pre> <h2>周长指数</h2> <p>Sindex = Pmin/P, n代表值为正数的格点数量, 如果 floor(sqrt(n)) = sqrt(n),Pmin = 4<em>sqrt(n) ,否则 Pmin = 2 </em> floor(2*sqrt(n)+1). P 是非0格点的周长, 其值在0到1之间,越接近1则图形越接近正方形。因为网格数据是离散的,所以计算周长是是围绕格点的折线。</p> <p>&lt;font face=&quot;黑体&quot; color=Blue size=3&gt;<strong>surround_index(grd_ob,grd_fo,thresholds)</strong>&lt;/font&gt;</p> <table> <thead> <tr> <th style="text-align: left;">参数</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;grd_ob&lt;/font&gt;</strong></td> <td style="text-align: left;">网格数据形式的观测数据,只支持包含单一平面场的网格数据</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;grd_fo&lt;/font&gt;</strong></td> <td style="text-align: left;">网格数据形式的预报数据,只支持包含单一平面场的网格数据</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=Blue size=5&gt;thresholds&lt;/font&gt;</strong></td> <td style="text-align: left;">等级阈值列表</td> </tr> </tbody> </table> <p>&lt;font face=&quot;黑体&quot; color=green size=4&gt;<strong>返回结果内容说明</strong>&lt;/font&gt;</p> <table> <thead> <tr> <th style="text-align: left;">一级关键词</th> <th style="text-align: left;">说明</th> </tr> </thead> <tbody> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;surround_index&lt;/font&gt;</strong></td> <td style="text-align: left;">周长指数</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;perimeter_min&lt;/font&gt;</strong></td> <td style="text-align: left;">同样面积的落区的最小可能周长</td> </tr> <tr> <td style="text-align: left;"><strong>&lt;font face=&quot;黑体&quot; color=green size=3&gt;perimeter&lt;/font&gt;</strong></td> <td style="text-align: left;">落区的实际周长</td> </tr> </tbody> </table> <p><strong>调用示例</strong></p> <pre><code class="language-python">result = mem.space.surround_index(grd_ob1,grd_fo1,thresholds=5) print(result)</code></pre> <pre><code>{'surround_index': [0.8866666666666667, 0.6310344827586207], 'perimeter_min': [266, 366], 'perimeter': [300, 580]}</code></pre> <pre><code class="language-python">result = mem.space.surround_index(grd_ob2,grd_fo2,thresholds=5) print(result)</code></pre> <pre><code>{'surround_index': [0.8866666666666667, 0.7185185185185186], 'perimeter_min': [266, 388], 'perimeter': [300, 540]}</code></pre> <p>以下是实际示例中的应用效果</p> <pre><code class="language-python">path_ob = r'H:\test_data\input\mem\mode\ob\rain03\20072611.000.nc' path_fo = r'H:\test_data\input\mem\mode\ec\rain03\20072608.003.nc' grd_ob3 = meb.read_griddata_from_nc(path_ob, grid=grid1, time=&amp;quot;2020072611&amp;quot;, dtime=0, data_name=&amp;quot;OBS&amp;quot;) grd_fo3 = meb.read_griddata_from_nc(path_fo, grid=grid1, time=&amp;quot;2020072608&amp;quot;, dtime=3, data_name=&amp;quot;ECMWF&amp;quot;) look_ff = mem.mode.feature_finder(grd_ob3,grd_fo3,smooth = 0,threshold = 5,minsize = 1) mem.mode.plot_label(look_ff)</code></pre> <p><img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=e4b4ccb07710c58f5cde8a9234e94067&amp;amp;file=file.png" alt="" /></p> <pre><code class="language-python">result = mem.space.area_index(grd_ob3,grd_fo3,thresholds=5) print(result)</code></pre> <pre><code>{'area_index': [0.6111037934668072, 0.663979336255479], 'total_area': [9279, 8483], 'total_convex_area': [15184.0, 12776.0]}</code></pre> <pre><code class="language-python">result = mem.space.count_index(grd_ob3,grd_fo3,thresholds=5) print(result)</code></pre> <pre><code>{'count_index': [0.8742449827620725, 0.8159560866765792], 'count_nonzero': [9279, 8483], 'count_connect': [16, 23]}</code></pre> <pre><code class="language-python">result = mem.space.surround_index(grd_ob3,grd_fo3,thresholds=5) print(result)</code></pre> <pre><code>{'surround_index': [0.2769010043041607, 0.32062391681109187], 'perimeter_min': [386, 370], 'perimeter': [1394, 1154]}</code></pre>

页面列表

ITEM_HTML