Conversion de la direction du vent en angles en mots de texte

J'ai des données de direction du vent provenant d'une girouette, et les données sont représentées en 0 à 359 degrés.

Je veux convertir cela en format texte (rose des vents) avec 16 directions différentes.

Fondamentalement, je veux savoir s'il existe un moyen rapide de mettre à l'échelle la lecture de l'angle à un tableau de 16 chaînes pour imprimer la direction du vent correcte sans utiliser un tas d'instructions if et vérifier les plages d'angles

Direction du Vent peut être trouvé ici.

Merci!

26
demandé sur Matt Frear 2011-09-20 23:26:19

12 réponses

Modifier:

Comme il y a un changement d'angle à tous les 22,5 degrés, la direction devrait échanger les mains après 11,25 degrés.

Donc:

349-360//0-11 = N
12-33 = NNE
34-56 = NE

L'utilisation de valeurs de 327-348 (l'ensemble du spectre NNW) n'a pas réussi à produire un résultat pour la réponse d'eudoxos. Après avoir réfléchi, Je ne pouvais pas trouver la faille dans sa logique, alors j'ai réécrit la mienne..

def degToCompass(num):
    val=int((num/22.5)+.5)
    arr=["N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"]
    print arr[(val % 16)]

>>> degToCompass(0)
N
>>> degToCompass(180)
S
>>> degToCompass(720)
N
>>> degToCompass(11)
N
>>> 12
12
>>> degToCompass(12)
NNE
>>> degToCompass(33)
NNE
>>> degToCompass(34)
NE

Étapes:

  1. divisez l'angle par 22,5 car 360deg / 16 directions = 22.5 degrés/changement de direction.
  2. ajouter .5 de sorte que lorsque vous tronquez la valeur, vous pouvez briser le 'lien' entre le seuil de changement.
  3. tronquer la valeur en utilisant la division entière (donc il n'y a pas d'arrondi).
  4. indexez directement dans le tableau et imprimez la valeur (mod 16).
54
répondu steve-gregory 2011-09-21 15:52:08

Voici une implémentation javascript de la réponse de steve-gregory, qui fonctionne pour moi.

function degToCompass(num) {
    var val = Math.floor((num / 22.5) + 0.5);
    var arr = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"];
    return arr[(val % 16)];
}

Voir sa réponse pour une explication de la logique.

20
répondu Matt Frear 2017-05-23 12:34:33

Attention aux arrondis, angles entre 349...11 devrait être "N", donc ajouter d'abord la moitié du secteur (+(360/16) / 2), puis gérer le débordement sur 360 par %360, puis diviser par 360/16:

["N","NNW",...,"NNE"][((d+(360/16)/2)%360)/(360/16)]
11
répondu eudoxos 2012-09-28 15:15:13

J'ai vérifié cela et cela fonctionne très bien et semble précis. Source: http://www.themethodology.net/2013/12/how-to-convert-degrees-to-cardinal.html par Adrian Stevens

    public static string DegreesToCardinal(double degrees)
    {
        string[] caridnals = { "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" };
        return caridnals[(int)Math.Round(((double)degrees % 360) / 45)];
    }

    public static string DegreesToCardinalDetailed(double degrees)
    {
        degrees *= 10;

        string[] caridnals = { "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N" };
        return caridnals[(int)Math.Round(((double)degrees % 3600) / 225)];
    }
3
répondu user2675312 2016-08-25 13:35:27

L'inverse:

function getDir($b)
{

   $dirs = array('N'=>0, 'NNE'=>22.5,"NE"=>45,"ENE"=>67.5, 'E'=>90,'ESE'=>112.5, 'SE'=>135,'SSE'=>157.5, 'S'=>180,'SSW'=>202.5, 'SW'=>225,'WSW'=>247.5, 'W'=>270,'WNW'=>292.5,'NW'=>315,'NNW'=>237.5, 'N'=>0,'North'=>0,'East'=>90,'West'=>270,'South'=>180);
   return $dirs[$b];
}
2
répondu Arne Kaas 2014-10-20 13:47:47

Je ferais probablement juste une simple division des degrés pour obtenir une position dans un tableau ou une valeur enum ou quelque chose qui vous donnerait le texte dont vous avez besoin. Juste arrondir à la baisse sur l'ensemble de votre division. 360/16 = 22,5, donc vous voudriez diviser par 22,5 pour obtenir la position.

Chaîne [] a = [N, NNW, NW, WNW,...,NNE]

1
répondu Joseph 2011-09-20 19:35:27

Je crois qu'il est plus facile de:

  1. déplacez la direction de 11,25
  2. Ajouter un "N" à la fin de la liste orientation pour gérer plus de 360',

DirTable = ["N","NNE","NE","ENE","E","ESE", "SE","SSE","S","SSW","SW","WSW", "W","WNW","NW","NNW",**"N"**]; 

wind_direction= DirTable[Math.floor((d+11.25)/22.5)];
1
répondu edom-plc 2012-10-28 16:40:06

Fonction Javascript 100% de travail

function degToCompass(num) { 
    while( num < 0 ) num += 360 ;
    while( num >= 360 ) num -= 360 ; 
    val= Math.round( (num -11.25 ) / 22.5 ) ;
    arr=["N","NNE","NE","ENE","E","ESE", "SE", 
          "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"] ;
    return arr[ Math.abs(val) ] ;
}

Les Étapes

  1. étant donné un angle de 360 degrés
  2. puisque le nord est compris entre -11.25 et 11,25, nous soustrayons 11,25 pour la précision
  3. divisez l'angle par 22.5 car 360deg / 16 directions = 22.5 deg/changement de direction
  4. Mathématiques.abs Pour comme négatif est encore au nord
  5. sélectionnez le segment de arr à partir de la réponse

J'espère que ça aide

1
répondu Pascal 2015-05-08 08:00:47

Cela fonctionne bien

#!/usr/bin/env python

def wind_deg_to_str1(deg):
        if   deg >=  11.25 and deg <  33.75: return 'NNE'
        elif deg >=  33.75 and deg <  56.25: return 'NE'
        elif deg >=  56.25 and deg <  78.75: return 'ENE'
        elif deg >=  78.75 and deg < 101.25: return 'E'
        elif deg >= 101.25 and deg < 123.75: return 'ESE'
        elif deg >= 123.75 and deg < 146.25: return 'SE'
        elif deg >= 146.25 and deg < 168.75: return 'SSE'
        elif deg >= 168.75 and deg < 191.25: return 'S'
        elif deg >= 191.25 and deg < 213.75: return 'SSW'
        elif deg >= 213.75 and deg < 236.25: return 'SW'
        elif deg >= 236.25 and deg < 258.75: return 'WSW'
        elif deg >= 258.75 and deg < 281.25: return 'W'
        elif deg >= 281.25 and deg < 303.75: return 'WNW'
        elif deg >= 303.75 and deg < 326.25: return 'NW'
        elif deg >= 326.25 and deg < 348.75: return 'NNW'
        else: return 'N'

def wind_deg_to_str2(deg):
        arr = ['NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW', 'N']
        return arr[int(abs((deg - 11.25) % 360)/ 22.5)]

i = 0
while i < 360:
        s1 = wind_deg_to_str1(i)
        s2 = wind_deg_to_str2(i)
        print '%5.1f deg -> func1(%-3s), func2(%-3s), same:%s' % (i, s1, s2, ('ok' if s1 == s2 else 'different'))
        i += 0.5
0
répondu Hristo markow 2017-01-23 15:42:22

Utilisé dans Excel: VLOOKUP(MROUND (N12, 22.5), N14: O29, 2, FALSE)

La cellule N12 est la direction vers en degrés pour laquelle une réponse est nécessaire. La gamme N14: O29 regarde le secteur(A à R):

SECTEUR ÉOLIEN 0 Un 22,5 B 45 C De 67,5 D 90 E 112,5 F 135 G 157,5 H 180 J 202,5 K 225 L 247.5 M 270 N 292.5 P 315 Q 337,5 R

0
répondu John Babin 2017-09-04 19:57:05

Si vous êtes arrivé ici et ne sont intéressés à briser vos degrés dans l'une des 8 directions.

function degToCompass(num){
    const val =  Math.floor((num / 45) + 0.5);
    const arr = ["N","NE","E", "SE","S","SW","W","NW"];
    return arr[(val % 8)]
0
répondu Enda Molloy 2018-03-05 15:26:58

J'utilise beaucoup R et j'avais besoin d'une solution pour cela. C'est ce que je suis venu avec et fonctionne bien pour toutes les combinaisons possibles que je l'ai nourri:

degToCardinal <- function(degrees) {
  val <- as.integer((degrees / 22.5) + 0.5)
  arr <- c("N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW")
  return(arr[((val+1) %% 16)])
}
0
répondu azdatasci 2018-09-26 19:44:02