我正在尝试在Flask应用程序中创建一个天气小部件。我被困在以度(角度)为单位的风向上。
如果我们使用以下图像作为表示形式:
在使用风向时,我们限制在360度范围内。我想根据风向获得的360度范围来分配图标,以帮助您了解以下信息:
| Cardinal Direction | Degree Direction |
|:------------------:|------------------|
| N | 348.75 - 11.25 |
| NNE | 11.25 - 33.75 |
| NE | 33.75 - 56.25 |
| ENE | 56.25 - 78.75 |
| E | 78.75 - 101.25 |
| ESE | 101.25 - 123.75 |
| SE | 123.75 - 146.25 |
| SSE | 146.25 - 168.75 |
| S | 168.75 - 191.25 |
| SSW | 191.25 - 213.75 |
| SW | 213.75 - 236.25 |
| WSW | 236.25 - 258.75 |
| W | 258.75 - 281.25 |
| WNW | 281.25 - 303.75 |
| NW | 303.75 - 326.25 |
| NNW | 326.25 - 348.75 |
我将把键/值存储在字典中,并创建一个if elif else循环,该循环将执行以下操作:
from numpy import arange
degrees = the_json_response['wind']['deg']
wind_directions = {
'N': arange(348.75, 11.25, 0.25),
...
}
degrees_range = range(0, 360)
if degrees in wind_direction['N']:
dirction = north_icon
elif degrees in wind_direction['NNE']:
direction = north_north_east_icon
以上仅为伪代码。总之,我该如何应用它,以便我们只能在360度范围内工作,因为显然,由于在北风方向上工作,它会在一定范围内,因此会抛出错误。 348.75-11.25,我们需要告诉我们我们正在360度工作。
我之所以无法做到这一点,是因为我从未学习过复杂的数学(对我来说,这是)。如果有人对我如何以一种更好的方式应用它的建议,我很乐意接受这些建议。
答案 0 :(得分:0)
这里是一个主意:您可以检查度数范围的上限是否低于下限,然后分两步创建arange
。例如:348.75, 11.25
是上限11.25
小于下限348.75
的唯一情况,这意味着由于周期性,360
介于两者之间。对于所有其他角度范围和方向,上限大于下限。因此,您可以通过以下方式创建N
:在一个范围内包含360
,在另一个范围内包含其余值。
x = np.arange( 348.75, 360, 0.25)
y = np.arange(0.25, 11.25, 0.25)
'N' = np.concatenate((x ,y), axis=0)
只是一个想法,也许您可以对此加以改进。
答案 1 :(得分:0)
要将任何数字包装到特定范围,请使用模(%
):How does % work in Python?。幸运的是,python实现使结果的符号始终等于右手操作数。以下是一些如何将所有内容以模数形式包装到所需范围的示例:
>>> 45 % 360
45
>>> -38 % 360
322
>>> 1000 % 360
280
鉴于此,将以度为单位的任何值映射到字母缩写非常容易。每个缩写代表一个22.5度宽的窗口。窗口从零偏移11.25度,因此我们可以通过这样做获得窗口索引
from math import floor
index = floor(((deg + 11.25) % 360) / 22.5)
此索引始终是零到15之间的数字。您可以直接使用它来索引罗盘的点列表,而无需任何词典或昂贵的搜索:
list_of_points = ['N', 'NNE', 'NE', ..., 'NW', 'NNW']
def deg_to_point(deg):
return list_of_points[floor(((deg + 11.25) % 360) / 22.5)]
之所以可行,是因为您所有的垃圾箱大小均相同。例如,如果您想在罗盘上增加点数,则可以将11.25和22.5减半。如果您有不相等的垃圾箱,最好的选择是使用模数对输入进行归一化,然后在垃圾箱边缘进行二进制搜索。