# Copyright 2005-2017 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. # # Description: how to encode flight dataset into BUFR from datetime import datetime import traceback import numpy as np import sys from eccodes import * VERBOSE = 1 # verbose error reporting def example(csvfile, input_filename, output_filename): fbufrin = open(input_filename, 'rb') fbufrout = open(output_filename, 'wb') print 'Using ecCodes version: ', codes_get_api_version() # The first line in the CSV has the column names print 'Reading input CSV file: ', csvfile parse_date = lambda x: datetime.strptime(x, '%Y%m%d') parse_time = lambda x: datetime.strptime(x, '%H:%M:%S') data = np.genfromtxt(csvfile, delimiter=',', dtype=None, names=True, converters={0: parse_date, 1: parse_time}) ymd_column = data['ymd'] years = np.array([x.year for x in ymd_column]) months = np.array([x.month for x in ymd_column]) days = np.array([x.day for x in ymd_column]) time_column = data['time'] hours = np.array([x.hour for x in time_column]) minutes = np.array([x.minute for x in time_column]) seconds = np.array([x.second for x in time_column]) latitudes = data['latitude'] longitudes = data['longitude'] altitudes = data['altitude'] pressures = data['pressure'] windSpeeds = data['windSpeed'] windDirections = data['windDirection'] temperatures = data['temperature'] print 'Reading input BUFR file: ', input_filename bufr = codes_bufr_new_from_file(fbufrin) codes_set(bufr, 'masterTablesVersionNumber', 24) codes_set(bufr, 'localTablesVersionNumber', 0) codes_set(bufr, 'compressedData', 1) codes_set(bufr, 'numberOfSubsets', len(years)) # unexpandedDescriptors and BufrTemplate can be set alternatively # to choose the template for the BUFR message #unexpandedDescriptors = [301051,4006,7002,10004,12001,11001,11002,11031,11032,11033,20041] #codes_set_array(bufr, 'unexpandedDescriptors', unexpandedDescriptors) codes_set(bufr,'BufrTemplate','aircraftReportWithSecondsAndPressure') codes_set_array(bufr, 'year', years) codes_set_array(bufr, 'month', months) codes_set_array(bufr, 'day', days) codes_set_array(bufr, 'hour', hours) codes_set_array(bufr, 'minute', minutes) codes_set_array(bufr, 'second', seconds) codes_set_array(bufr, 'latitude', latitudes) codes_set_array(bufr, 'longitude', longitudes) codes_set_array(bufr, 'height', altitudes) codes_set_array(bufr, 'nonCoordinatePressure', pressures) codes_set_array(bufr, 'windSpeed', windSpeeds) codes_set_array(bufr, 'windDirection', windDirections) codes_set_array(bufr, 'airTemperature', temperatures) codes_set(bufr, 'pack', 1) codes_write(bufr, fbufrout) print 'Created output BUFR file: ', output_filename def main(): if len(sys.argv) < 4: print >>sys.stderr, 'Usage: ', sys.argv[0], ' csv bufr_in bufr_out' sys.exit(1) csv_filename = sys.argv[1] input_filename = sys.argv[2] output_filename = sys.argv[3] try: example(csv_filename, input_filename, output_filename) except CodesInternalError as err: if VERBOSE: traceback.print_exc(file=sys.stderr) else: sys.stderr.write(err.msg + '\n') return 1 if __name__ == "__main__": sys.exit(main())