rastersymbolizer.rst 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. .. _sld_reference_rastersymbolizer:
  2. RasterSymbolizer
  3. ================
  4. GeoServer supports the ability to display raster data in addition to vector data.
  5. Raster data is not merely a picture, rather it can be thought of as a grid of georeferenced information, much like a graphic is a grid of visual information (with combination of reds, greens, and blues).
  6. Unlike graphics, which only contain visual data, each point/pixel in a raster grid can have many different attributes (bands), with possibly none of them having an inherently visual component.
  7. With the above in mind, one needs to choose how to visualize the data, and this, like in all other cases, is done by using an SLD.
  8. The analogy to vector data is evident in the naming of the tags used.
  9. Vectors, consisting of points, line, and polygons, are styled by using the ``<PointSymbolizer>``, ``<LineSymbolizer>``, and ``<PolygonSymbolizer>`` tags.
  10. It is therefore not very surprising that raster data is styled with the tag <RasterSymbolizer>.
  11. Syntax
  12. -------------------
  13. The following elements can be used inside the ``<RasterSymbolizer>`` element.
  14. - ``<Opacity>``
  15. - ``<ColorMap>``
  16. - ``<ChannelSelection>``
  17. - ``<ContrastEnhancement>``
  18. - ``<ShadedRelief>`` *
  19. - ``<OverlapBehavior>`` *
  20. - ``<ImageOutline>`` *
  21. .. warning:: The starred (*) elements are not yet implemented in GeoServer.
  22. Opacity
  23. ^^^^^^^
  24. The ``<Opacity>`` element sets the transparency level for the entire rendered image.
  25. As is standard, the values range from zero (0) to one (1),
  26. with zero being transparent, and one being opaque.
  27. The syntax is:
  28. .. code-block:: xml
  29. <Opacity>0.5</Opacity>
  30. where, in this case, the raster is rendered at 50% opacity.
  31. ColorMap
  32. ^^^^^^^^
  33. The ``<ColorMap>`` element defines the color values for the pixels
  34. of a raster image, as either color gradients,
  35. or a mapping of specific values to fixed colors.
  36. A color map is defined by a sequence of ``<ColorMapEntry>`` elements.
  37. Each ``<ColorMapEntry>`` element specifies a ``color`` and a ``quantity`` attribute.
  38. The quantity refers to the value of a raster pixel.
  39. The ``color`` value is denoted in standard hexadecimal RGB format (#RRGGBB).
  40. ``<ColorMapEntry>`` elements can also have ``opacity`` and ``label`` attributes.
  41. The ``opacity`` attribute overrides the global ``<Opacity>`` value.
  42. The ``label`` attribute is used to provide text for legends.
  43. A color map can contain up to 255 ``<ColorMapEntry>`` elements.
  44. The simplest ``<ColorMap>`` has two color map entries.
  45. One specifyies a color for the "bottom" of the dataset,
  46. and the other specifyies a color for the "top" of the dataset.
  47. Pixels with values equal to or less than the minimum value
  48. are rendered with the bottom color (and opacity).
  49. Pixels with values equal to or great than the maximum value
  50. are rendered with the top color and opacity.
  51. The colors for values in between are automatically interpolated,
  52. making creating color gradients easy.
  53. A color map can be refined by adding additional intermediate entries.
  54. This is useful if the dataset has discrete values rather than a gradient,
  55. or if a multi-colored gradient is desired.
  56. One entry is added for each different color to be used,
  57. along with the corresponding quantity value.
  58. For example, a simple ColorMap can define a color gradient from color #323232 to color #BBBBBB over quantity values from -300 to 200:
  59. .. code-block:: xml
  60. <ColorMap>
  61. <ColorMapEntry color="#323232" quantity="-300" label="label1" opacity="1"/>
  62. <ColorMapEntry color="#BBBBBB" quantity="200" label="label2" opacity="1"/>
  63. </ColorMap>
  64. .. figure:: img/colormap1.png
  65. :align: left
  66. A more refined example defines a color gradient from color #FFCC32 through color #BBBBBB,
  67. running through color #3645CC and color #CC3636.
  68. The bottom color #FFCC32 is defined to be transparent
  69. This simulates an alpha channel, since
  70. pixels with values of -300 and below will not be rendered.
  71. Notice that the default opacity is 1 (opaque) when not specified.
  72. .. code-block:: xml
  73. <ColorMap>
  74. <ColorMapEntry color="#FFCC32" quantity="-300" label="label1" opacity="0"/>
  75. <ColorMapEntry color="#3645CC" quantity="0" label="label2" opacity="1"/>
  76. <ColorMapEntry color="#CC3636" quantity="100" label="label3" opacity="1"/>
  77. <ColorMapEntry color="#BBBBBB" quantity="200" label="label4" opacity="1"/>
  78. </ColorMap>
  79. .. figure:: img/colormap2.png
  80. :align: left
  81. GeoServer extends the ``<ColorMap>`` element to allow two attributes: ``type`` and ``extended``.
  82. type
  83. """"
  84. The ``<ColorMap>`` ``type`` attribute specifies the kind of ColorMap to use.
  85. There are three different types of ColorMaps that can be specified: ``ramp``, ``intervals`` and ``values``.
  86. ``type="ramp"`` is the default ColorMap type.
  87. It specifies that colors should be interpolated for values between the color map entries.
  88. The result is shown in the following example.
  89. .. code-block:: xml
  90. <ColorMap type="ramp">
  91. <ColorMapEntry color="#EEBE2F" quantity="-300" label="label" opacity="0"/>
  92. <ColorMapEntry color="#2851CC" quantity="0" label="values" opacity="1"/>
  93. <ColorMapEntry color="#211F1F" quantity="50" label="label" opacity="1"/>
  94. <ColorMapEntry color="#EE0F0F" quantity="100" label="label" opacity="1"/>
  95. <ColorMapEntry color="#AAAAAA" quantity="200" label="label" opacity="1"/>
  96. <ColorMapEntry color="#6FEE4F" quantity="250" label="label" opacity="1"/>
  97. <ColorMapEntry color="#3ECC1B" quantity="300" label="label" opacity="1"/>
  98. <ColorMapEntry color="#886363" quantity="350" label="label" opacity="1"/>
  99. <ColorMapEntry color="#5194CC" quantity="400" label="label" opacity="1"/>
  100. <ColorMapEntry color="#2C58DD" quantity="450" label="label" opacity="1"/>
  101. <ColorMapEntry color="#DDB02C" quantity="600" label="label" opacity="1"/>
  102. </ColorMap>
  103. .. figure:: img/colormap3.png
  104. :align: left
  105. ``type="values"`` means that only pixels with the specified entry quantity values are rendered.
  106. Pixels with other values are not rendered.
  107. Using the example set of color map entries:
  108. .. code-block:: xml
  109. <ColorMap type="values">
  110. <ColorMapEntry color="#EEBE2F" quantity="-300" label="label" opacity="0"/>
  111. ...
  112. <ColorMapEntry color="#DDB02C" quantity="600" label="label" opacity="1"/>
  113. </ColorMap>
  114. The result image is:
  115. .. figure:: img/colormap4.png
  116. :align: left
  117. ``type="intervals"`` value means that each interval defined by two entries is rendered using the color of the first (lowest-value) entry.
  118. No color interpolation is applied across the intervals.
  119. Using the example set of color map entries:
  120. .. code-block:: xml
  121. <ColorMap type="intervals" extended="true">
  122. <ColorMapEntry color="#EEBE2F" quantity="-300" label="label" opacity="0"/>
  123. ...
  124. <ColorMapEntry color="#DDB02C" quantity="600" label="label" opacity="1"/>
  125. </ColorMap>
  126. The result image is:
  127. .. figure:: img/colormap5.png
  128. :align: left
  129. The color map type is also reflected in the legend graphic.
  130. A typical request for a raster legend is
  131. (using the ``forceRule:true`` option to force output of the color map)::
  132. http://localhost:8080/geoserver/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&&STYLE=raster100&FORMAT=image/png&WIDTH=50&HEIGHT=20&LEGEND_OPTIONS=forceRule:true&LAYER=it.geosolutions:di08032_da
  133. The legends returned for the different types are:
  134. .. figure:: img/rasterlegend.png
  135. :align: left
  136. extended
  137. """"""""
  138. The ``extended`` attribute specifies whether the color map gradient uses 256 (8-bit) or 65536 (16-bit) colors.
  139. The value ``false`` (the default) specifies that the color scale is calculated using 8-bit color, and ``true`` specifies using 16-bit color.
  140. .. _sld_reference_rastersymbolizer_colormap_cql:
  141. CQL Expressions
  142. """""""""""""""
  143. All of the ColorMapEntry attributes (color, quantity, label and opacity) can be defined using ``cql expressions``, with the ${...expression...} syntax.
  144. CQL expressions are useful to make the color map dynamic, using values taken from the client:
  145. .. code-block:: xml
  146. <ColorMapEntry color="#00FF00" quantity="${env('low',3)}" label="Low" opacity="1"/>
  147. <ColorMapEntry color="#FFFF00" quantity="${env('medium',10)}" label="Medium" opacity="1"/>
  148. <ColorMapEntry color="#FF0000" quantity="${env('high',1000)}" label="High" opacity="1"/>
  149. In this example quantity values are not fixed, but can be specified by the client using the ENV request parameter:
  150. http://localhost:8080/geoserver/wms?REQUEST=GetMap&VERSION=1.0.0&...&ENV=low:10;medium:100;high:500
  151. For a complete reference of CQL capabilities, see :ref:`here <filter_ecql_reference>`
  152. ChannelSelection
  153. ^^^^^^^^^^^^^^^^
  154. The ``<ChannelSelection>`` element specifies how dataset bands are mapped to image color channels.
  155. Named dataset bands may be mapped to red, green and blue channels, or a single named band may be mapped to a grayscale channel.
  156. The following example maps source channels 1, 2 and 3 to the red, green, and blue color channels.
  157. .. code-block:: xml
  158. <ChannelSelection>
  159. <RedChannel>
  160. <SourceChannelName>1</SourceChannelName>
  161. </RedChannel>
  162. <GreenChannel>
  163. <SourceChannelName>2</SourceChannelName>
  164. </GreenChannel>
  165. <BlueChannel>
  166. <SourceChannelName>3</SourceChannelName>
  167. </BlueChannel>
  168. </ChannelSelection>
  169. .. figure:: img/channelselection.png
  170. :align: left
  171. The next example shows selecting a single band of an RGB image as a grayscale channel,
  172. and re-colorizing it via a ColorMap:
  173. .. code-block:: xml
  174. <RasterSymbolizer>
  175. <Opacity>1.0</Opacity>
  176. <ChannelSelection>
  177. <GrayChannel>
  178. <SourceChannelName>1</SourceChannelName>
  179. </GrayChannel>
  180. </ChannelSelection>
  181. <ColorMap extended="true">
  182. <ColorMapEntry color="#0000ff" quantity="3189.0"/>
  183. <ColorMapEntry color="#009933" quantity="6000.0"/>
  184. <ColorMapEntry color="#ff9900" quantity="9000.0" />
  185. <ColorMapEntry color="#ff0000" quantity="14265.0"/>
  186. </ColorMap>
  187. </RasterSymbolizer>
  188. .. figure:: img/channelselection2.png
  189. :align: left
  190. ChannelSelection Expressions
  191. """"""""""""""""""""""""""""
  192. Since the previous approach supports Strings only and therefore is static and not suitable when dealing with multispectral imagery that has more than four bands
  193. and hyperspectral imagery (hyperspectral sensors have typically hundreds of bands), a dynamical approach is needed.
  194. By replacing Strings with Expressions in ``<SourceChannelName>``, context free functions like ``env`` can be used to indicate which bands are to be used in a particular rendering session.
  195. The following example shows how to set the Red, Green and Blue channels and to map them into the desired bands. Here below, the ``env`` function will set, by default in the WMS request, the RedChannel
  196. on the second band, the GreenChannel on the fifth band and the BlueChannel on the seventh band.
  197. .. code-block:: xml
  198. <RasterSymbolizer>
  199. <ChannelSelection>
  200. <RedChannel>
  201. <SourceChannelName>
  202. <ogc:Function name="env">
  203. <ogc:Literal>B1</ogc:Literal>
  204. <ogc:Literal>1</ogc:Literal>
  205. </ogc:Function>
  206. </SourceChannelName>
  207. </RedChannel>
  208. <GreenChannel>
  209. <SourceChannelName>
  210. <ogc:Function name="env">
  211. <ogc:Literal>B2</ogc:Literal>
  212. <ogc:Literal>2</ogc:Literal>
  213. </ogc:Function>
  214. </SourceChannelName>
  215. </GreenChannel>
  216. <BlueChannel>
  217. <SourceChannelName>
  218. <ogc:Function name="env">
  219. <ogc:Literal>B3</ogc:Literal>
  220. <ogc:Literal>3</ogc:Literal>
  221. </ogc:Function>
  222. </SourceChannelName>
  223. </BlueChannel>
  224. </ChannelSelection>
  225. <RasterSymbolizer>
  226. .. figure:: img/channelsexpression1.png
  227. :align: left
  228. The style Schema supports also the SLD 1.1 and CSS. As a CSS examples:
  229. .. code-block:: xml
  230. * { raster-channels: [env('B1','1')] '2' '3'; }
  231. * { raster-channels: @B1(1) '2' '3';}
  232. One can specify the ``env`` request parameters in the WMS request to switch the bands and render the raster layer using the desired bands,
  233. for example the 4, 2, 3 as the following::
  234. http://localhost:8083/geosolutions/wms?service=WMS&version=1.1.0&request=GetMap&layers=geosolutions:raster_multichannel&styles=&bbox=-180.0,-90.5,180.0,90.5&width=768&height=386&srs=EPSG:4326&format=application/openlayers&env=B1:4;B2:2;B3:3
  235. .. figure:: img/channelsexpression2.png
  236. :align: left
  237. Now let us suppose that we want to work on a single band and to exclude all the remaining bands in order to render a monochromatic raster.
  238. As an SLD example:
  239. .. code-block:: xml
  240. <RasterSymbolizer>
  241. <Opacity>1.0</se:Opacity>
  242. <ChannelSelection>
  243. <GrayChannel>
  244. <SourceChannelName>
  245. <Function name="env">
  246. <ogc:Literal>B1</ogc:Literal>
  247. <ogc:Literal>7</ogc:Literal>
  248. </ogc:Function>
  249. </SourceChannelName>
  250. </GrayChannel>
  251. </ChannelSelection>
  252. </RasterSymbolizer>
  253. .. figure:: img/channelsexpression3.png
  254. :align: left
  255. The Schema above will render the channel "7" by default. As before, you can choose to render any channel of the raster by calling the ``env`` function in your
  256. WMS request and setting the desired band. By adding to the request &env=B1:3 for example::
  257. http://localhost:8083/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=geosolutions:usa&styles=&bbox=-130.85168,20.7052,-62.0054,54.1141&width=768&height=372&srs=EPSG:4326&format=application/openlayers&env=B1:3
  258. .. figure:: img/channelsexpression4.png
  259. :align: left
  260. Finally, you can add a ColorMap on the selected channel as the following:
  261. .. code-block:: xml
  262. <RasterSymbolizer>
  263. <Opacity>1.0</Opacity>
  264. <ChannelSelection>
  265. <GrayChannel>
  266. <SourceChannelName>
  267. <ogc:Function name="env">
  268. <ogc:Literal>B1</ogc:Literal>
  269. <ogc:Literal>7</ogc:Literal>
  270. </ogc:Function>
  271. </SourceChannelName>
  272. </GrayChannel>
  273. </ChannelSelection>
  274. <ColorMap>
  275. <ColorMapEntry color="#0000ff" quantity="50.0"/>
  276. <ColorMapEntry color="#009933" quantity="100.0"/>
  277. <ColorMapEntry color="#ff9900" quantity="150.0" />
  278. <ColorMapEntry color="#ff0000" quantity="200.0"/>
  279. </ColorMap>
  280. </RasterSymbolizer>
  281. .. figure:: img/channelsexpression5.png
  282. :align: left
  283. ContrastEnhancement
  284. ^^^^^^^^^^^^^^^^^^^
  285. The ``<ContrastEnhancement>`` element is used to adjust the relative brightness of the image data.
  286. A ``<ContrastEnhancement>`` element can be specified for the entire image, or in individual ``Channel`` elements.
  287. In this way, different enhancements can be used on each channel.
  288. There are three types of enhancements possible:
  289. * Normalize
  290. * Histogram
  291. * GammaValue
  292. ``<Normalize>`` means to expand the contrast so that the minimum quantity is mapped to minimum brightness, and the maximum quantity is mapped to maximum brightness.
  293. ``<Histogram>`` is similar to Normalize, but the algorithm used attempts to produce an image with an equal number of pixels at all brightness levels.
  294. ``<GammaValue>`` is a scaling factor that adjusts the brightness of the image. A value less than one (1) darkens the image, and a value greater than one (1) brightens it. The default is 1 (no change).
  295. These examples turn on Normalize and Histogram, respectively:
  296. .. code-block:: xml
  297. <ContrastEnhancement>
  298. <Normalize/>
  299. </ContrastEnhancement>
  300. .. code-block:: xml
  301. <ContrastEnhancement>
  302. <Histogram/>
  303. </ContrastEnhancement>
  304. This example increases the brightness of the image by a factor of two.
  305. .. code-block:: xml
  306. <ContrastEnhancement>
  307. <GammaValue>2</GammaValue>
  308. </ContrastEnhancement>
  309. It is also possible to customize Normalize Contrast Enhancement element for the RasterSymbolizer.
  310. 3 new VendorOptions are supported:
  311. * <VendorOption name="algorithm">ALGORITHM_NAME</VendorOption> to control the algorithm to apply
  312. * <VendorOption name="minValue">MIN_VALUE</VendorOption> to control the min value for the algorithm
  313. * <VendorOption name="maxValue">MAX_VALUE</VendorOption> to control the max value for the algorithm
  314. Supported algorithms are:
  315. * **StretchToMinimumMaximum** it will linearly stretch the source raster by linearly mapping values within the [MIN_VALUE, MAX_VALUE] range to [0,255]. This will also automatically result into a clip of the values outside the specified input range.
  316. * **ClipToMinimumMaximum** it will result into a clamp operation. Values smaller than MIN_VALUE will be forced to MIN_VALUE. Values greater than MAX_VALUE will be forced to MAX_VALUE. Values in the [MIN_VALUE, MAX_VALUE] range will passthrough unchanged.
  317. * **ClipToZero** is similar to ClipToMinimumMaximum. However, values outside the [MIN_VALUE, MAX_VALUE] range will be forced to be 0.
  318. .. note:: The target data type for the stretch algorithm is **always** byte (this might change in the future). This means that if the MAX_VALUE for the Clip oriented algorithms is greater than 255 an implicit clamp will apply anyway to clamp to 255.
  319. Here below some examples
  320. .. code-block:: xml
  321. <ContrastEnhancement>
  322. <Normalize>
  323. <VendorOption name="algorithm">StretchToMinimumMaximum</VendorOption>
  324. <VendorOption name="minValue">50</VendorOption>
  325. <VendorOption name="maxValue">100</VendorOption>
  326. </Normalize>
  327. </ContrastEnhancement>
  328. This example will apply a Normalized ContrastEnhancement by linearly stretch from pixel values [50, 100] to [0, 255]
  329. .. code-block:: xml
  330. <ContrastEnhancement>
  331. <Normalize>
  332. <VendorOption name="algorithm">ClipToMinimumMaximum</VendorOption>
  333. <VendorOption name="minValue">50</VendorOption>
  334. <VendorOption name="maxValue">100</VendorOption>
  335. </Normalize>
  336. </ContrastEnhancement>
  337. .. code-block:: xml
  338. <ContrastEnhancement>
  339. <Normalize>
  340. <VendorOption name="algorithm">ClipToMinimumMaximum</VendorOption>
  341. <VendorOption name="minValue">50</VendorOption>
  342. <VendorOption name="maxValue">100</VendorOption>
  343. </Normalize>
  344. </ContrastEnhancement>
  345. Here below a more complex example that shows the possibility to control the values from a client using env functions.
  346. This is extremely interesting for interactive applications.
  347. .. code-block:: xml
  348. ...
  349. <ContrastEnhancement>
  350. <Normalize>
  351. <VendorOption name="algorithm">
  352. <ogc:Function name="env">
  353. <ogc:Literal>algorithm</ogc:Literal>
  354. <ogc:Literal>StretchToMinimumMaximum</ogc:Literal>
  355. </ogc:Function>
  356. </VendorOption>
  357. <VendorOption name='minValue'>
  358. <ogc:Function name="env">
  359. <ogc:Literal>minValue</ogc:Literal>
  360. <ogc:Literal>10</ogc:Literal>
  361. </ogc:Function>
  362. </VendorOption>
  363. <VendorOption name='maxValue'>
  364. <ogc:Function name="env">
  365. <ogc:Literal>maxValue</ogc:Literal>
  366. <ogc:Literal>1200</ogc:Literal>
  367. </ogc:Function>
  368. </VendorOption>
  369. </Normalize>
  370. </ContrastEnhancement>
  371. ...
  372. ShadedRelief
  373. ^^^^^^^^^^^^
  374. .. warning:: Support for this element has not been implemented yet.
  375. The ``<ShadedRelief>`` element can be used to create a 3-D effect, by selectively adjusting brightness. This is a nice effect to use on an elevation dataset. There are two types of shaded relief possible.
  376. - BrightnessOnly
  377. - ReliefFactor
  378. BrightnessOnly, which takes no parameters, applies shading in WHAT WAY? ReliefFactor sets the amount of exaggeration of the shading (for example, to make hills appear higher). According to the OGC SLD specification, a value of around 55 gives "reasonable results" for Earth-based datasets:
  379. .. code-block:: xml
  380. <ShadedRelief>
  381. <BrightnessOnly />
  382. <ReliefFactor>55</ReliefFactor>
  383. </ShadedRelief>
  384. The above example turns on Relief shading in WHAT WAY?
  385. OverlapBehavior
  386. ^^^^^^^^^^^^^^^
  387. .. warning:: Support for this element has not been implemented yet.
  388. Sometimes raster data is comprised of multiple image sets. Take, for example, a `satellite view of the Earth at night <http://apod.nasa.gov/apod/ap001127.html>`_ . As all of the Earth can't be in nighttime at once, a composite of multiple images are taken. These images are georeferenced, and pieced together to make the finished product. That said, it is possible that two images from the same dataset could overlap slightly, and the OverlapBehavior element is designed to determine how this is handled. There are four types of OverlapBehavior:
  389. - AVERAGE
  390. - RANDOM
  391. - LATEST_ON_TOP
  392. - EARLIEST_ON_TOP
  393. **AVERAGE** takes each overlapping point and displays their average value. **RANDOM** determines which image gets displayed according to chance (which can sometimes result in a crisper image). **LATEST_ON_TOP** and **EARLIEST_ON_TOP** sets the determining factor to be the internal timestamp on each image in the dataset. None of these elements have any parameters, and are all called in the same way:
  394. .. code-block:: xml
  395. <OverlapBehavior>
  396. <AVERAGE />
  397. </OverlapBehavior>
  398. The above sets the OverlapBehavior to AVERAGE.
  399. ImageOutline
  400. ^^^^^^^^^^^^
  401. .. warning:: Support for this element has not been implemented yet.
  402. Given the situation mentioned previously of the image composite, it is possible to style each image so as to have an outline. One can even set a fill color and opacity of each image; a reason to do this would be to "gray-out" an image. To use ImageOutline, you would define a <LineSymbolizer> or <PolygonSymbolizer> inside of the element:
  403. .. code-block:: xml
  404. <ImageOutline>
  405. <LineSymbolizer>
  406. <Stroke>
  407. <CssParameter name="stroke">#0000ff</CssParameter>
  408. </Stroke>
  409. </LineSymbolizer>
  410. </ImageOutline>
  411. The above would create a border line (colored blue with a one pixel default thickness) around each image in the dataset.