Examples¶
RDT Contour Extraction¶
import bufrpy
from bufrpy.template import safnwc
import re
import itertools
import sys
def to_rings(bufrmsg):
""" Return a list of cloud contours as closed rings, in lat/lon ordinate order"""
out = []
subsets = bufrmsg.section4.subsets
for subset in subsets:
for cloudsystem in subset.values[19]: # cloud systems are at index 19
contour = cloudsystem[0] # contour is at index 0 of cloud system
point_vals = list(itertools.chain(contour, itertools.islice(contour,1))) # close contour
points = []
for (lat, lon) in point_vals:
points.append((lat.value, lon.value)) # extract values
out.append(points)
return out
def to_wkt(rings):
out = []
for ring in rings:
# Change ordinate order, convert to strings, join and stick in a POLYGON
points = [" ".join(map(str, reversed(latlon))) for latlon in ring]
edge = ",".join(points)
out.append("POLYGON((" + edge + "))")
return "\n".join(out)
if __name__ == '__main__':
template = safnwc.read_template(open(sys.argv[1], 'rb'))
msg = bufrpy.decode_file(open(sys.argv[2], 'rb'), template)
rings = to_rings(msg)
wkt = to_wkt(rings)
print wkt