[PYTHON] Décoder l'indice de pluie du bassin BUFR à l'aide de PyBufrKit

introduction

L '[indice de pluviométrie du bassin](https: // www), qui est la base de la Distribution des risques d'alerte aux inondations de l'Agence météorologique. Il existe des données appelées .jma.go.jp / jma / kishou / know / bosai / ryuikishisu.html). Ces données représentent le montant correspondant au débit de la rivière, et la valeur est définie pour chaque code de maille tertiaire et code de rivière, et est stockée au format BUFR4. Il existe différentes méthodes de décodage du BUFR, mais comme l'indice de pluviométrie du bassin utilise une table locale propre à l'Agence météorologique, il ne peut pas être lu sans spécifier une table locale avec un outil.

Si vous recherchez "indice de précipitations du bassin BUFR", vous trouverez Méthode de décodage au format BUFR4 La méthode utilisant la bibliothèque libECBUFR est un hit. Bien sûr, c'est bien, mais c'est un peu lourd à installer, et c'est pratique d'utiliser Python, qui est populaire ces jours-ci, j'ai donc utilisé un package Python appelé PyBufrKit. enquêté.

Comment utiliser

Installation

Il semble qu'il ne puisse pas être installé avec conda, alors appuyez surpip install pybufrkit.

Spécifier une table locale

Confirmation du tableau utilisé dans l'indice des précipitations du bassin BUFR

Tout d'abord, lisez Information technique n ° 446 sur les matériaux de distribution, puis lisez le tableau utilisé dans l'indice des précipitations du bassin BUFR. Vérifiez les paramètres liés à. bufr_a.png

Ou vous pouvez appuyer sur la commande pybufrkit et vous verrez une erreur. Les paramètres liés au tableau sont les suivants.

info


$ pybufrkit info (Fichier BUFR)
(Abréviation)
master_table_number = 0
originating_centre = 34
originating_subcentre = 0
master_table_version = 26
local_table_version = 1

Téléchargement de la table principale

Téléchargez la table maître au format JSON pour PyBufrKit correspondant aux paramètres ci-dessus à partir de PyBufrKit GitHub. Les fichiers à lire sont TableB.json et TableD.json danstables / {master_table_number} / 0_0 / {master_table_version}(il y a aussi code_and_flag.json dans le même répertoire, mais cette fois il manque. Mais cela a fonctionné). Par conséquent, dans ce cas, https://github.com/ywangd/pybufrkit/tree/master/pybufrkit/tables/0/0_0/26 Vous pouvez télécharger les tables suivantes de / tables / 0 / 0_0 / 26). L'emplacement de ce répertoire tables téléchargé est spécifié au moment de l'exécution, vous pouvez donc le placer où vous le souhaitez.

Vérifions le contenu de la table au format JSON téléchargée. D'abord du tableau B.

0/0_0/26/TableB.json


{"000001": ["TABLE A: ENTRY", "CCITT IA5", 0, 0, 24, "Character", 0, 3]}

Cette signification peut être facilement comprise en regardant Spécifications du Tableau B de l'OMM. TableB.png Les trois derrière ne sont pas utilisés pour CREX, vous pouvez donc les remplir de mannequins lorsque vous créez votre propre table locale.

Ensuite, jetons un coup d'œil au tableau D.

0/0_0/26/TableD.json


{
	"300002": ["", ["000002", "000003"]],
	"300003": ["(F, X, Y of descriptor to be added or defined)", ["000010", "000011", "000012"]]
}

Cela a également du sens par rapport aux Spécifications du Tableau D de l'OMM. TableD.png

Création d'une table locale pour JMA

Maintenant que vous connaissez le format de la table, créez une table locale JMA dans le répertoire suivant. tables/{master_table_number}/{originating_centre}_{originating_subcentre}/{local_table_version}/Table{B,D}.json Plus précisément, il devient tables / 0 / 34_0 / 1 / Table {B, D} .json.

Premièrement, en ce qui concerne le tableau B, le tableau intitulé "Descripteur d'élément" dans Information technique n ° 446 sur les matériaux de distribution à voir. TableB_JMA.png

Par conséquent, les fichiers suivants doivent être créés.

0/34_0/1/TableB.json


{
    "008021": ["TIME SIGNIFICANCE", "CODE TABLE", 0, 0, 5, "CODE TABLE", 0, 2],
    "004001": ["YEAR", "YEAR", 0, 0, 12, "YEAR", 0, 4],
    "004002": ["MONTH", "MONTH", 0, 0, 4, "MONTH", 0, 2],
    "004003": ["DAY", "DAY", 0, 0, 6, "DAY", 0, 2],
    "004004": ["HOUR", "HOUR", 0, 0, 5, "HOUR", 0, 2],
    "004005": ["MINUTE", "MINUTE", 0, 0, 6, "MINUTE", 0, 2],
    "001210": ["RIVER CODE", "Numeric", 0, 80000000, 24, "Numeric", 0, 8],
    "005240": ["INDEX OF LATITUDE FOR 1ST ORDER MESH", "Numeric", 0, 0, 7, "Numeric", 0, 4],
    "006240": ["INDEX OF LONGITUDE FOR 1ST ORDER MESH", "Numeric", 0, 0, 7, "Numeric", 0, 4],
    "005241": ["INDEX OF LATITUDE FOR 2ND ORDER MESH", "Numeric", 0, 0, 4, "Numeric", 0, 2],
    "006241": ["INDEX OF LONGITUDE FOR 2ND ORDER MESH", "Numeric", 0, 0, 4, "Numeric", 0, 2],
    "005242": ["INDEX OF LATITUDE FOR 3RD ORDER MESH", "Numeric", 0, 0, 4, "Numeric", 0, 2],
    "006242": ["INDEX OF LONGITUDE FOR 3RD ORDER MESH", "Numeric", 0, 0, 4, "Numeric", 0, 2],
    "013212": ["RUNOFF INDEX (HIGH ACCURACY)", "Numeric", 1, 0, 12, "Numeric", 0, 4]
}

De même, le tableau D est également appelé "descripteur agrégé" dans Information technique n ° 446 concernant les matériels de distribution. Regarde la table. TableD_JMA.png

Par conséquent, les fichiers suivants doivent être créés.

0/34_0/1/TableD.json


{
    "301011": ["", ["004001", "004002", "004003"]],
    "301012": ["", ["004004", "004005"]],
    "301200": ["", ["005240", "006240", "005241", "006241", "005242", "006242"]]
}

Comment utiliser sur la ligne de commande

help


$ pybufrkit -h
usage: pybufrkit [-h] [-v] [--info | --debug] [-d DEFINITIONS_DIRECTORY]
                 [-t TABLES_ROOT_DIRECTORY]
                 command ...

--Spécifiez le répertoire de la table créée avec -t --Référence: https://github.com/ywangd/pybufrkit/issues/5 --Afficher uniquement les informations sur les fichiers - pybufrkit -t ./tables info ${bufrfile}

Comment utiliser comme module Python

Exemple de programme pour convertir en JSON

bufr2json.py


import os
from pybufrkit.decoder import Decoder
from pybufrkit.renderer import FlatJsonRenderer


class BufrConverter:
    def __init__(self):
        self.TOPDIR = os.path.dirname(os.path.abspath(__file__))
        self.decoder = Decoder(tables_root_dir=f"{self.TOPDIR}/tables")
        self.renderer = FlatJsonRenderer()

    def convert(self, ini, region):
        filename = f"Z__C_RJTD_{ini}_MET_SEQ_Ggis1km_Proi_Aper10min_RJsuikei{region}_ANAL_bufr4.bin"
        filepath = f"{self.TOPDIR}/bufr/{filename}"
        with open(filepath, 'rb') as buf:
            bufr_message = self.decoder.process(buf.read())
        json = self.renderer.render(bufr_message)
        return json

Avertissements émis pendant les travaux et notes sur leur signification

Si ces avertissements n'étaient pas résolus, un message d'erreur serait émis en même temps lors de la sortie vers JSON, ce qui serait un obstacle. Remarque pour référence.

Recommended Posts

Décoder l'indice de pluie du bassin BUFR à l'aide de PyBufrKit
Pré-traiter l'index en Python à l'aide de ScriptUpdateProcessor de Solr