[PYTHON] Dekodieren Sie den Niederschlagsindex des Beckens BUFR mit PyBufrKit

Einführung

Der [Beckenregenindex](https: // www), der die Grundlage für die Verteilung des Hochwasserwarnrisikos der Meteorologischen Agentur bildet. Es gibt Daten mit dem Namen .jma.go.jp / jma / kishou / know / bosai / ryuikishisu.html). Diese Daten stellen die Menge dar, die der Flussrate des Flusses entspricht, und der Wert wird für jeden Tertiärnetzcode und Flusscode definiert und im BUFR4-Format gespeichert. Es gibt verschiedene Methoden zum Dekodieren von BUFR. Da der Niederschlagsindex des Beckens jedoch eine lokale Tabelle verwendet, die für die Meteorologische Agentur eindeutig ist, kann er nicht gelesen werden, ohne mit einem Werkzeug eine lokale Tabelle anzugeben.

Wenn Sie nach "Becken-Niederschlagsindex BUFR" suchen, finden Sie Dekodierungsmethode im BUFR4-Format, eine kanadische BUFR. Die Methode mit der Bibliothek libECBUFR ist ein Hit. Natürlich ist das in Ordnung, aber die Installation ist etwas umständlich und es ist praktisch, Python zu verwenden, was heutzutage sehr beliebt ist. Deshalb habe ich ein Python-Paket namens PyBufrKit verwendet. untersucht.

Wie benutzt man

Installation

Es scheint, dass es nicht mit "conda" installiert werden kann, also drücke "pip install pybufrkit".

Angeben einer lokalen Tabelle

Bestätigung der im Beckenregenindex BUFR verwendeten Tabelle

Lesen Sie zuerst Technische Informationen Nr. 446 zu Verteilungsmaterialien und dann die Tabelle, die im Beckenregenindex BUFR verwendet wird. Überprüfen Sie die Parameter in Bezug auf. bufr_a.png

Oder Sie können den Befehl pybufrkit drücken und es wird ein Fehler angezeigt. Die auf die Tabelle bezogenen Parameter sind wie folgt.

info


$ pybufrkit info (BUFR-Datei)
(Abkürzung)
master_table_number = 0
originating_centre = 34
originating_subcentre = 0
master_table_version = 26
local_table_version = 1

Master-Tabelle herunterladen

Laden Sie die JSON-formatierte Mastertabelle für PyBufrKit herunter, die den obigen Parametern entspricht, von PyBufrKit GitHub. Die zu lesenden Dateien sind "TableB.json" und "TableD.json" in "tables / {master_table_number} / 0_0 / {master_table_version}" (es befindet sich auch "code_and_flag.json" im selben Verzeichnis, diesmal fehlt es jedoch. Aber es hat funktioniert). In diesem Fall daher https://github.com/ywangd/pybufrkit/tree/master/pybufrkit/tables/0/0_0/26 Sie können die folgenden Tabellen von / tables / 0 / 0_0 / 26) herunterladen. Der Speicherort dieses heruntergeladenen "Tabellen" -Verzeichnisses wird zur Laufzeit angegeben, sodass Sie es an einer beliebigen Stelle platzieren können.

Lassen Sie uns den Inhalt der heruntergeladenen JSON-Formattabelle überprüfen. Zuerst aus Tabelle B.

0/0_0/26/TableB.json


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

Diese Bedeutung kann leicht unter WMO-Tabelle B-Spezifikationen verstanden werden. TableB.png Die drei dahinter werden nicht für CREX verwendet, sodass Sie sie beim Erstellen Ihrer eigenen lokalen Tabelle mit Dummies füllen können.

Schauen wir uns als nächstes Tabelle D an.

0/0_0/26/TableD.json


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

Dies ist auch im Vergleich zu WMO-Tabelle D-Spezifikationen sinnvoll. TableD.png

Erstellen einer lokalen Tabelle für JMA

Nachdem Sie das Format der Tabelle kennen, erstellen Sie eine lokale JMA-Tabelle im folgenden Verzeichnis. tables/{master_table_number}/{originating_centre}_{originating_subcentre}/{local_table_version}/Table{B,D}.json Insbesondere wird es zu "tables / 0 / 34_0 / 1 / Table {B, D} .json".

Zu Tabelle B gehört zunächst die Tabelle "Elementdeskriptor" in Technische Informationen Nr. 446 zu Verteilungsmaterialien. sehen. TableB_JMA.png

Daher sollten die folgenden Dateien erstellt werden.

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]
}

In ähnlicher Weise wird Tabelle D in Technische Informationen Nr. 446 zu Vertriebsmaterialien auch als "Aggregatdeskriptor" bezeichnet. Schau auf den Tisch. TableD_JMA.png

Daher sollten die folgenden Dateien erstellt werden.

0/34_0/1/TableD.json


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

Verwendung in der Befehlszeile

help


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

Verwendung als Python-Modul

Beispielprogramm zum Konvertieren in 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

Während der Arbeit ausgegebene Warnungen und Hinweise zu deren Bedeutung

Wenn diese Warnungen nicht behoben würden, würde bei der Ausgabe an JSON gleichzeitig eine Fehlermeldung ausgegeben, was ein Hindernis wäre. Hinweis als Referenz.

Recommended Posts

Dekodieren Sie den Niederschlagsindex des Beckens BUFR mit PyBufrKit
Verarbeiten Sie den Index in Python mit dem ScriptUpdateProcessor von Solr vor