ISSUE : v1.0
Copyright © 1999-2002 The Open Group Ltd. All Rights Reserved.
Preface
This document describes the requirements a WMS implementation must meet to be eligible for certification testing and the assertions that are tested.
For each assertion in the specifications, a corresponding entry in this test specification contains the following elements:
| ID: | The name by which the test is known | |||||||
| Class: | An assertion Class as defined in IEEE Std 1003.3. These types are: | |||||||
|
||||||||
| Scope: | If an assertion is type C or D, this entry describes the option that needs to be supported in order to activate the test. | |||||||
| Text: | The text of the assertion and a reference to the source specification from which the assertion is derived. | |||||||
| Note: | Any supplementary information associated with the assertion. For example it may suggest a strategy for the test implementation of the assertion or it may propose rationale as to why a test is classified as untestable. |
This specification uses the following conventions for convenience:
- Element and attribute names are in UPPERCASE.
- References to DTD entities are prefixed with percent sign (e.g. %PCDATA).
- Literal text is enclosed in quotation marks.
Table of Contents
A. Certification Requirements
B. Test Data Definition
C. Assumptions
II. Variables and Scopes
A. User supplied variables
B. User supplied scopes
C. Calculated variables
D. Calculated scopes
III. Test Assertions
Certification Profiles
Basic Profile
Queryable Profile
6 Basic Service Elements
6.1 Version Numbering and Negotiation
6.1.4 Version Number Negotiation
6.4 Request Parameter Rules
6.4.1 Parameter Ordering and Case
7 Web Map Service Operations
7.1 GetCapabilities
7.1.3 Request Parameters
7.1.3.1 VERSION
7.1.3.3 REQUEST
7.1.3.4 UPDATESEQUENCE
7.1.4 GetCapabilities Response
7.1.4.2 General Service Metadata
7.1.4.3 Capability Metadata
7.1.4.5 Layer Properties
7.1.4.5.4 Style
7.1.4.5.5 SRS
7.1.4.5.6 LatLonBoundingBox
7.1.4.5.7 BoundingBox
7.1.4.5.9 Dimension and Extent
7.1.4.5.10 MetadataURL
7.1.4.5.12 Identifier and AuthorityURL
7.1.4.6 Layer Attributes
7.1.4.6.2 Cascaded layers
7.1.4.6.4 Subsettable and resizable layers
7.1.5 Output Formats
7.2 GetMap
7.2.3 Request Parameters
7.2.3.1 VERSION
7.2.3.2 REQUEST
7.2.3.3 LAYERS
7.2.3.4 STYLES
7.2.3.5 SRS
7.2.3.6 BBOX
7.2.3.7 FORMAT
7.2.3.8 WIDTH, HEIGHT
7.2.3.9 TRANSPARENT
7.2.3.10 BGCOLOR
7.2.3.11 EXCEPTIONS
7.3 GetFeatureInfo
7.3.3 Request Parameters
7.3.3.5 QUERY_LAYERS
7.2.3.6 INFO_FORMAT
7.2.3.7 FEATURE_COUNT
7.2.3.9 EXCEPTIONS
Annex C Multi-Dimensional Data
C.2 Declaring Dimensions
I. Test Requirements
A. Certification Requirements
To be certifiable as a BASIC WMS, an implementation must meet the following requirements:
- It must support image/png or image/gif for GetMap requests.
- It must contain the CITE dataset in layers that are subsetable and resizable and support EPSG:4326.
- The EPSG:4326 support must be precise up to the ten-thousandth of a degree.
- The default style for the cite:Lakes layer must fill in the polygon with non-white pixels.
To be certifiable as a QUERYABLE WMS, the implementation must also meet the following requirements:
- GetFeatureInfo requests must be supported
- The CITE dataset layers that contain polygons must be queryable.
B. Test Data Definition
The majority of the CITE standard dataset is based on the
Conformance Test Guidelines for OpenGIS Simple Features Specification for SQL, Revision 1.0
. This set of features makes up a map of a fictional location called Blue Lake.
The features are as described in the Simple Features Specification for SQL document,
except they have been converted to WGS84 coordinates and have been reoriented so the
area is centered at 0 degrees latitude, 0 degrees longitude.
Figure 1 shows an overview map of the area with the prominent features labeled.
Figure 2 shows the location of each of the data points.
![]() |
![]() |
Additional features have also been defined to test data at a larger scale. These consist of a diamond and two overlapping squares, as shown in figure 3. It does not matter which square appears on top.
![]() |
The features are organized into layers as shown in table 1. The layers may be named in any fashion, but must be titled exactly as shown in table.
| Layer Title | Features Contained |
| cite:BasicPolygons | Contains all the featrues shown in figure 3 |
| cite:Bridges | Contains Cam Bridge |
| cite:Buildings | Contains the two buildings along Main Street |
| cite:DividedRoutes | Contains both lanes of Route 75 |
| cite:Forests | Contains the State Forest polygon |
| cite:Lakes | Contains Blue Lake |
| cite:MapNeatline | Contains the border surrounding the Blue Lake vicinity |
| cite:NamedPlaces | Contains Ashton and Goose Island |
| cite:Ponds | Contains both pools of Stock Pond |
| cite:RoadSegments | Contains all the sections of Route 5, Main Street, and the dirt road |
| cite:Streams | Contains Cam Stream and the unnamed stream south of Blue Lake |
A sample capabilities document which implements these layers is available here.
The dataset is available in GML, MapInfo Interchange Format, and ESRI Shapefile format and can be downloaded here.
C. Assumptions
In some cases, the WMS 1.1.1 specification is a bit ambiguous. Where additional interpretation is needed, the tests described in this document assume the following:
- The root Layer in the capabilities document must contain at least one SRS element.
- Scientific notation is allowed in the LatLonBoundingBox element.
- When scientific notation is used, the syntax used is the lexical representation for float values syntax from the XML Schema spec.
- If the INFO_FORMAT parameter is not explicitly stated on a GetFeatureInfo request, the response must still be one of the formats advertised in the GetFeatureInfo Request section of the capabilities document.
- For resizable layers, servers must be able to generate maps as large as 1024x768 and as small as 8x5.
II. Variables and Scopes
A. User supplied variables
These variables are supplied by the user.
| Variable Name | Prompt |
| VAR_HIGH_UPDATESEQUENCE | A value that is lexically higher than the current updateSequence value |
| VAR_LOW_UPDATESEQUENCE | A value that is lexically lower than the current updateSequence value |
B. User supplied scopes
These scopes are options selected by the user.
| Scope ID | Description |
| auto_updatesequence | The updateSequence tests use automatically generated updateSequence values |
| manual_updatesequence | The updateSequence tests use the user supplied values |
| no_profile | No tests for a certification profile were selected |
| basic_profile | Tests for the BASIC profile were selected |
| queryable_profile | Tests for the QUERYABLE profile were selected |
| recommended | The recommendation support tests were selected |
| testgml | Tests for GetFeatureInfo format application/vnd.ogc.gml were selected. |
| free | The fees and access constraints tests were selected |
| loosebboxconstraints | The LOOSE bounding box constraint test was selected |
| strictbboxconstraints | The STRICT bounding box constraint test was selected |
| eitherbboxconstraint | No bounding box constraint tests were selected |
C. Calculated variables
These variables are extracted from the capabilities document using XPath expressions.
| VAR_WMS_VERSION = |
|
| VAR_WMS_GET_CAPABILITIES_HTTP_GET_URL = |
citef:append-kvp(/WMT_MS_Capabilities/Capability/Request/GetCapabilities/DCPType /HTTP/Get/OnlineResource/@*[local-name() = 'href'], '') |
| VAR_WMS_GET_MAP_HTTP_GET_URL = |
citef:append-kvp(/WMT_MS_Capabilities/Capability/Request/GetMap/DCPType/HTTP/Get /OnlineResource/@*[local-name() = 'href'], '') |
| VAR_WMS_GET_FEATURE_INFO_HTTP_GET_URL = |
citef:append-kvp(/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo/DCPType/ HTTP/Get/OnlineResource/@*[local-name() = 'href'], '') |
| VAR_CURRENT_UPDATESEQUENCE = |
string(/WMT_MS_Capabilities/@updateSequence) |
| VAR_AUTO_HIGH_UPDATESEQUENCE = |
citef:inc(/WMT_MS_Capabilities/@updateSequence, 1) |
| VAR_AUTO_LOW_UPDATESEQUENCE = |
citef:inc(/WMT_MS_Capabilities/@updateSequence, -1) |
| VAR_IMAGE_FORMAT = |
string(/WMT_MS_Capabilities/Capability/Request/GetMap/Format[1]) |
| VAR_LOSSLESS_FORMAT = |
string((/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or F ormat='image/png'])/Format[1]) |
| VAR_TRANSPARENT_FORMAT = |
string((/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or F ormat='image/png'])/Format[1]) |
| VAR_INHERENT_STYLE = |
string(//Layer[starts-with(Title, 'cite') and Style]/Style[1]/Name) |
| VAR_LAYER_WITH_INHERENT_STYLE = |
string(//Layer[starts-with(Title, 'cite') and Style]/Name) |
| VAR_INHERITED_STYLE = |
string(//Layer[starts-with(Title, 'cite') and not(Style)]/ancestor::Layer/Style[ 1]/Name) |
| VAR_LAYER_WITH_INHERITED_STYLE = |
string(//Layer[starts-with(Title, 'cite') and not(Style) and ancestor::Layer/Sty le]/Name) |
| VAR_STYLE = |
string(//Layer[starts-with(Title, 'cite')]/ancestor-or-self::Layer/Style[1]/Name ) |
| VAR_LAYER_WITH_STYLE = |
string(//Layer[starts-with(Title, 'cite') and ancestor-or-self::Layer/Style]/Nam e) |
| VAR_LAYER_WITH_INHERENT_SRS = |
string((//Layer[starts-with(Title, 'cite') and SRS[contains(., 'EPSG:4326')]])[1 ]/Name) |
| VAR_LAYER_WITH_INHERITED_SRS = |
string((//Layer[starts-with(Title, 'cite') and not(SRS[contains(., 'EPSG:4326')] )])[1]/Name) |
| VAR_UNQUERYABLE_LAYER = |
string(//Layer[starts-with(Title, 'cite') and @queryable='0'][1]/Name) |
| VAR_STDDATA_EXISTS = |
count(//Layer[(Title = 'cite:BasicPolygons' or Title = 'cite:Bridges' or Title = 'cite:Buildings' or Title = 'cite:DividedRoutes' or Title = 'cite:Forests' or T itle = 'cite:Lakes' or Title = 'cite:MapNeatline' or Title = 'cite:NamedPlaces' or Title = 'cite:Ponds' or Title = 'cite:RoadSegments' or Title = 'cite:Streams' ) and ancestor-or-self::Layer/SRS[contains(., 'EPSG:4326')] and not(@noSubsets = 1) and (not(@fixedWidth) or @fixedWidth = 0) and (not(@fixedHeight) or @fixedHe ight = 0)]) = 11 |
| VAR_QUERYABLE_LAYERS_EXIST = |
count(//Layer[Title = 'cite:BasicPolygons' and @queryable = '1']) > 0 and count( //Layer[Title = 'cite:Forests' and @queryable = '1']) > 0 and count(//Layer[Titl e = 'cite:Lakes' and @queryable = '1']) > 0 and count(//Layer[Title = 'cite:Name dPlaces' and @queryable = '1']) > 0 and count(//Layer[Title = 'cite:Ponds' and @ queryable = '1']) > 0 and count(/WMT_MS_Capabilities/Capability/Request/GetFeatu reInfo) > 0 |
| VAR_BASIC_POLYGONS = |
string(//Layer[Title = 'cite:BasicPolygons']/Name) |
| VAR_BRIDGES = |
string(//Layer[Title = 'cite:Bridges']/Name) |
| VAR_BUILDINGS = |
string(//Layer[Title = 'cite:Buildings']/Name) |
| VAR_DIVIDED_ROUTES = |
string(//Layer[Title = 'cite:DividedRoutes']/Name) |
| VAR_FORESTS = |
string(//Layer[Title = 'cite:Forests']/Name) |
| VAR_LAKES = |
string(//Layer[Title = 'cite:Lakes']/Name) |
| VAR_MAP_NEATLINE = |
string(//Layer[Title = 'cite:MapNeatline']/Name) |
| VAR_NAMED_PLACES = |
string(//Layer[Title = 'cite:NamedPlaces']/Name) |
| VAR_PONDS = |
string(//Layer[Title = 'cite:Ponds']/Name) |
| VAR_ROAD_SEGMENTS = |
string(//Layer[Title = 'cite:RoadSegments']/Name) |
| VAR_STREAMS = |
string(//Layer[Title = 'cite:Streams']/Name) |
| VAR_GET_FEATURE_INFO_FORMAT = |
string((/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo/Format[(position( ) = 1 and last() = 1) or . != 'application/vnd.ogc.gml'])[1]) |
D. Calculated scopes
These scopes are extracted from the capabilities document using XPath expressions.
| wms:updatesequence - |
|
| wms:stddata - |
[[VAR_STDDATA_EXISTS]]() |
| wms:queryable - |
[[VAR_QUERYABLE_LAYERS_EXIST]]() |
| wms:namedstyle - |
|
| wms:inherentstyle - |
|
| wms:inheritedstyle - |
|
| wms:inherentsrs - |
|
| wms:inheritedsrs - |
|
| wms:gif - |
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif']) > 0 |
| wms:jpeg - |
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/jpeg']) > 0 |
| wms:png - |
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/png']) > 0 |
| wms:transparency - |
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or For mat = 'image/png']) > 0 |
| wms:lossless - |
count(/WMT_MS_Capabilities/Capability/Request/GetMap[Format = 'image/gif' or For mat = 'image/png']) > 0 |
| wms:se_inimage - |
count(/WMT_MS_Capabilities/Capability/Exception[Format = 'application/vnd.ogc.se _inimage']) > 0 |
| wms:se_blank - |
count(/WMT_MS_Capabilities/Capability/Exception[Format = 'application/vnd.ogc.se _blank']) > 0 |
| wms:getfeatureinfo - |
count(/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo) > 0 |
| wms:unqueryablelayer - |
|
| wms:gml - |
count(/WMT_MS_Capabilities/Capability/Request/GetFeatureInfo/Format[. = 'applica tion/vnd.ogc.gml']) > 0 |
III. Test Assertions
Certification Profiles
Basic Profile
| |||||||||||
|
Queryable Profile
| |||||||||||
| |||||||||||
|
6 Basic Service Elements
6.1 Version Numbering and Negotiation
6.1.4 Version Number Negotiation
| |||||||||||||||
| |||||||||||||||
| |||||||||||||||
|
6.4 Request Parameter Rules
6.4.1 Parameter Ordering and Case
| ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||
|
7 Web Map Service Operations
7.1 GetCapabilities
7.1.3 Request Parameters
7.1.3.1 VERSION
| |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| |||||||||||||||||||||||||
| |||||||||||||||||||||||||
|
7.1.3.3 REQUEST
|
7.1.3.4 UPDATESEQUENCE
| ||||||||||||||||||
| ||||||||||||||||||
| ||||||||||||||||||
| ||||||||||||||||||
| ||||||||||||||||||
|
7.1.4 GetCapabilities Response
| |||||||||||||||
|
7.1.4.2 General Service Metadata
| |||||||||||||||
|
7.1.4.3 Capability Metadata
| |||||||||||||||||
|
7.1.4.5 Layer Properties
7.1.4.5.4 Style
|
7.1.4.5.5 SRS
|
7.1.4.5.6 LatLonBoundingBox
| |||||||||||||||
|
7.1.4.5.7 BoundingBox
|
7.1.4.5.9 Dimension and Extent
| |||||||||||||||
|
7.1.4.5.10 MetadataURL
|
7.1.4.5.12 Identifier and AuthorityURL
| |||||||||||||||
|
7.1.4.6 Layer Attributes
7.1.4.6.2 Cascaded layers
|
7.1.4.6.4 Subsettable and resizable layers
|
7.1.5 Output Formats
|
7.2 GetMap
7.2.3 Request Parameters
7.2.3.1 VERSION
|
7.2.3.2 REQUEST
|
7.2.3.3 LAYERS
| |||||||||||||||||||||||
| |||||||||||||||||||||||
| |||||||||||||||||||||||
| |||||||||||||||||||||||
| |||||||||||||||||||||||
| |||||||||||||||||||||||
| |||||||||||||||||||||||
|


