Example #1
0
def getSpeedBearing(index, lon, lat, deltatime, ieast=1,
                    missingValue=sys.maxint):
    """
    .. function:: getSpeedBearing(index, lon, lat, deltatime[, ieast=1, \
                    missingValue=sys.maxint])
                    
       Calculate the speed and bearing of a TC

       Parameters
       ----------
       index : :class:`numpy.ndarray`
           Array of 0/1 indicating start of new TC (1)

       lon : :class:`numpy.ndarray`
           Longitudes of TC positions

       lat : :class:`numpy.ndarray`
           Latitudes of TC positions

       deltatime : :class:`numpy.ndarray`
           Time difference (hours) between consecutive TC observations

       ieast : int, default=1
           Indicate which direction has positive longitude.
           1 = positive longitude eastwards
           -1 = positive longiture westwards

       missingValue : int or float, default = `sys.maxint`
          Replace questionable values with `missingValue`

       Returns
       -------
       speed : :class:`numpy.ndarray`
       bearing : :class:`numpy.ndarray`
        
    
    """
    
    bear_, dist_ = maputils.latLon2Azi(lat, lon, ieast, azimuth=0)
    assert bear_.size == index.size - 1
    assert dist_.size == index.size - 1
    bearing = np.zeros(index.size, 'f')
    bearing[1:] = bear_
    np.putmask(bearing, index, missingValue)

    dist = np.zeros(index.size, 'f')
    dist[1:] = dist_
    speed = dist / deltatime
    # Delete speeds less than 0, greated than 200,
    # or where indicator == 1.
    np.putmask(speed, (speed < 0) | (speed > 200) | index, missingValue)
    np.putmask(speed, np.isnan(speed), missingValue)

    return speed, bearing
Example #2
0
def getSpeedBearing(index,
                    lon,
                    lat,
                    deltatime,
                    ieast=1,
                    missingValue=sys.maxint):
    """
    Calculate the speed and bearing of a TC.

    :param index: Array of 0/1 indicating start of new TC (1)
    :type index: :class:`numpy.ndarray`
    :param lon: Longitudes of TC positions.
    :type  lon: :class:`numpy.ndarray`
    :param lat: Latitudes of TC positions.
    :type  lat: :class:`numpy.ndarray`
    :param deltatime: Time difference (hours) between
                      consecutive TC observations.
    :type  deltatime: :class:`numpy.ndarray`
    :param int ieast: Indicate which direction has positive
                      longitude. 1 = positive longitude eastwards
                      -1 = positive longiture westwards.

    :param missingValue: Replace questionable values with `missingValue`.
    :type missingValue: int or float, default = `sys.maxint`


    :returns: speed and bearing : :class:`numpy.ndarray`

    Example::

        >>> speed, bearing = getSpeedBearing(index, lon, lat, deltatime)

    """

    bear_, dist_ = maputils.latLon2Azi(lat, lon, ieast, azimuth=0)
    assert bear_.size == index.size - 1
    assert dist_.size == index.size - 1
    bearing = np.zeros(index.size, 'f')
    bearing[1:] = bear_
    np.putmask(bearing, index, missingValue)

    dist = np.zeros(index.size, 'f')
    dist[1:] = dist_
    speed = dist / deltatime
    # Delete speeds less than 0, greated than 200,
    # or where indicator == 1.
    np.putmask(speed, (speed < 0), missingValue)
    np.putmask(speed, (speed > 200), missingValue)
    np.putmask(speed, index, missingValue)
    np.putmask(speed, np.isnan(speed), missingValue)

    return speed, bearing
Example #3
0
def getSpeedBearing(index, lon, lat, deltatime, ieast=1,
                    missingValue=sys.maxint):
    """
    Calculate the speed and bearing of a TC.

    :param index: Array of 0/1 indicating start of new TC (1)
    :type index: :class:`numpy.ndarray` 
    :param lon: Longitudes of TC positions.
    :type  lon: :class:`numpy.ndarray` 
    :param lat: Latitudes of TC positions.
    :type  lat: :class:`numpy.ndarray` 
    :param deltatime: Time difference (hours) between
                      consecutive TC observations.
    :type  deltatime: :class:`numpy.ndarray` 
    :param int ieast: Indicate which direction has positive
                      longitude. 1 = positive longitude eastwards
                      -1 = positive longiture westwards.

    :param missingValue: Replace questionable values with `missingValue`.
    :type missingValue: int or float, default = `sys.maxint`


    :returns: speed and bearing : :class:`numpy.ndarray`

    Example::

        >>> speed, bearing = getSpeedBearing(index, lon, lat, deltatime)
    
    """
    
    bear_, dist_ = maputils.latLon2Azi(lat, lon, ieast, azimuth=0)
    assert bear_.size == index.size - 1
    assert dist_.size == index.size - 1
    bearing = np.zeros(index.size, 'f')
    bearing[1:] = bear_
    np.putmask(bearing, index, missingValue)

    dist = np.zeros(index.size, 'f')
    dist[1:] = dist_
    speed = dist / deltatime
    # Delete speeds less than 0, greated than 200,
    # or where indicator == 1.
    np.putmask(speed, (speed < 0) | (speed > 200) | index, missingValue)
    np.putmask(speed, np.isnan(speed), missingValue)

    return speed, bearing
Example #4
0
def interpolateTrack(configFile, trackFile, source, delta=0.1, interpolation_type=None):
    """
    Interpolate the data in a track file to the time interval delta hours.

    :param str configFile: Configuration file that contains information on the
                           source format of the track file.
    :param str trackFile: Path to csv format track file.
    :param str source: Name of the data source. There must be a corresponding
                       section in the configuration file that contains the
                       description of the data.
    :param float delta: Time interval in hours to interpolate to. Default is
                        0.1 hours
    :param str interpolation_type: Optionally use Akima or linear
                                   interpolation for the track positions.
                                   Default is linear 1-dimensional spline
                                   interpolation.

    :returns: 10 arrays (id, time, date, lon, lat, bearing, forward speed,
              central pressure, environmental pressure and radius to
              maximum wind) that describe the track at ``delta`` hours
              intervals.

    """
    logger = logging.getLogger()
    indicator, year, month, day, hour, minute, lon, lat, pressure, speed, bearing, windspeed, rmax, penv = loadTrackFile(
        configFile, trackFile, source
    )

    # Time between observations:
    day_ = [datetime.datetime(year[i], month[i], day[i], hour[i], minute[i]) for i in xrange(year.size)]
    time_ = date2num(day_)
    dt_ = 24.0 * numpy.diff(time_)
    dt = numpy.empty(hour.size, "f")
    dt[1:] = dt_

    # At this stage, convert all times to a time after initial observation:
    timestep = 24.0 * (time_ - time_[0])

    newtime = numpy.arange(timestep[0], timestep[-1] + 0.01, delta)
    newtime[-1] = timestep[-1]
    _newtime = (newtime / 24.0) + time_[0]
    newdates = num2date(_newtime)

    nid = numpy.ones(newtime.size)

    logger.info("Interpolating data...")
    if len(indicator) <= 2:
        # Use linear interpolation only (only a start and end point given):
        nLon = scipy.interpolate.interp1d(timestep, lon, kind="linear")(newtime)
        nLat = scipy.interpolate.interp1d(timestep, lat, kind="linear")(newtime)
        npCentre = scipy.interpolate.interp1d(timestep, pressure, kind="linear")(newtime)
        npEnv = scipy.interpolate.interp1d(timestep, penv, kind="linear")(newtime)
        nrMax = scipy.interpolate.interp1d(timestep, rmax, kind="linear")(newtime)

    else:
        if interpolation_type == "akima":
            # Use the Akima interpolation method:
            try:
                import _akima
            except ImportError:
                logger.exception("Akima interpolation module unavailable - default to scipy.interpolate")
                nLon = scipy.interpolate.splev(newtime, scipy.interpolate.splrep(timestep, lon, s=0), der=0)
                nLat = scipy.interpolate.splev(newtime, scipy.interpolate.splrep(timestep, lat, s=0), der=0)
            else:
                nLon = _akima.interpolate(timestep, lon, newtime)
                nLat = _akima.interpolate(timestep, lat, newtime)
        elif interpolation_type == "linear":
            nLon = scipy.interpolate.interp1d(timestep, lon, kind="linear")(newtime)
            nLat = scipy.interpolate.interp1d(timestep, lat, kind="linear")(newtime)
        else:
            nLon = scipy.interpolate.splev(newtime, scipy.interpolate.splrep(timestep, lon, s=0), der=0)
            nLat = scipy.interpolate.splev(newtime, scipy.interpolate.splrep(timestep, lat, s=0), der=0)

        npCentre = scipy.interpolate.interp1d(timestep, pressure, kind="linear")(newtime)
        npEnv = scipy.interpolate.interp1d(timestep, penv, kind="linear")(newtime)
        nrMax = scipy.interpolate.interp1d(timestep, rmax, kind="linear")(newtime)

    bear_, dist_ = maputils.latLon2Azi(nLat, nLon, 1, azimuth=0)
    nthetaFm = numpy.zeros(newtime.size, "f")
    nthetaFm[:-1] = bear_
    nthetaFm[-1] = bear_[-1]
    dist = numpy.zeros(newtime.size, "f")
    dist[:-1] = dist_
    dist[-1] = dist_[-1]
    nvFm = dist / delta

    return nid, newtime, newdates, nLon, nLat, nthetaFm, nvFm, npCentre, npEnv, nrMax