Exemplo n.º 1
0
    def at(self, points, time, units=None, extrapolate=False, memoize=True, _hash=None, _auto_align=True, **kwargs):
        pts = _reorganize_spatial_data(points)
        mem = memoize
        if hash is None:
            _hash = self._get_hash(points, time)

        if mem:
            res = self._get_memoed(points, time, self._result_memo, _hash=_hash)
            if res is not None:
                return res

        value = np.column_stack([var.at(points=points,
                                        time=time,
                                        units=units,
                                        extrapolate=extrapolate,
                                        memoize=memoize,
                                        _hash=_hash,
                                        **kwargs) for var in self.variables])

        if _auto_align == True:
            value = _align_results_to_spatial_data(value.copy(), points)

        if mem:
            self._memoize_result(points, time, value, self._result_memo, _hash=_hash)

        return value
Exemplo n.º 2
0
def test_spatial_data_metadata():
    pts_1 = [1, 2, 3]
    pts_2 = [(1, ), (2, ), (3, )]
    pts_3 = np.array([[1, 2, 3], [4, 5, 6]])
    pts_4 = [[1, 4, 7, 10], [2, 5, 8, 11], [3, 6, 9, 12]]

    res_1 = np.array([
        [
            1,
        ],
    ])
    res_2 = np.array([
        [1, 2, 3, 4, 5, 6],
    ])
    res_3 = np.array([[1, 2, 3, 4, 5, 6], [2, 3, 4, 5, 6, 7]])
    res_4 = np.array([[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12],
                      [13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24]])
    res_5 = np.array([[
        1,
    ], [
        2,
    ], [
        3,
    ], [
        4,
    ]])

    a1 = utilities._align_results_to_spatial_data(res_1, pts_1)
    assert np.all(a1 == res_1)
    a2 = utilities._align_results_to_spatial_data(res_2, pts_2)
    assert np.all(a2 == res_2)
    a3 = utilities._align_results_to_spatial_data(res_3, pts_3)
    assert np.all(a3 == res_3)

    a4 = utilities._align_results_to_spatial_data(res_4, pts_4)
    a5 = utilities._align_results_to_spatial_data(res_5, pts_4)
    assert np.all(a4.T == res_4)
    assert np.all(a5.T == res_5)
Exemplo n.º 3
0
    def at(self, points, time, units=None, extrapolate=False, _hash=None, _mem=True, _auto_align=True, **kwargs):
        '''
        Find the value of the property at positions P at time T

        :param points: Coordinates to be queried (P)
        :param time: The time at which to query these points (T)
        :param units: units the values will be returned in (or converted to)
        :param extrapolate: if True, extrapolation will be supported
        :type points: Nx2 array of double
        :type time: datetime.datetime object
        :type depth: integer
        :type units: string such as ('mem/s', 'knots', etc)
        :type extrapolate: boolean (True or False)
        :return: returns a Nx1 array of interpolated values
        :rtype: double
        '''
        pts = _reorganize_spatial_data(points)

        if _hash is None:
            _hash = self._get_hash(pts, time)

        if _mem:
            res = self._get_memoed(pts, time, self._result_memo, _hash=_hash)
            if res is not None:
                return res

        order = self.dimension_ordering
        if order[0] == 'time':
            value = self._time_interp(pts, time, extrapolate, _mem=_mem, _hash=_hash, **kwargs)
        elif order[0] == 'depth':
            value = self._depth_interp(pts, time, extrapolate, _mem=_mem, _hash=_hash, **kwargs)
        else:
            value = self._xy_interp(pts, time, extrapolate, _mem=_mem, _hash=_hash, **kwargs)

        if _auto_align == True:
            value = _align_results_to_spatial_data(value.copy(), points)

        if _mem:
            self._memoize_result(pts, time, value, self._result_memo, _hash=_hash)
        return value
    def at(self,
           points,
           time,
           units=None,
           extrapolate=None,
           auto_align=True,
           **kwargs):
        '''
            Interpolates this property to the given points at the given time
            with the units specified.

            :param points: A Nx2 array of lon,lat points

            :param time: A datetime object. May be None; if this is so,
                         the variable is assumed to be gridded but
                         time-invariant

            :param units: The units that the result would be converted to
        '''
        pts = _reorganize_spatial_data(points)
        value = None
        if len(self.time) == 1:
            value = self.data
        else:
            if extrapolate is None:
                extrapolate = self.extrapolate
            if not extrapolate:
                self.time.valid_time(time)

            if extrapolate and time > self.time.max_time:
                value = self.data[-1]
            if extrapolate and time <= self.time.min_time:
                value = self.data[0]

            if value is None:
                t_index = self.time.index_of(time, extrapolate)
                t_alphas = self.time.interp_alpha(time, extrapolate)

                d0 = self.data[max(t_index - 1, 0)]
                d1 = self.data[t_index]

                value = d0 + (d1 - d0) * t_alphas

        data_units = self.units if self.units else self._gnome_unit
        req_units = units if units else data_units
        #Try to convert units. This is the same as in gridded_objects_base.Variable
        if data_units is not None and data_units != req_units:
            try:
                value = uc.convert(data_units, req_units, value)
            except uc.NotSupportedUnitError:
                if (not uc.is_supported(data_units)):
                    warnings.warn("{0} units is not supported: {1}".format(
                        self.name, data_units))
                elif (not uc.is_supported(req_units)):
                    warnings.warn(
                        "Requested unit is not supported: {1}".format(
                            req_units))
                else:
                    raise

        if points is None:
            return value
        else:
            rval = np.full((pts.shape[0], 1), value, dtype=np.float64)
            if auto_align:
                return _align_results_to_spatial_data(rval, points)
            else:
                return rval