mirror of https://github.com/ecmwf/eccodes.git
Examples: BUFR radiosonde in Python (Updated by Bruce)
This commit is contained in:
parent
f215d2bd12
commit
f1c57fff45
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
. ./include.sh
|
. ./include.sh
|
||||||
|
|
||||||
#Define a common label for all the tmp files
|
# Define a common label for all the tmp files
|
||||||
label="bufr_read_tempf_f"
|
label="bufr_read_tempf_f"
|
||||||
tempOut=temp.${label}.txt
|
tempOut=temp.${label}.txt
|
||||||
tempRef=temp.${label}.ref
|
tempRef=temp.${label}.ref
|
||||||
|
|
|
@ -59,6 +59,7 @@ if( HAVE_BUILD_TOOLS )
|
||||||
bufr_read_tropical_cyclone
|
bufr_read_tropical_cyclone
|
||||||
bufr_read_synop
|
bufr_read_synop
|
||||||
bufr_read_temp
|
bufr_read_temp
|
||||||
|
bufr_read_tempf
|
||||||
bufr_set_keys
|
bufr_set_keys
|
||||||
bufr_subset
|
bufr_subset
|
||||||
get_product_kind
|
get_product_kind
|
||||||
|
@ -93,6 +94,7 @@ else()
|
||||||
bufr_read_tropical_cyclone
|
bufr_read_tropical_cyclone
|
||||||
bufr_read_synop
|
bufr_read_synop
|
||||||
bufr_read_temp
|
bufr_read_temp
|
||||||
|
bufr_read_tempf
|
||||||
bufr_set_keys
|
bufr_set_keys
|
||||||
bufr_subset
|
bufr_subset
|
||||||
get_product_kind
|
get_product_kind
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright 2005- ECMWF.
|
# (C) Copyright 2005- ECMWF.
|
||||||
#
|
#
|
||||||
# This software is licensed under the terms of the Apache Licence Version 2.0
|
# This software is licensed under the terms of the Apache Licence Version 2.0
|
||||||
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
@ -28,6 +28,7 @@ import sys
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from eccodes import *
|
from eccodes import *
|
||||||
|
|
||||||
INPUT = "../../data/bufr/PraticaTemp.bufr"
|
INPUT = "../../data/bufr/PraticaTemp.bufr"
|
||||||
|
@ -37,7 +38,7 @@ VERBOSE = 1 # verbose error reporting
|
||||||
def example():
|
def example():
|
||||||
# open BUFR file
|
# open BUFR file
|
||||||
f = open(INPUT, "rb")
|
f = open(INPUT, "rb")
|
||||||
llstdonly = 1
|
llstdonly = 1 # If 1 then list standard levels only, 0 list all levels
|
||||||
cnt = 0
|
cnt = 0
|
||||||
# loop over the messages in the file
|
# loop over the messages in the file
|
||||||
while 1:
|
while 1:
|
||||||
|
@ -57,9 +58,13 @@ def example():
|
||||||
codes_set(bufr, "unpack", 1)
|
codes_set(bufr, "unpack", 1)
|
||||||
# get header information from the message
|
# get header information from the message
|
||||||
try:
|
try:
|
||||||
sid = codes_get(bufr, "aircraftRegistrationNumberOrOtherIdentification")
|
dropid = codes_get(bufr, "aircraftRegistrationNumberOrOtherIdentification")
|
||||||
except Exception:
|
except Exception:
|
||||||
sid = "UNKNOWN"
|
dropid = "UNKNOWN "
|
||||||
|
try:
|
||||||
|
shipid = codes_get(bufr, "shipOrMobileLandStationIdentifier")
|
||||||
|
except Exception:
|
||||||
|
shipid = "UNKNOWN "
|
||||||
|
|
||||||
statid = "00000 "
|
statid = "00000 "
|
||||||
try:
|
try:
|
||||||
|
@ -70,20 +75,30 @@ def example():
|
||||||
except Exception:
|
except Exception:
|
||||||
statid = "00000 "
|
statid = "00000 "
|
||||||
if statid == "00000 ":
|
if statid == "00000 ":
|
||||||
statid = sid[0:8]
|
statid = shipid[0:8]
|
||||||
|
if statid == "UNKNOWN ":
|
||||||
|
statid = dropid[0:8]
|
||||||
|
|
||||||
# subtype = codes_get(bufr,'rdbSubtype')
|
# subtype = codes_get(bufr,'rdbSubtype')
|
||||||
sondetype = codes_get(bufr, "radiosondeType")
|
sondetype = codes_get(bufr, "radiosondeType")
|
||||||
|
if sondetype == CODES_MISSING_LONG:
|
||||||
|
sondetype = 0
|
||||||
slat = codes_get_array(bufr, "latitude")
|
slat = codes_get_array(bufr, "latitude")
|
||||||
slon = codes_get_array(bufr, "longitude")
|
slon = codes_get_array(bufr, "longitude")
|
||||||
|
slat = np.where(slat != CODES_MISSING_DOUBLE, slat, np.nan)
|
||||||
|
slon = np.where(slon != CODES_MISSING_DOUBLE, slon, np.nan)
|
||||||
try:
|
try:
|
||||||
htg = codes_get(bufr, "heightOfStationGroundAboveMeanSeaLevel")
|
htg = codes_get(bufr, "heightOfStationGroundAboveMeanSeaLevel")
|
||||||
|
if htg == CODES_MISSING_DOUBLE:
|
||||||
|
htg = np.nan
|
||||||
except Exception:
|
except Exception:
|
||||||
htg = -999.0
|
htg = np.nan
|
||||||
try:
|
try:
|
||||||
htp = codes_get(bufr, "heightOfBarometerAboveMeanSeaLevel")
|
htp = codes_get(bufr, "heightOfBarometerAboveMeanSeaLevel")
|
||||||
|
if htp == CODES_MISSING_DOUBLE:
|
||||||
|
htp = np.nan
|
||||||
except Exception:
|
except Exception:
|
||||||
htp = -999.0
|
htp = np.nan
|
||||||
year = codes_get(bufr, "year")
|
year = codes_get(bufr, "year")
|
||||||
month = codes_get(bufr, "month")
|
month = codes_get(bufr, "month")
|
||||||
day = codes_get(bufr, "day")
|
day = codes_get(bufr, "day")
|
||||||
|
@ -91,8 +106,10 @@ def example():
|
||||||
minute = codes_get(bufr, "minute")
|
minute = codes_get(bufr, "minute")
|
||||||
try:
|
try:
|
||||||
second = codes_get(bufr, "second")
|
second = codes_get(bufr, "second")
|
||||||
|
if second == CODES_MISSING_LONG:
|
||||||
|
second = 0
|
||||||
except Exception:
|
except Exception:
|
||||||
second = 0.0
|
second = 0
|
||||||
date = str.format("%i%.2i%.2i" % (year, month, day))
|
date = str.format("%i%.2i%.2i" % (year, month, day))
|
||||||
time = str.format("%.2i%.2i%.2i" % (hour, minute, second))
|
time = str.format("%.2i%.2i%.2i" % (hour, minute, second))
|
||||||
try:
|
try:
|
||||||
|
@ -101,7 +118,7 @@ def example():
|
||||||
codes_release(bufr)
|
codes_release(bufr)
|
||||||
continue
|
continue
|
||||||
print(
|
print(
|
||||||
"Ob: %7i %s %s %s %7.3f %8.3f %6.1f %6.1f %3i %4i"
|
"Ob: %7i %8s %s %s %7.3f %8.3f %6.1f %6.1f %3i %4i"
|
||||||
% (
|
% (
|
||||||
cnt,
|
cnt,
|
||||||
statid,
|
statid,
|
||||||
|
@ -127,9 +144,14 @@ def example():
|
||||||
htec = codes_get(
|
htec = codes_get(
|
||||||
bufr, "heightOfStation"
|
bufr, "heightOfStation"
|
||||||
) # Height from WMO list (appended by ECMWF)
|
) # Height from WMO list (appended by ECMWF)
|
||||||
print("WMO list lat, lon, ht: %7.3f %8.3f %6.1f" % (slat[1], slon[1], htec))
|
if htec == CODES_MISSING_LONG:
|
||||||
|
htec = np.nan
|
||||||
|
print(
|
||||||
|
"WMO list lat, lon, ht: %s %7.3f %8.3f %6.1f"
|
||||||
|
% (statid, slat[1], slon[1], htec)
|
||||||
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
htec = 0
|
htec = np.nan
|
||||||
|
|
||||||
# get all the timePeriods
|
# get all the timePeriods
|
||||||
dtime = codes_get_array(bufr, "timePeriod")
|
dtime = codes_get_array(bufr, "timePeriod")
|
||||||
|
@ -156,14 +178,14 @@ def example():
|
||||||
dewt = np.where(dewt != CODES_MISSING_DOUBLE, dewt, np.nan)
|
dewt = np.where(dewt != CODES_MISSING_DOUBLE, dewt, np.nan)
|
||||||
windd = np.where(windd != CODES_MISSING_LONG, windd, np.nan)
|
windd = np.where(windd != CODES_MISSING_LONG, windd, np.nan)
|
||||||
windsp = np.where(windsp != CODES_MISSING_DOUBLE, windsp, np.nan)
|
windsp = np.where(windsp != CODES_MISSING_DOUBLE, windsp, np.nan)
|
||||||
geopoth = np.where(geopoth != CODES_MISSING_DOUBLE, geopoth, np.nan)
|
geopoth = np.where(geopoth != CODES_MISSING_LONG, geopoth, np.nan)
|
||||||
pressure = np.where(pressure != CODES_MISSING_DOUBLE, pressure, np.nan)
|
pressure = np.where(pressure != CODES_MISSING_DOUBLE, pressure, np.nan)
|
||||||
# pressure = np.where(pressure > -1e10, pressure, np.nan)
|
# pressure = np.where(pressure > -1e10, pressure, np.nan)
|
||||||
print(
|
print(
|
||||||
"level dtime dlat dlon pressure geopotH airTemp dewPtT windDir windSp signif"
|
"level dtime dlat dlon pressure geopotH airTemp dewPtT windDir windSp signif"
|
||||||
)
|
)
|
||||||
for i in range(0, len(windsp)):
|
for i in range(0, len(windsp)):
|
||||||
if (not llstdonly) or vsSignif[i] != 65536:
|
if llstdonly and vsSignif[i] != 65536:
|
||||||
continue
|
continue
|
||||||
print(
|
print(
|
||||||
"%5i %6.1f %6.3f %6.3f %8.1f %7.1f %7.2f %7.2f %7.2f %7.2f %7i"
|
"%5i %6.1f %6.3f %6.3f %8.1f %7.1f %7.2f %7.2f %7.2f %7.2f %7i"
|
||||||
|
@ -185,6 +207,7 @@ def example():
|
||||||
codes_release(bufr)
|
codes_release(bufr)
|
||||||
# close the file
|
# close the file
|
||||||
f.close()
|
f.close()
|
||||||
|
print("Finishing normally. Number of BUFR records read: ", cnt)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# (C) Copyright 2005- ECMWF.
|
||||||
|
#
|
||||||
|
# This software is licensed under the terms of the Apache Licence Version 2.0
|
||||||
|
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
#
|
||||||
|
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
|
||||||
|
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
|
||||||
|
#
|
||||||
|
|
||||||
|
. ./include.sh
|
||||||
|
|
||||||
|
|
||||||
|
# Define a common label for all the tmp files
|
||||||
|
label="bufr_read_tempf_p"
|
||||||
|
tempOut=temp.${label}.txt
|
||||||
|
tempRef=temp.${label}.ref
|
||||||
|
rm -f $tempRef $tempOut
|
||||||
|
|
||||||
|
REDIRECT=/dev/null
|
||||||
|
|
||||||
|
# The path to the BUFR file is hardcoded in the example
|
||||||
|
$PYTHON $examples_src/bufr_read_tempf.py > $tempOut
|
||||||
|
|
||||||
|
#TODO: check the results
|
||||||
|
# Check the results
|
||||||
|
cat > $tempRef<<EOF
|
||||||
|
Ob: 1 16245 20151202 110419 41.670 12.450 35.0 36.0 114 64
|
||||||
|
level dtime dlat dlon pressure geopotH airTemp dewPtT windDir windSp signif
|
||||||
|
2 44.0 -0.000 0.001 100000.0 243.0 286.16 280.56 147.00 0.20 65536
|
||||||
|
3 169.0 -0.001 0.000 92500.0 892.0 280.94 278.07 68.00 3.00 65536
|
||||||
|
7 316.0 -0.000 -0.002 85000.0 1593.0 283.60 269.23 60.00 4.00 65536
|
||||||
|
14 630.0 -0.003 0.003 70000.0 3187.0 274.99 244.50 296.00 5.40 65536
|
||||||
|
24 1117.0 -0.005 0.018 50000.0 5828.0 258.61 246.93 310.00 3.30 65536
|
||||||
|
29 1411.0 -0.011 0.030 40000.0 7482.0 247.70 219.91 273.00 2.20 65536
|
||||||
|
32 1761.0 -0.004 0.033 30000.0 9493.0 230.33 216.70 157.00 3.30 65536
|
||||||
|
37 1967.0 0.003 0.028 25000.0 10696.0 220.52 204.05 157.00 5.20 65536
|
||||||
|
42 2234.0 0.016 0.017 20000.0 12098.0 208.45 199.44 119.00 8.40 65536
|
||||||
|
53 2578.0 0.015 0.018 15000.0 13835.0 207.93 190.61 316.00 8.70 65536
|
||||||
|
Finishing normally. Number of BUFR records read: 1
|
||||||
|
EOF
|
||||||
|
|
||||||
|
#diff -w $tempRef $tempOut
|
||||||
|
|
||||||
|
# Clean up
|
||||||
|
rm -f $tempRef $tempOut
|
Loading…
Reference in New Issue