python-awips/metar/a2cvmtrStub.py
2015-06-12 11:57:06 -06:00

210 lines
7.2 KiB
Python

##
# This software was developed and / or modified by Raytheon Company,
# pursuant to Contract DG133W-05-CQ-1067 with the US Government.
#
# U.S. EXPORT CONTROLLED TECHNICAL DATA
# This software product contains export-restricted data whose
# export/transfer/disclosure is restricted by U.S. law. Dissemination
# to non-U.S. persons whether in the United States or abroad requires
# an export license or other authorization.
#
# Contractor Name: Raytheon Company
# Contractor Address: 6825 Pine Street, Suite 340
# Mail Stop B8
# Omaha, NE 68106
# 402.291.0100
#
# See the AWIPS II Master Rights File ("Master Rights File.pdf") for
# further licensing information.
##
# Gets all available Laps metar data in the A-II database over a specified range
# of times within a specifed area. The data is output to stdout as ASCII.
# Each line is one time/station combination. The individual data items are comma
# delimited.
#
# SOFTWARE HISTORY
#
# Date Ticket# Engineer Description
# ------------ ---------- ----------- --------------------------
# 09/15/2014 3593 nabowle Initial modification. Fix index issues on 2D parameters.
# 09/15/2014 3593 nabowle Replace UEngine with DAF.
#
#
import argparse
import sys
from datetime import datetime
from ufpy.dataaccess import DataAccessLayer
from dynamicserialize.dstypes.com.raytheon.uf.common.time import TimeRange
def get_args():
parser = argparse.ArgumentParser(conflict_handler="resolve")
parser.add_argument("-h", action="store", dest="host",
help="EDEX server hostname (optional)",
metavar="hostname")
parser.add_argument("-b", action="store", dest="start",
help="The start of the time range in YYYY-MM-DD HH:MM",
metavar="start")
parser.add_argument("-e", action="store", dest="end",
help="The end of the time range in YYYY-MM-DD HH:MM",
metavar="end")
parser.add_argument("--lat-min", action="store", dest="latMin", type=float,
help="Minimum latitude", default=0.0, metavar="lat")
parser.add_argument("--lat-max", action="store", dest="latMax", type=float,
help="Maximum latitude", default=90.0, metavar="lat")
parser.add_argument("--lon-min", action="store", dest="lonMin", type=float,
help="Minimum longitude", default=-180.0, metavar="lon")
parser.add_argument("--lon-max", action="store", dest="lonMax", type=float,
help="Maximum longitude", default=180.0, metavar="lon")
return parser.parse_args()
def main():
# The multi-dimensional parameters.
PRES_PARAMS = set(["presWeather"])
SKY_PARAMS = set(["skyCover", "skyLayerBase"])
user_args = get_args()
if user_args.host:
DataAccessLayer.changeEDEXHost(user_args.host)
start = user_args.start
end = user_args.end
if not start or not end:
print >> sys.stderr, "Start or End date not provided"
return
latMin = user_args.latMin
latMax = user_args.latMax
lonMin = user_args.lonMin
lonMax = user_args.lonMax
beginRange = datetime.strptime( start + ":00.0", "%Y-%m-%d %H:%M:%S.%f")
endRange = datetime.strptime( end + ":59.9", "%Y-%m-%d %H:%M:%S.%f")
timerange = TimeRange(beginRange, endRange)
req = DataAccessLayer.newDataRequest("obs")
req.setParameters("stationName","timeObs","wmoId","autoStationType",
"elevation","reportType","presWeather","visibility","skyCover",
"skyLayerBase","altimeter","seaLevelPress","pressChange3Hour",
"pressChangeChar","temperature","tempFromTenths","dewpoint",
"dpFromTenths","windDir","windSpeed","windGust","maxTemp24Hour",
"minTemp24Hour""","precip1Hour","precip3Hour","precip6Hour",
"precip24Hour")
geometries = DataAccessLayer.getGeometryData(req, timerange)
if not geometries :
# print "No data available."
return
msg = ""
wx = []
cvr = []
bas = []
for geoData in geometries:
if set(geoData.getParameters()) & PRES_PARAMS :
wx.append(geoData.getString("presWeather"))
continue
if set(geoData.getParameters()) & SKY_PARAMS :
cvr.append(geoData.getString("skyCover"))
bas.append(geoData.getNumber("skyLayerBase"))
continue
lon = geoData.getGeometry().x
lat = geoData.getGeometry().y
if lon < lonMin or lon > lonMax or lat < latMin or lat > latMax:
wx = []
cvr = []
bas = []
continue
sName = geoData.getString("stationName")
tobs = geoData.getNumber("timeObs")
elev = geoData.getNumber("elevation")
ista = geoData.getNumber("wmoId")
atype = geoData.getString("autoStationType")
repTyp = geoData.getString("reportType")
vis = geoData.getNumber("visibility")
alt = geoData.getNumber("altimeter")
msl = geoData.getNumber("seaLevelPress")
pchg = geoData.getNumber("pressChange3Hour")
pchr = geoData.getString("pressChangeChar")
temp = geoData.getNumber("temperature")
t10 = geoData.getNumber("tempFromTenths")
dpt = geoData.getNumber("dewpoint")
td10 = geoData.getNumber("dpFromTenths")
dir = geoData.getNumber("windDir")
spd = geoData.getNumber("windSpeed")
gust = geoData.getNumber("windGust")
tmx = geoData.getNumber("maxTemp24Hour")
tmn = geoData.getNumber("minTemp24Hour")
pr1 = geoData.getNumber("precip1Hour")
pr3 = geoData.getNumber("precip3Hour")
pr6 = geoData.getNumber("precip6Hour")
pr24 = geoData.getNumber("precip24Hour")
msg += sName + ","
msg += str(tobs/1000) + ","
msg += "%.4f"%lat + ","
msg += "%.4f"%lon + ","
msg += "%.0f"%elev + ","
if ista < 0 :
msg += "-99,"
else :
msg += str(ista) + ","
msg += atype + " ,"
msg += repTyp + " ,"
msg += wx[0] + " ,"
msg += "%.3f"%vis + ","
msg += cvr[0];
kk = 5
while kk > 0 and cvr[0+kk] == "" :
kk -= 1
k = 1
while k <= kk :
msg += "|" + cvr[0+k];
k += 1
msg += " ,"
msg += "%.1f"%bas[0];
kk = 5
while kk > 0 and bas[0+kk] < -9998 :
kk -= 1
k = 1
while k <= kk :
msg += "|" + "%.1f"%bas[0+k];
k += 1
msg += ","
msg += "%.2f"%alt + ","
msg += "%.2f"%msl + ","
msg += "%.0f"%pchg + ","
msg += pchr + " ,"
msg += "%.1f"%temp + ","
msg += "%.1f"%t10 + ","
msg += "%.1f"%dpt + ","
msg += "%.1f"%td10 + ","
msg += "%.0f"%dir + ","
msg += "%.1f"%spd + ","
msg += "%.1f"%gust + ","
msg += "%.1f"%tmx + ","
msg += "%.1f"%tmn + ","
msg += "%.2f"%pr1 + ","
msg += "%.2f"%pr3 + ","
msg += "%.2f"%pr6 + ","
msg += "%.2f"%pr24 + "\n"
wx = []
cvr = []
bas = []
print msg.strip()
if __name__ == '__main__':
main()