When you publish data in a WMS service, you can influence the styling of the data in two ways:
-
By assigning an SLD style to the Product containing the data. This style is used by default when a WMS client sends a
GetMaprequest for the corresponding WMS layer without specifying its own SLD style. -
By including an SLD style in
GetMaprequests from WMS clients.
By default, an SLD style contains generic styling settings for vector and raster data. LuciadFusion extends that styling capability by also supporting SLD styles with S-52 and S-101 display settings, which configure the styling of ECDIS S-57 and S-101 data respectively.
Using those ECDIS-specific SLD styles, LuciadFusion Studio users and WMS clients can customize the styling of ECDIS S-57 or S-101 data published in a WMS layer.
Working with S-52 and S-101 display settings
Maritime ECDIS data is typically rendered according to International Hydrographic Organisation (IHO) specifications:
-
The S-52 specification guides the display of S-57 data
-
The S-101 specification guides the display of S-101 data.
These specifications define a set of parameters that you can use to optimize the displaying of maritime data for a specific environment. These parameters include color scheme settings, a detailed list of icons and line styles, ship depth settings, several object filters, and other customizations.
The SLD standard doesn’t offer out-of-the-box support for the modeling of these S-52 and S-101 parameters. To allow you to re-use SLD styles to customize the styling of S-57 and S-101 data, LuciadFusion defines a custom SLD extension for representing S-52 and S-101 display settings.
Using SLD to customize the S-52 display settings
The SLD extension to customize S-52 display settings is defined as an XML Schema consisting of 2 parts:
-
The S-52 XSD Schema: an XML Schema that defines an SLD-independent XML representation of the S-52 display settings.
s52.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.luciad.com/ecdis/s52/1.0"
xmlns="http://www.luciad.com/ecdis/s52/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1.0.4" xml:lang="en">
<xs:annotation>
<xs:documentation>
This schema defines an encoding for S-52 display settings.
</xs:documentation>
</xs:annotation>
<xs:element name="displaySettings" type="DisplaySettingsType"/>
<xs:complexType name="DisplaySettingsType">
<xs:sequence>
<!-- color & styling -->
<xs:element name="colorScheme" type="ColorSchemeType"/>
<xs:element name="pointSymbolType" type="PointSymbolType"/>
<xs:element name="areaBoundarySymbolType" type="AreaBoundarySymbolType"/>
<xs:element name="displayFullLengthLightSectorLines" type="xs:boolean"/>
<!-- filtering -->
<xs:element name="displayCategory" type="DisplayCategoryType"/>
<xs:element name="displaySoundings" type="xs:boolean"/>
<xs:element name="displayLandAreas" type="xs:boolean"/>
<xs:element name="displayMetadata" type="xs:boolean"/>
<xs:element name="objectClasses" minOccurs="0">
<xs:simpleType>
<xs:list itemType="xs:int"/>
</xs:simpleType>
</xs:element>
<!-- text -->
<xs:element name="displayText" type="xs:boolean"/>
<xs:element name="displayTextGroups" minOccurs="0">
<xs:simpleType>
<xs:list itemType="xs:int"/>
</xs:simpleType>
</xs:element>
<xs:element name="useAbbreviations" type="xs:boolean"/>
<xs:element name="useNationalLanguage" type="xs:boolean"/>
<!-- depth styling -->
<xs:element name="safetyDepth" type="xs:double"/>
<xs:element name="shallowContour" type="xs:double"/>
<xs:element name="safetyContour" type="xs:double"/>
<xs:element name="deepContour" type="xs:double"/>
<xs:element name="useTwoShades" type="xs:boolean"/>
<xs:element name="displayShallowPattern" type="xs:boolean"/>
<xs:element name="displayIsolatedDangersInShallowWater" type="xs:boolean"/>
<!-- catalogue styling -->
<xs:element name="displayChartBoundaries" type="xs:boolean"/>
<xs:element name="displayOverscaleIndication" type="xs:boolean"/>
<xs:element name="displayUnderscaleIndication" type="xs:boolean"/>
<xs:element name="underscaleIndicationColor" type="xs:string"/>
<xs:element name="displayObjectsOutsideView" type="xs:boolean"/>
<xs:element name="scaleDenominators" type="ScaleDenominatorsType"/>
</xs:sequence>
<!-- New properties as of 1.0.1 = 2015.1: modeled as attributes for backwards compatibility -->
<xs:attribute name="objectClassSelectionEnabled" type="xs:boolean"/>
<xs:attribute name="dateFilterValue" type="xs:string"/>
<!-- New properties as of 1.0.2 = 2018.0: modeled as attributes for backwards compatibility -->
<xs:attribute name="beam" type="xs:double"/> <!-- For InlandECDIS -->
<xs:attribute name="airDraft" type="xs:double"/> <!-- For InlandECDIS -->
<!-- New properties as of 1.0.3 = 2021.1: modeled as attributes for backwards compatibility -->
<xs:attribute name="radarCategory" type="RadarCategoryType"/>
<!-- New properties as of 1.0.4 = 2023.0: modeled as attributes for backwards compatibility -->
<xs:attribute name="productType" type="ProductType"/>
</xs:complexType>
<xs:simpleType name="ColorSchemeType">
<xs:restriction base="xs:string">
<xs:enumeration value="day"/>
<xs:enumeration value="dusk"/>
<xs:enumeration value="night"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="PointSymbolType">
<xs:restriction base="xs:string">
<xs:enumeration value="simplified"/>
<xs:enumeration value="paperChart"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="AreaBoundarySymbolType">
<xs:restriction base="xs:string">
<xs:enumeration value="plain"/>
<xs:enumeration value="symbolized"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DisplayCategoryType">
<xs:restriction base="xs:string">
<xs:enumeration value="displayBase"/>
<xs:enumeration value="standard"/>
<xs:enumeration value="other"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ScaleDenominatorsType">
<xs:sequence>
<xs:element name="scaleDenominator" type="xs:int" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="RadarCategoryType">
<xs:restriction base="xs:string">
<xs:enumeration value="over"/>
<xs:enumeration value="under"/>
<xs:enumeration value="both"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ProductType">
<xs:restriction base="xs:string">
<xs:enumeration value="ENC"/>
<xs:enumeration value="IENC"/>
<xs:enumeration value="AML"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
-
The SLD S-52 XSD Schema: a XML Schema that defines a thin wrapper around the S-52 XSD Schema, allowing you to embed the S-52 display settings into an SLD symbolizer extension.
s52-sld.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.luciad.com/ecdis/s52-sld/1.0"
xmlns:s52-sld="http://www.luciad.com/ecdis/s52-sld/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:se="http://www.opengis.net/se"
xmlns:s52="http://www.luciad.com/ecdis/s52/1.0"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1.0.0" xml:lang="en">
<xs:import namespace="http://www.opengis.net/se"
schemaLocation="../../../../net/opengis/se/1.1.0/FeatureStyle.xsd"/>
<xs:import namespace="http://www.luciad.com/ecdis/s52/1.0" schemaLocation="s52.xsd"/>
<xs:annotation>
<xs:documentation>
This schema defines an SLD symbolizer for S-52.
</xs:documentation>
</xs:annotation>
<xs:complexType name="S52SymbolizerType">
<xs:complexContent>
<xs:extension base="se:SymbolizerType">
<xs:sequence>
<xs:element ref="s52:displaySettings"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="S52Symbolizer" type="s52-sld:S52SymbolizerType" substitutionGroup="se:Symbolizer"/>
</xs:schema>
These are two examples of S-52 SLD styles, one that applies a night style and one that hides land areas:
s52-sld-example-night.xml
<se:FeatureTypeStyle xmlns:se="http://www.opengis.net/se"
xmlns:ns4="http://www.luciad.com/ecdis/s52-sld/1.0"
xmlns:ns3="http://www.luciad.com/ecdis/s52/1.0"
version="1.1.0">
<se:Rule>
<se:MinScaleDenominator>0.0</se:MinScaleDenominator>
<se:MaxScaleDenominator>INF</se:MaxScaleDenominator>
<ns4:S52Symbolizer>
<ns3:displaySettings>
<ns3:colorScheme>night</ns3:colorScheme>
<ns3:pointSymbolType>simplified</ns3:pointSymbolType>
<ns3:areaBoundarySymbolType>plain</ns3:areaBoundarySymbolType>
<ns3:displayFullLengthLightSectorLines>false</ns3:displayFullLengthLightSectorLines>
<ns3:displayCategory>standard</ns3:displayCategory>
<ns3:displaySoundings>false</ns3:displaySoundings>
<ns3:displayLandAreas>true</ns3:displayLandAreas>
<ns3:displayMetadata>false</ns3:displayMetadata>
<ns3:displayText>false</ns3:displayText>
<ns3:useAbbreviations>false</ns3:useAbbreviations>
<ns3:useNationalLanguage>false</ns3:useNationalLanguage>
<ns3:safetyDepth>30.0</ns3:safetyDepth>
<ns3:shallowContour>2.0</ns3:shallowContour>
<ns3:safetyContour>30.0</ns3:safetyContour>
<ns3:deepContour>30.0</ns3:deepContour>
<ns3:useTwoShades>true</ns3:useTwoShades>
<ns3:displayShallowPattern>false</ns3:displayShallowPattern>
<ns3:displayIsolatedDangersInShallowWater>false</ns3:displayIsolatedDangersInShallowWater>
<ns3:displayChartBoundaries>true</ns3:displayChartBoundaries>
<ns3:displayOverscaleIndication>true</ns3:displayOverscaleIndication>
<ns3:displayUnderscaleIndication>true</ns3:displayUnderscaleIndication>
</ns3:displaySettings>
</ns4:S52Symbolizer>
</se:Rule>
</se:FeatureTypeStyle>
s52-sld-example-nolandareas.xml
<se:FeatureTypeStyle xmlns:se="http://www.opengis.net/se"
xmlns:ns4="http://www.luciad.com/ecdis/s52-sld/1.0"
xmlns:ns3="http://www.luciad.com/ecdis/s52/1.0"
version="1.1.0">
<se:Rule>
<se:MinScaleDenominator>0.0</se:MinScaleDenominator>
<se:MaxScaleDenominator>INF</se:MaxScaleDenominator>
<ns4:S52Symbolizer>
<ns3:displaySettings>
<ns3:colorScheme>day</ns3:colorScheme>
<ns3:pointSymbolType>simplified</ns3:pointSymbolType>
<ns3:areaBoundarySymbolType>plain</ns3:areaBoundarySymbolType>
<ns3:displayFullLengthLightSectorLines>false</ns3:displayFullLengthLightSectorLines>
<ns3:displayCategory>standard</ns3:displayCategory>
<ns3:displaySoundings>false</ns3:displaySoundings>
<ns3:displayLandAreas>false</ns3:displayLandAreas>
<ns3:displayMetadata>false</ns3:displayMetadata>
<ns3:displayText>false</ns3:displayText>
<ns3:useAbbreviations>false</ns3:useAbbreviations>
<ns3:useNationalLanguage>false</ns3:useNationalLanguage>
<ns3:safetyDepth>30.0</ns3:safetyDepth>
<ns3:shallowContour>2.0</ns3:shallowContour>
<ns3:safetyContour>30.0</ns3:safetyContour>
<ns3:deepContour>30.0</ns3:deepContour>
<ns3:useTwoShades>true</ns3:useTwoShades>
<ns3:displayShallowPattern>false</ns3:displayShallowPattern>
<ns3:displayIsolatedDangersInShallowWater>false</ns3:displayIsolatedDangersInShallowWater>
<ns3:displayChartBoundaries>true</ns3:displayChartBoundaries>
<ns3:displayOverscaleIndication>true</ns3:displayOverscaleIndication>
<ns3:displayUnderscaleIndication>true</ns3:displayUnderscaleIndication>
</ns3:displaySettings>
</ns4:S52Symbolizer>
</se:Rule>
</se:FeatureTypeStyle>
These SLD style examples can be loaded directly in LuciadFusion Studio and assigned to a Product containing S-57 data.
Additionally, they can be used by WMS clients in GetMap requests for WMS layers containing S-57 data.
Using SLD to customize the S-101 display settings
The SLD extension to customize S-101 display settings is defined as an XML Schema consisting of 2 parts:
-
The S-101 XSD Schema: an XML Schema that defines an SLD-independent XML representation of the S-101 display settings.
s101.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.luciad.com/ecdis/s101/1.0"
xmlns="http://www.luciad.com/ecdis/s101/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1.0.4" xml:lang="en">
<xs:annotation>
<xs:documentation>
This schema defines an encoding for S-101 display settings.
</xs:documentation>
</xs:annotation>
<xs:element name="displaySettings" type="DisplaySettingsType"/>
<xs:complexType name="DisplaySettingsType">
<xs:sequence>
<!-- color & styling -->
<xs:element name="colorPalette" type="ColorPaletteType"/>
<xs:element name="simplifiedSymbols" type="xs:boolean"/>
<xs:element name="plainBoundaries" type="xs:boolean"/>
<xs:element name="fullLightLines" type="xs:boolean"/>
<!-- filtering -->
<xs:element name="displayMode" type="DisplayModeType"/>
<xs:element name="viewingGroupLayers" minOccurs="0">
<xs:simpleType>
<xs:list itemType="ViewingGroupLayerType"/>
</xs:simpleType>
</xs:element>
<xs:element name="radarOverlay" type="xs:boolean"/>
<xs:element name="displayPlanes" minOccurs="0">
<xs:simpleType>
<xs:list itemType="DisplayPlaneType"/>
</xs:simpleType>
</xs:element>
<xs:element name="ignoreScaleMinimum" type="xs:boolean"/>
<!-- text -->
<xs:element name="language" type="xs:string"/>
<!-- depth styling -->
<xs:element name="safetyDepth" type="xs:double"/>
<xs:element name="shallowContour" type="xs:double"/>
<xs:element name="safetyContour" type="xs:double"/>
<xs:element name="deepContour" type="xs:double"/>
<xs:element name="useTwoShades" type="xs:boolean"/>
<xs:element name="shallowWaterDangers" type="xs:boolean"/>
<!-- catalogue styling -->
<xs:element name="displayOverscaleIndication" type="xs:boolean"/>
<xs:element name="displayUnderscaleIndication" type="xs:boolean"/>
<xs:element name="underscaleIndicationColor" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="ColorPaletteType">
<xs:restriction base="xs:string">
<xs:enumeration value="Day"/>
<xs:enumeration value="Dusk"/>
<xs:enumeration value="Night"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DisplayModeType">
<xs:restriction base="xs:string">
<xs:enumeration value="DisplayBase"/>
<xs:enumeration value="StandardDisplay"/>
<xs:enumeration value="OtherInformation"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="DisplayPlaneType">
<xs:restriction base="xs:string">
<xs:enumeration value="OverRadar"/>
<xs:enumeration value="UnderRadar"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ViewingGroupLayerType">
<xs:restriction base="xs:string">
<xs:enumeration value="1"/>
<xs:enumeration value="2"/>
<xs:enumeration value="3"/>
<xs:enumeration value="3a"/>
<xs:enumeration value="3b"/>
<xs:enumeration value="4"/>
<xs:enumeration value="5"/>
<xs:enumeration value="6"/>
<xs:enumeration value="7"/>
<xs:enumeration value="8"/>
<xs:enumeration value="9"/>
<xs:enumeration value="10"/>
<xs:enumeration value="11"/>
<xs:enumeration value="12"/>
<xs:enumeration value="13"/>
<xs:enumeration value="14"/>
<xs:enumeration value="15"/>
<xs:enumeration value="16"/>
<xs:enumeration value="17"/>
<xs:enumeration value="18"/>
<xs:enumeration value="900"/>
<xs:enumeration value="910"/>
<xs:enumeration value="920"/>
<xs:enumeration value="920a"/>
<xs:enumeration value="920b"/>
<xs:enumeration value="920c"/>
<xs:enumeration value="930"/>
<xs:enumeration value="940"/>
<xs:enumeration value="100"/>
<xs:enumeration value="101"/>
<xs:enumeration value="102"/>
<xs:enumeration value="102a"/>
<xs:enumeration value="102b"/>
<xs:enumeration value="102c"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
-
The SLD S-101 XSD Schema: an XML Schema that defines a thin wrapper around the S-101 XSD Schema, allowing you to embed the S-101 display settings into an SLD symbolizer extension.
s101-sld.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.luciad.com/ecdis/s101-sld/1.0"
xmlns:s101-sld="http://www.luciad.com/ecdis/s101-sld/1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:se="http://www.opengis.net/se"
xmlns:s101="http://www.luciad.com/ecdis/s101/1.0"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1.0.0" xml:lang="en">
<xs:import namespace="http://www.opengis.net/se"
schemaLocation="../../../../net/opengis/se/1.1.0/FeatureStyle.xsd"/>
<xs:import namespace="http://www.luciad.com/ecdis/s101/1.0" schemaLocation="s101.xsd"/>
<xs:annotation>
<xs:documentation>
This schema defines an SLD symbolizer for S-101.
</xs:documentation>
</xs:annotation>
<xs:complexType name="S101SymbolizerType">
<xs:complexContent>
<xs:extension base="se:SymbolizerType">
<xs:sequence>
<xs:element ref="s101:displaySettings"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="S101Symbolizer" type="s101-sld:S101SymbolizerType" substitutionGroup="se:Symbolizer"/>
</xs:schema>
This is an example of an S-101 SLD style definition that applies a dusk style:
s101-sld-example-dusk.xml
<se:FeatureTypeStyle xmlns:se="http://www.opengis.net/se"
xmlns:s101-sld="http://www.luciad.com/ecdis/s101-sld/1.0"
xmlns:s101="http://www.luciad.com/ecdis/s101/1.0"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="1.1.0">
<se:Rule>
<se:MinScaleDenominator>0.0</se:MinScaleDenominator>
<se:MaxScaleDenominator>INF</se:MaxScaleDenominator>
<s101-sld:S101Symbolizer>
<s101:displaySettings>
<s101:colorPalette>Dusk</s101:colorPalette>
<s101:simplifiedSymbols>false</s101:simplifiedSymbols>
<s101:plainBoundaries>true</s101:plainBoundaries>
<s101:fullLightLines>false</s101:fullLightLines>
<s101:displayMode>StandardDisplay</s101:displayMode>
<s101:radarOverlay>false</s101:radarOverlay>
<s101:displayPlanes>OverRadar UnderRadar</s101:displayPlanes>
<s101:ignoreScaleMinimum>false</s101:ignoreScaleMinimum>
<s101:language>eng</s101:language>
<s101:safetyDepth>30.0</s101:safetyDepth>
<s101:shallowContour>2.0</s101:shallowContour>
<s101:safetyContour>30.0</s101:safetyContour>
<s101:deepContour>30.0</s101:deepContour>
<s101:useTwoShades>true</s101:useTwoShades>
<s101:shallowWaterDangers>true</s101:shallowWaterDangers>
<s101:displayOverscaleIndication>true</s101:displayOverscaleIndication>
<s101:displayUnderscaleIndication>true</s101:displayUnderscaleIndication>
<s101:underscaleIndicationColor>ff0000ff</s101:underscaleIndicationColor>
</s101:displaySettings>
</s101-sld:S101Symbolizer>
</se:Rule>
</se:FeatureTypeStyle>
You can load these SLD style examples directly in LuciadFusion Studio and assign them to a Product containing S-101 data.
In addition, WMS clients can include them in GetMap requests for WMS layers containing S-101 data.
Identifying WMS layers that accept S-52 or S-101 SLD styles
A WMS server may serve a mixed set of layers: some layers contain ECDIS data, while other layers contain different data types.
If you want to use S-52 or S-101 SLD styles in WMS GetMap requests from a WMS client, you want to know which WMS layers accept those styles.
To allow WMS clients to discover which layers support S-52 or S-101 SLD styles, LuciadFusion WMS servers include these keywords in the WMS capabilities:
-
S52-SLDfor WMS layers containing ENC and SENC data -
AML-SLDfor WMS layers containing AML data -
S101-SLDfor WMS layers containing S-101 data
Using the Luciad portfolio to include S-52 and S-101 SLD styles in WMS requests
Several products in the Luciad portfolio provide WMS clients that support S-52 and S-101 SLD styles, and allow applications to customize the styling of ECDIS data published in a WMS layer:
-
LuciadLightspeed: the LuciadLightspeed Maritime Standards component offers access to both an API and UI components to create and customize S-52 and S-101 SLD styles. This For an illustration of this capability, you can start Lucy or one of the WMS client samples:
-
The Lucy application shows a styling panel when you connect with a LuciadFusion WMS serving ECDIS data. This capability is part of the ECDIS WMS add-on com.luciad.lucy.addons.wmsclient.ecdis.TLcyWMSEcdisAddOn.
-
The samples.wms.client.ecdis package contains several samples that illustrate the use of the API and UI components, both in GXY views and Lightspeed views.
-
For more information about using LuciadLightspeed with an ECDIS-enabled WMS server, see Connecting to an ECDIS-enabled WMS server.
-
-
LuciadRIA: the LuciadRIA ECDIS sample connects to a WMS serving ECDIS data. It includes UI to customize the styling: https://dev.luciad.com/portal/packed-samples/ria/ecdis/index.html?webgl&reference=epsg:4978.