def export2thredds(self, rsfile): ncfile = 'test.nc' orig = Nansat(rsfile) orig.export2thredds(ncfile, bands = {'incidence_angle': {}}) copy = Nansat(ncfile) inc0 = orig['incidence_angle'] inc1 = copy['incidence_angle'] np.testing.assert_allclose(inc0, inc1) os.unlink(ncfile)
def export2thredds(self, rsfile): sys.stderr.write("\nexport2thredds:" + rsfile) ncfile = "test.nc" orig = Nansat(rsfile) orig.export2thredds(ncfile, bands={"incidence_angle": {}}) copy = Nansat(ncfile) inc0 = orig["incidence_angle"] inc1 = copy["incidence_angle"] np.testing.assert_allclose(inc0, inc1) os.unlink(ncfile)
def process(self, uri, force=False, *args, **kwargs): fn = 'WIND_'+os.path.basename(uri) if DatasetURI.objects.filter(uri__contains=fn) and not force: wds = Dataset.objects.filter(dataseturi__uri__contains=fn)[0] return wds, False try: w = wind_from_sar_and_arome_forecast(uri) except (TooHighResolutionError, PolarizationError, ObjectDoesNotExist) as e: if type(e)==Dataset.DoesNotExist: warnings.warn(uri+': '+e.args[0]) else: # ObjectDoesNotExist could happen if there is no overlap between SAR and model warnings.warn(e.file + ': ' + e.msg) return None, False metadata = w.get_metadata() # Direct reprojection fails - gdal can't read the bands if we do w.reproject... # Workaround: Export wind to temporary file #tmp_filename = os.path.join(settings.PRODUCTS_ROOT,'TMP_WIND_'+os.path.basename(uri)) fd, tmp_filename = tempfile.mkstemp(suffix='.nc') os.close(fd) # Just in case - see https://www.logilab.org/blogentry/17873 w.export(tmp_filename) # Read temporary file ww = Nansat(tmp_filename) # Reproject lon, lat = ww.get_geolocation_grids() #lon, lat = w.get_geolocation_grids() srs = '+proj=stere +datum=WGS84 +ellps=WGS84 +lat_0=%.2f +lon_0=%.2f +no_defs'%(np.mean(lat),np.mean(lon)) xmin, xmax, ymin, ymax = -haversine(np.mean(lon),np.mean(lat),np.min(lon),np.mean(lat)), \ haversine(np.mean(lon),np.mean(lat),np.max(lon),np.mean(lat)), \ -haversine(np.mean(lon),np.mean(lat),np.mean(lon),np.min(lat)), \ haversine(np.mean(lon),np.mean(lat),np.mean(lon),np.max(lat)) ext = '-te %d %d %d %d -tr 500 500' %(xmin-10000, ymin-10000, xmax+10000, ymax+10000) d = Domain(srs, ext) ww.reproject(d, tps=True) #w.reproject(d, tps=True) # Set global metadata metadata['data_center'] = json.dumps(pti.get_gcmd_provider(kwargs.pop('data_center', ''))) metadata['naming_authority'] = kwargs.pop('naming_authority', '') metadata['project'] = 'SIOS InfraNor' metadata['entry_title'] = 'Wind field from '+os.path.basename(uri) metadata.pop('file_creation_date') metadata['history'] = metadata['history'] + ' ' + timezone.now().isoformat() + \ '. Calculated wind field from NRCS and Arome Arctic forecast wind directions.' metadata.pop('institution') metadata['keywords'] += ', [' for key, value in pti.get_gcmd_science_keyword('U/V WIND COMPONENTS').items(): if value: metadata['keywords'] += value + ', ' metadata['keywords'] += ']' metadata.pop('LINE_SPACING') metadata.pop('PIXEL_SPACING') metadata['summary'] = 'Near surface (10m) wind from Arome Arctic forecast wind and ' + metadata['summary'] metadata['title'] = 'Near surface wind from '+metadata['title'] # Get or create data folder start_time = parse(metadata['time_coverage_start']) yfolder = os.path.join(settings.PRODUCTS_ROOT, '{:04d}'.format(start_time.year)) mfolder = os.path.join(yfolder, '{:02d}'.format(start_time.month)) dfolder = os.path.join(mfolder, '{:02d}'.format(start_time.day)) if not os.path.isdir(yfolder): os.mkdir(yfolder) if not os.path.isdir(mfolder): os.mkdir(mfolder) if not os.path.isdir(dfolder): os.mkdir(dfolder) # Export thredds_fn = os.path.join(dfolder, fn) wind_uri = 'file://localhost' + thredds_fn ww.export2thredds(thredds_fn, mask_name='swathmask', metadata=metadata, no_mask_value=1) wds, cr = super(WindManager, self).get_or_create(wind_uri) os.unlink(tmp_filename) return wds, cr