def get_coops(start, end, sos_name, units, bbox, verbose=False): collector = CoopsSos() collector.set_bbox(bbox) collector.end_time = end collector.start_time = start collector.variables = [sos_name] ofrs = collector.server.offerings title = collector.server.identification.title config = dict(units=units, sos_name=sos_name,) data = collector2table( collector=collector, config=config, col="{} ({})".format(sos_name, units.format(cf_units.UT_ISO_8859_1)), ) # Clean the table. table = dict( station_name=[s._metadata.get("station_name") for s in data], station_code=[s._metadata.get("station_code") for s in data], sensor=[s._metadata.get("sensor") for s in data], lon=[s._metadata.get("lon") for s in data], lat=[s._metadata.get("lat") for s in data], depth=[s._metadata.get("depth", "NA") for s in data], ) table = pd.DataFrame(table).set_index("station_name") if verbose: print("Collector offerings") print("{}: {} offerings".format(title, len(ofrs))) return data, table
def get_coops(start, end, sos_name, units, bbox, verbose=False): """ function to read COOPS data We need to retry in case of failure b/c the server cannot handle the high traffic during hurricane season. """ print(' >> Get CO-OPS information') collector = CoopsSos() collector.set_bbox(bbox) collector.end_time = end collector.start_time = start collector.variables = [sos_name] ofrs = collector.server.offerings title = collector.server.identification.title config = dict( units=units, sos_name=sos_name, datum='MSL', ###Saeed added ) data = collector2table( collector=collector, config=config, col='{} ({})'.format(sos_name, units.format(cf_units.UT_ISO_8859_1)) ) # Clean the table. table = dict( station_name = [s._metadata.get('station_name') for s in data], station_code = [s._metadata.get('station_code') for s in data], sensor = [s._metadata.get('sensor') for s in data], lon = [s._metadata.get('lon') for s in data], lat = [s._metadata.get('lat') for s in data], depth = [s._metadata.get('depth', 'NA') for s in data], ) table = pd.DataFrame(table).set_index('station_name') if verbose: print('Collector offerings') print('{}: {} offerings'.format(title, len(ofrs))) return data, table
ndbc['name'] = names ndbc.set_index('name', inplace=True) to_html(ndbc.head()) # ### CoopsSoS # In[9]: from pyoos.collectors.coops.coops_sos import CoopsSos collector_coops = CoopsSos() collector_coops.set_bbox(bbox) collector_coops.end_time = stop collector_coops.start_time = start collector_coops.variables = [sos_name] ofrs = collector_coops.server.offerings title = collector_coops.server.identification.title log.info(fmt(' Collector offerings ')) log.info('{}: {} offerings'.format(title, len(ofrs))) # In[10]: from utilities import get_coops_metadata coops = collector2table(collector=collector_coops)
dap_urls = non_stations print(fmt(" Filtered DAP ")) for url in dap_urls: print("{}.html".format(url)) Now we have a nice list of all the models available in the catalog for the domain we specified. We still need to find the observations for the same domain. To accomplish that we will use the `pyoos` library and search the [SOS CO-OPS](https://opendap.co-ops.nos.noaa.gov/ioos-dif-sos/) services using the virtually the same configuration options from the catalog search. from pyoos.collectors.coops.coops_sos import CoopsSos collector_coops = CoopsSos() collector_coops.set_bbox(config["region"]["bbox"]) collector_coops.end_time = config["date"]["stop"] collector_coops.start_time = config["date"]["start"] collector_coops.variables = [config["sos_name"]] ofrs = collector_coops.server.offerings title = collector_coops.server.identification.title print(fmt(" Collector offerings ")) print("{}: {} offerings".format(title, len(ofrs))) To make it easier to work with the data we extract the time-series as pandas tables and interpolate them to a common 1-hour interval index. import pandas as pd from ioos_tools.ioos import collector2table data = collector2table(
sos_name = "water_surface_height_above_reference_datum" In this example we will use only the `CoopsSos`, but it is worth mentioning that `pyoos` has other collectors like IOOS SWE, NcSOS, 52N, NERRS, NDBC, etc. Pyoos' usage is quite simple, all we have to do is: - create an instance of the collector we will use and, - feed the instance with the data for the collection. from pyoos.collectors.coops.coops_sos import CoopsSos collector = CoopsSos() collector.set_bbox(bbox) collector.end_time = end_time collector.start_time = start_time collector.variables = [sos_name] Let's check we we got with the search above. ofrs = collector.server.offerings title = collector.server.identification.title print("Collector offerings") print("{}: {} offerings".format(title, len(ofrs))) OK... That is quite misleading. We did not find 1113 stations with that search. That number is probably all the CO-OPS SOS stations available.