.. index::
   single: Vector field

.. index::
   single: uvraster

.. _input_vector_field:

*****************************************************************************
 Vector field rendering - UVraster
*****************************************************************************

Vector fields are used for instance in meteorology to store/display
wind direction and magnitude.

The source is two bands of raster data, the first band represents the
U component of the vector, and the second band the V component.  Using
the u,v values at a given location we can compute a rotation and
magnitude and use that to draw an arrow of a size proportional to the
magnitude and pointing in the direction of the phenomenon (wind,
current, etc.)

For more details about vector fields, refer to: `Vector field`_

A vector field :ref:`LAYER` is a hybrid layer, which has a raster data
source as input and vector features as output.  The output features
are represented as points.  Queries are not supported.

Since the data source is a raster, all raster processing options can
be used (e.g. RESAMPLE).  RESAMPLE=AVERAGE generally gives a good
result, and the default.  This can be overridden by explicitly
specifying the type of resampling.

Vector field layers are of `TYPE` `point`, and have `CONNECTIONTYPE`
`uvraster`.  The raster data set is specified in `DATA`.  The two
bands that define the vector field are specified using `PROCESSING`
`BANDS` (U first, V second).

The UVraster connection type offers the following attributes:

* [u]: the raw u value
* [v]: the raw v value
* [uv_angle]: the vector angle
* [uv_minus_angle]: the vector angle - opposite direction
* [uv_length]: the vector length (scaled with the `UV_SIZE_SCALE`
  optional value)
* [uv_length_2]: half the vector length

Optional `PROCESSING` settings:

* `UV_SPACING`: The spacing is simply the distance, in pixels, between
  arrows to be displayed in the vector field. Default is 32.
* `UV_SIZE_SCALE`: The uv size scale is used to convert the vector
  lengths (magnitude) of the raster to pixels for a better
  rendering. Default is 1.

Example of a layer definition:

.. code-block:: mapfile

  SYMBOL
    NAME "horizline"
    TYPE VECTOR
    POINTS
       0 0
       1 0
    END # points
  END # symbol
  SYMBOL
    NAME "arrowhead"
    TYPE vector
    FILLED true
    #ANCHORPOINT 0 0.5
    POINTS
      0 2
      4 1
      0 0
    END # points
  END # symbol
  SYMBOL
    NAME "arrowtail"
    TYPE vector
    FILLED true
    ANCHORPOINT 1 0.5 # to shift the arrowtail
    POINTS
      0 2
      4 1
      0 0
      -99 -99
      0 1
      4 1
    END # points
  END # symbol
  LAYER
    NAME "my_uv_test"
    TYPE POINT
    STATUS DEFAULT
    CONNECTIONTYPE uvraster
    DATA /path/wind.grib2
    PROCESSING "BANDS=1,2"
    PROCESSING "UV_SPACING=40"
    PROCESSING "UV_SIZE_SCALE=0.2"
    CLASS
      STYLE
        SYMBOL "horizline"
        ANGLE [uv_angle]
        SIZE [uv_length]
        WIDTH 3
        COLOR 100 255 0
      END # style
      STYLE
        SYMBOL "arrowhead"
        ANGLE [uv_angle]
        SIZE 10
        COLOR 255 0 0
        POLAROFFSET [uv_length_2] [uv_angle]
      END # style
      STYLE
        SYMBOL "arrowtail"
        ANGLE [uv_angle]
        SIZE 10
        COLOR 255 0 0
        POLAROFFSET [uv_length_2] [uv_minus_angle]
      END # style
    END # class
  END # layer

.. versionadded:: 6.2 (:ref:`rfc78`)

.. _`Vector field`: http://en.wikipedia.org/wiki/Vector_field
