示例#1
0
 def conform_units_to(self):
     if self._conform_units_to is None:
         ret = get_tuple([None] * len(get_tuple(self.variable)))
     else:
         ret = self._conform_units_to
     ret = get_first_or_sequence(ret)
     return ret
示例#2
0
 def units(self):
     if self._units is None:
         ret = get_tuple([None] * len(get_tuple(self.variable)))
     else:
         ret = self._units
     ret = get_first_or_sequence(ret)
     return ret
示例#3
0
 def conform_units_to(self, value):
     if value is not None:
         value = get_tuple(value)
         if len(value) != len(get_tuple(self.variable)):
             msg = 'Must match "variable" element-wise. The sequence lengths differ.'
             raise RequestValidationError('conform_units_to', msg)
         validate_units('conform_units_to', value)
     self._conform_units_to = value
示例#4
0
 def units(self, value):
     if value is not None:
         value = get_tuple(value)
         if len(value) != len(get_tuple(self.variable)):
             msg = 'Must match "variable" element-wise. The sequence lengths differ.'
             raise RequestValidationError('units', msg)
         if env.USE_CFUNITS:
             validate_units('units', value)
     self._units = value
示例#5
0
文件: core.py 项目: huard/ocgis
    def units(self, value):
        if value is not None:
            value = get_tuple(value)
            if len(value) != len(get_tuple(self.variable)):
                msg = 'Must match "variable" element-wise. The sequence lengths differ.'
                raise RequestValidationError('units', msg)
            if env.USE_CFUNITS:
                validate_units('units', value)

            m = self.metadata['variables']
            for v, u in zip(get_tuple(self.variable), value):
                m[v]['attrs']['units'] = u
示例#6
0
文件: core.py 项目: NCPP/ocgis
    def units(self, value):
        if value is not None:
            value = get_tuple(value)
            if len(value) != len(get_tuple(self.variable)):
                msg = 'Must match "variable" element-wise. The sequence lengths differ.'
                raise RequestValidationError('units', msg)
            if env.USE_CFUNITS:
                validate_units('units', value)

            m = self.metadata['variables']
            for v, u in zip(get_tuple(self.variable), value):
                m[v]['attrs']['units'] = u
示例#7
0
文件: core.py 项目: huard/ocgis
    def conform_units_to(self, value):
        if value is not None:
            value = get_tuple(value)
            if len(value) != len(get_tuple(self.variable)):
                msg = 'Must match "variable" element-wise. The sequence lengths differ.'
                raise RequestValidationError('units', msg)
            if env.USE_CFUNITS:
                validate_units('conform_units_to', value)
            # If we are conforming units, assert that units are equivalent.
            validate_unit_equivalence(get_tuple(self.units), value)

            m = self.metadata['variables']
            for v, u in zip(get_tuple(self.variable), value):
                m[v]['conform_units_to'] = u
示例#8
0
文件: core.py 项目: NCPP/ocgis
    def conform_units_to(self, value):
        if value is not None:
            value = get_tuple(value)
            if len(value) != len(get_tuple(self.variable)):
                msg = 'Must match "variable" element-wise. The sequence lengths differ.'
                raise RequestValidationError('units', msg)
            if env.USE_CFUNITS:
                validate_units('conform_units_to', value)
            # If we are conforming units, assert that units are equivalent.
            validate_unit_equivalence(get_tuple(self.units), value)

            m = self.metadata['variables']
            for v, u in zip(get_tuple(self.variable), value):
                m[v]['conform_units_to'] = u
示例#9
0
 def test_get_tuple(self):
     value = [4, 5]
     ret = get_tuple(value)
     self.assertEqual(ret, (4, 5))
     value[1] = 10
     self.assertEqual(value, [4, 10])
     self.assertEqual(ret, (4, 5))
示例#10
0
文件: nc.py 项目: HydroLogic/ocgis
    def get_source_metadata(self):
        metadata = self.raw_metadata
        try:
            variables = get_tuple(self.rd.variable)
        except NoDimensionedVariablesFound:
            variables = None

        try:
            var = metadata["variables"][variables[0]]
        except KeyError:
            raise VariableNotFoundError(self.rd.uri, variables[0])
        except TypeError:
            # if there are no dimensioned variables available, the dimension map should not be set
            if variables is not None:
                raise
        else:
            if self.rd.dimension_map is None:
                metadata["dim_map"] = get_dimension_map(var["name"], metadata)
            else:
                for k, v in self.rd.dimension_map.iteritems():
                    if not isinstance(v, dict):
                        try:
                            variable_name = metadata["variables"][v]["name"]
                        except KeyError:
                            variable_name = None
                        self.rd.dimension_map[k] = {
                            "variable": variable_name,
                            "dimension": v,
                            "pos": var["dimensions"].index(v),
                        }
                    metadata["dim_map"] = self.rd.dimension_map

        return metadata
示例#11
0
 def variable(self):
     if self._variable is None:
         self._variable = get_tuple(self.driver.get_dimensioned_variables())
     try:
         ret = get_first_or_sequence(self._variable)
     except IndexError:
         raise NoDimensionedVariablesFound
     return ret
示例#12
0
文件: nc.py 项目: HydroLogic/ocgis
 def get_crs(self):
     crs = None
     for potential in itersubclasses(CFCoordinateReferenceSystem):
         try:
             crs = potential.load_from_metadata(get_tuple(self.rd.variable)[0], self.rd.source_metadata)
             break
         except ProjectionDoesNotMatch:
             continue
     return crs
示例#13
0
文件: base.py 项目: wk1984/ocgis
def _write_dataset_identifier_file_(path, ops):
    from ocgis.conv.csv_ import OcgDialect
    rows = []
    headers = [
        'DID', 'VARIABLE', 'STANDARD_NAME', 'LONG_NAME', 'UNITS', 'URI',
        'GROUP'
    ]
    with open(path, 'w') as f:
        writer = csv.DictWriter(f, headers, dialect=OcgDialect)
        writer.writeheader()
        # writer.writerow(headers)
        for element in ops.dataset:
            row_template = {'DID': element.uid}
            if element.has_data_variables:
                try:
                    itr = get_iter(element.variable)
                except AttributeError:
                    itr = element.get_by_tag(TagName.DATA_VARIABLES)
                for idx, variable in enumerate(itr):
                    row = row_template.copy()
                    try:
                        attrs = variable.attrs
                        units = variable.units
                        group = variable.group
                        uri = None
                        variable_name = variable.name
                    except AttributeError:
                        attrs = element.metadata['variables'][variable][
                            'attrs']
                        units = get_tuple(element.units)[idx]
                        group = None
                        uri = element.uri
                        variable_name = variable
                    row['STANDARD_NAME'] = attrs.get('standard_name')
                    row['LONG_NAME'] = attrs.get('long_name')
                    row['UNITS'] = units
                    row['GROUP'] = group
                    row['URI'] = uri
                    row['VARIABLE'] = variable_name
                    rows.append(row)
        writer.writerows(rows)
示例#14
0
文件: base.py 项目: NCPP/ocgis
def _write_dataset_identifier_file_(path, ops):
    from ocgis.conv.csv_ import OcgDialect
    rows = []
    headers = ['DID', 'VARIABLE', 'STANDARD_NAME', 'LONG_NAME', 'UNITS', 'URI', 'GROUP']
    with open(path, 'w') as f:
        writer = csv.DictWriter(f, headers, dialect=OcgDialect)
        writer.writeheader()
        # writer.writerow(headers)
        for element in ops.dataset:
            row_template = {'DID': element.uid}
            if element.has_data_variables:
                try:
                    itr = get_iter(element.variable)
                except AttributeError:
                    itr = element.get_by_tag(TagName.DATA_VARIABLES)
                for idx, variable in enumerate(itr):
                    row = row_template.copy()
                    try:
                        attrs = variable.attrs
                        units = variable.units
                        group = variable.group
                        uri = None
                        variable_name = variable.name
                    except AttributeError:
                        attrs = element.metadata['variables'][variable]['attrs']
                        units = get_tuple(element.units)[idx]
                        group = None
                        uri = element.uri
                        variable_name = variable
                    row['STANDARD_NAME'] = attrs.get('standard_name')
                    row['LONG_NAME'] = attrs.get('long_name')
                    row['UNITS'] = units
                    row['GROUP'] = group
                    row['URI'] = uri
                    row['VARIABLE'] = variable_name
                    rows.append(row)
        writer.writerows(rows)
示例#15
0
文件: core.py 项目: Ouranosinc/ocgis
 def rename_variable(self, value):
     value = get_tuple(value)
     self._rename_variable = value
示例#16
0
    def __init__(self, uri=None, variable=None, alias=None, units=None, time_range=None, time_region=None,
                 time_subset_func=None, level_range=None, conform_units_to=None, crs=None, t_units=None,
                 t_calendar=None, t_conform_units_to=None, did=None, meta=None, s_abstraction=None, dimension_map=None,
                 name=None, driver=None, regrid_source=True, regrid_destination=False):

        self._alias = None
        self._conform_units_to = None
        self._name = None
        self._level_range = None
        self._time_range = None
        self._time_range = None
        self._time_subset_func = None
        self._units = None
        self._dimension_map = deepcopy(dimension_map)

        self._is_init = True

        # flag used for regridding to determine if the coordinate system was assigned during initialization
        self._has_assigned_coordinate_system = False if crs is None else True
        self._source_metadata = None

        if uri is None:
            raise RequestValidationError('uri', 'Cannot be None')
        else:
            self._uri = self._get_uri_(uri)

        if driver is None:
            klass = self._get_autodiscovered_driver_(self.uri)
        else:
            try:
                klass = self._Drivers[driver]
            except KeyError:
                raise RequestValidationError('driver', 'Driver not found: {0}'.format(driver))
        self.driver = klass(self)

        if variable is not None:
            variable = get_tuple(variable)
        self._variable = variable

        self.alias = alias
        self.name = name
        self.time_range = time_range
        self.time_region = time_region
        self.time_subset_func = time_subset_func
        self.level_range = level_range

        self._crs = deepcopy(crs)

        self.t_units = t_units
        self.t_calendar = t_calendar
        self.t_conform_units_to = t_conform_units_to

        self.did = did
        self.meta = meta or {}

        self.units = units
        self.conform_units_to = conform_units_to

        self.s_abstraction = s_abstraction
        try:
            self.s_abstraction = self.s_abstraction.lower()
            assert self.s_abstraction in ('point', 'polygon')
        except AttributeError:
            if s_abstraction is None:
                pass
            else:
                raise
        self.regrid_source = regrid_source
        self.regrid_destination = regrid_destination

        self._is_init = False

        self._validate_time_subset_()
示例#17
0
 def __iter__(self):
     attrs = ['alias', 'variable', 'units', 'conform_units_to']
     for ii in range(len(self)):
         yield {a: get_tuple(getattr(self, a))[ii] for a in attrs}
示例#18
0
 def __len__(self):
     try:
         ret = len(get_tuple(self.variable))
     except NoDimensionedVariablesFound:
         ret = 0
     return ret
示例#19
0
 def alias(self):
     if self._alias is None:
         ret = get_tuple(self.variable)
     else:
         ret = self._alias
     return get_first_or_sequence(ret)
示例#20
0
文件: core.py 项目: huard/ocgis
 def __len__(self):
     try:
         ret = len(get_tuple(self.variable))
     except NoDataVariablesFound:
         ret = 0
     return ret
示例#21
0
文件: core.py 项目: huard/ocgis
 def __iter__(self):
     attrs = ['variable', 'units', 'conform_units_to']
     for ii in range(len(self)):
         yield {a: get_tuple(getattr(self, a))[ii] for a in attrs}
示例#22
0
文件: core.py 项目: huard/ocgis
    def __init__(self,
                 uri=None,
                 variable=None,
                 units=None,
                 time_range=None,
                 time_region=None,
                 time_subset_func=None,
                 level_range=None,
                 conform_units_to=None,
                 crs='auto',
                 t_units=None,
                 t_calendar=None,
                 t_conform_units_to=None,
                 grid_abstraction='auto',
                 grid_is_isomorphic='auto',
                 dimension_map=None,
                 field_name=None,
                 driver=None,
                 regrid_source=True,
                 regrid_destination=False,
                 metadata=None,
                 format_time=True,
                 opened=None,
                 uid=None,
                 rename_variable=None,
                 predicate=None,
                 rotated_pole_priority=False,
                 driver_kwargs=None):
        self._is_init = True

        self._field_name = field_name
        self._level_range = None
        self._time_range = None
        self._time_region = None
        self._time_subset_func = None
        self._driver_kwargs = driver_kwargs

        if rename_variable is not None:
            rename_variable = get_tuple(rename_variable)
        self._rename_variable = rename_variable

        self.rotated_pole_priority = rotated_pole_priority
        self.predicate = predicate
        if dimension_map is not None and isinstance(dimension_map, dict):
            dimension_map = DimensionMap.from_dict(dimension_map)
        self._dimension_map = dimension_map

        self._metadata = deepcopy(metadata)
        self._uri = None
        self.uid = uid

        # This is an "open" file-like object that may be passed in-place of file location parameters.
        self._opened = opened
        if opened is not None and driver is None:
            msg = 'If "opened" is not None, then a "driver" must be provided.'
            ocgis_lh(logger='request',
                     exc=RequestValidationError('driver', msg))

        # Field creation options.
        self.format_time = format_time
        self.grid_abstraction = grid_abstraction
        self.grid_is_isomorphic = grid_is_isomorphic
        # Flag used for regridding to determine if the coordinate system was assigned during initialization.
        self._has_assigned_coordinate_system = False if crs == 'auto' else True

        if uri is None:
            # Fields may be created from pure metadata.
            if metadata is not None:
                # The default OCGIS driver is NetCDF.
                if driver is None:
                    driver = DriverKey.NETCDF_CF
            elif opened is None:
                ocgis_lh(logger='request',
                         exc=RequestValidationError('uri', 'Cannot be None'))
        else:
            self._uri = get_uri(uri)

        if driver is None:
            klass = get_autodiscovered_driver(uri)
        else:
            klass = get_driver(driver)
        self._driver = klass(self)

        if variable is not None:
            variable = get_tuple(variable)
        self._variable = variable

        self.time_range = time_range
        self.time_region = time_region
        self.time_subset_func = time_subset_func
        self.level_range = level_range

        self._crs = deepcopy(crs)

        self.regrid_source = regrid_source
        self.regrid_destination = regrid_destination

        self.units = units
        self.conform_units_to = conform_units_to

        self._is_init = False

        self._validate_time_subset_()

        # Update metadata for time variable.
        tvar = self.dimension_map.get_variable(DMK.TIME)
        if tvar is not None:
            m = self.metadata['variables'][tvar]
            if t_units is not None:
                m['attrs']['units'] = t_units
            if t_calendar is not None:
                m['attrs']['calendar'] = t_calendar
            if t_conform_units_to is not None:
                from ocgis.util.units import get_units_object
                t_calendar = m['attrs'].get(
                    'calendar', constants.DEFAULT_TEMPORAL_CALENDAR)
                t_conform_units_to = get_units_object(t_conform_units_to,
                                                      calendar=t_calendar)
                m['conform_units_to'] = t_conform_units_to
示例#23
0
 def alias(self, value):
     if value is not None:
         self._alias = get_tuple(value)
         if len(self._alias) != len(get_tuple(self.variable)):
             raise RequestValidationError('alias', 'Each variable must have an alias. The sequence lengths differ.')
示例#24
0
 def name(self):
     if self._name is None:
         ret = '_'.join(get_tuple(self.alias))
     else:
         ret = self._name
     return ret
示例#25
0
文件: core.py 项目: NCPP/ocgis
    def __init__(self, uri=None, variable=None, units=None, time_range=None, time_region=None,
                 time_subset_func=None, level_range=None, conform_units_to=None, crs='auto', t_units=None,
                 t_calendar=None, t_conform_units_to=None, grid_abstraction='auto', grid_is_isomorphic='auto',
                 dimension_map=None, field_name=None, driver=None, regrid_source=True, regrid_destination=False,
                 metadata=None, format_time=True, opened=None, uid=None, rename_variable=None, predicate=None,
                 rotated_pole_priority=False, driver_kwargs=None, decomp_type=DecompositionType.OCGIS):
        self._is_init = True

        self._field_name = field_name
        self._level_range = None
        self._time_range = None
        self._time_region = None
        self._time_subset_func = None
        self._driver_kwargs = driver_kwargs
        self._decomp_type = decomp_type

        if rename_variable is not None:
            rename_variable = get_tuple(rename_variable)
        self._rename_variable = rename_variable

        self.rotated_pole_priority = rotated_pole_priority
        self.predicate = predicate
        if dimension_map is not None and isinstance(dimension_map, dict):
            dimension_map = DimensionMap.from_dict(dimension_map)
        self._dimension_map = dimension_map

        self._metadata = deepcopy(metadata)
        self._uri = None
        self.uid = uid

        # This is an "open" file-like object that may be passed in-place of file location parameters.
        self._opened = opened
        if opened is not None and driver is None:
            msg = 'If "opened" is not None, then a "driver" must be provided.'
            ocgis_lh(logger='request', exc=RequestValidationError('driver', msg))

        # Field creation options.
        self.format_time = format_time
        self.grid_abstraction = grid_abstraction
        self.grid_is_isomorphic = grid_is_isomorphic
        # Flag used for regridding to determine if the coordinate system was assigned during initialization.
        self._has_assigned_coordinate_system = False if crs == 'auto' else True

        if uri is None:
            # Fields may be created from pure metadata.
            if metadata is not None:
                # The default OCGIS driver is NetCDF.
                if driver is None:
                    driver = DriverKey.NETCDF_CF
            elif opened is None:
                ocgis_lh(logger='request', exc=RequestValidationError('uri', 'Cannot be None'))
        else:
            self._uri = get_uri(uri)

        if driver is None:
            klass = get_autodiscovered_driver(uri)
        else:
            klass = get_driver(driver)
        self._driver = klass(self)

        if variable is not None:
            variable = get_tuple(variable)
        self._variable = variable

        self.time_range = time_range
        self.time_region = time_region
        self.time_subset_func = time_subset_func
        self.level_range = level_range

        self._crs = deepcopy(crs)

        self.regrid_source = regrid_source
        self.regrid_destination = regrid_destination

        self.units = units
        self.conform_units_to = conform_units_to

        self._is_init = False

        self._validate_time_subset_()

        # Update metadata for time variable.
        tvar = self.dimension_map.get_variable(DMK.TIME)
        if tvar is not None:
            m = self.metadata['variables'][tvar]
            if t_units is not None:
                m['attrs']['units'] = t_units
            if t_calendar is not None:
                m['attrs']['calendar'] = t_calendar
            if t_conform_units_to is not None:
                from ocgis.util.units import get_units_object
                t_calendar = m['attrs'].get('calendar', constants.DEFAULT_TEMPORAL_CALENDAR)
                t_conform_units_to = get_units_object(t_conform_units_to, calendar=t_calendar)
                m['conform_units_to'] = t_conform_units_to