Styles

specdraftimplcandidate

Publish styles.

Scope

Clients can discover, access, use, and update styles in the following stylesheet encodings:

  • Mapbox/MapLibre Style
  • OGC SLD 1.0
  • OGC SLD 1.1
  • QGIS QML
  • ArcGIS Desktop (lyr)
  • ArcGIS Pro (lyrx)
  • 3D Tiles Styling

Styles available as Mapbox/MapLibre Style can be used by ldproxy to render features and vector tiles where MapLibre is used as the map client. Styles available as 3D Tiles Styling can be used by ldproxy to render features and vector tiles where Cesium is used as the map client. See defaultStyle in HTML, and style in Features HTML and Tiles.

Limitations

All encodings of a style must be created and maintained separately. The on-the-fly derivation of a stylesheet in another stylesheet encoding is not supported.

The following limitations apply for the stylesheet encodings:

  • Mapbox/MapLibre Style: The stylesheets are parsed into an internal Java object. Not all structures are
    supported or validated:
    • Only a single sprite is supported.
    • Terrain is not supported.
    • Text strings (e.g., color values) are not validated.
    • filter, layout and paint values are not validated.
    • Interpolate expressions are only supported in layout and paint values.
    • Sources: volatile is not supported.
    • Vector sources: promoteId is not supported.
  • 3D Tiles Styling: The stylesheets are parsed into an internal Java object. Text strings in
    the JSON are not validated. The defines key is not supported.
  • OGC SLD 1.0/1.1: The content of these stylesheets is validated against the XML Schema.
  • QGIS QML, ArcGIS Pro (lyrx), ArcGIS Desktop (lyr): The content of these stylesheets is not validated.

Conformance Classes

This building block implements requirements of the conformance classes Core, Manage Styles, Validation of styles, Resources, Manage resources, Mapbox Style, OGC SLD 1.0, OGC SLD 1.1, HTML and Style information from the draft specification OGC API - Stylesopen in new window. The implementation is subject to change in the course of the development and approval process of the draft.

Operations

ResourcePathMethodsMedia TypesDescription
Styles
styles
GET
This operation fetches the list of styles. For each style the id, a title, links to the stylesheet of the style in each supported encoding, and the link to the metadata is provided.
Style
styles/{styleId}
GET
This operation fetches the list of styles. For each style the id, a title, links to the stylesheet of the style in each supported encoding, and the link to the metadata is provided.
Style Metadata
styles/{styleId}/metadata
GET
Style metadata is essential information about a style in order to support users to discover and select styles for rendering their data and for visual style editors to create user interfaces for editing a style. This operation returns the metadata for the requested style as a single document. The style metadata is derived from the style and the stylesheet.
Style Legend
styles/{styleId}/legend
GET
This endpoint retrieves the legend for a map style. The legend is provided as a PNG file, which can be used to understand the symbols and colors used in the map style.
Collection Styles
collections/{collectionId}/styles
GET
This operation fetches the list of styles. For each style the id, a title, links to the stylesheet of the style in each supported encoding, and the link to the metadata is provided.
Collection Style
collections/{collectionId}/styles/{styleId}
GET
Fetches the style with identifier styleId. The set of available styles can be retrieved at /styles. Not all styles are available in all style encodings.
Collection Style Metadata
collections/{collectionId}/styles/{styleId}/metadata"
GET
Style metadata is essential information about a style in order to support users to discover and select styles for rendering their data and for visual style editors to create user interfaces for editing a style. This operations returns the metadata for the requested style as a single document. The stylesheet of the style will typically include some the metadata, too.
Collection Style Legend
collections/{collectionId}/styles/{styleId}/legend
GET
This endpoint retrieves the legend for a map style. The legend is provided as a PNG file, which can be used to understand the symbols and colors used in the map style.
Styles, Style
styles, styles/{styleId}
DELETE, POST, PUT
Create, Replace and Delete styles.
Collection Styles, Collection Style
collection/{collectionId}/styles, collection/{collectionId}/styles/{styleId}
DELETE, POST, PUT
Create, Replace and Delete styles of a feature collection.

Path Parameters

NameResourcesDescription
collectionId
Collection Styles, Collection Style, Collection Style Metadata, Collection Style Legend
The identifier of the feature collection.
styleId
Style, Style Metadata, Style Legend, Collection Style, Collection Style Metadata, Collection Style Legend
The local identifier of the style.

Query Parameters

NameResourcesDescription
f
Styles
Select the output format of the response. If no value is provided, the standard HTTP rules apply, i.e., the "Accept" header will be used to determine the format.
f
Style
Select the output format of the response. If no value is provided, the standard HTTP rules apply, i.e., the "Accept" header will be used to determine the format.
dry-run
Styles, Collection Styles
If set to 'true', the operation just validates the content without creating a new style.
dry-run
Style, Collection Style
If set to 'true', the operation just validates the content without creating a new style or updating an existing style.

Configuration

Storage

  • MapLibre stylesheets reside in the Store as values with type
    maplibre-styles and path {apiId}/{styleId}. In the latter case the extension mbs is
    still supported, but preferably stylesheets are stored as plain YAML or JSON files. The URIs (Sprites,
    Glyphs, Source.url, Source.tiles) used in MapLibre styles links might contain {serviceUrl}.
  • 3d Tiles stylesheets reside in the Store as values with type
    3dtiles-styles and path {apiId}/{styleId}. In the latter case the extension 3dtiles
    is still supported, but preferably stylesheets are stored as plain YAML or JSON files.
  • Other stylesheets reside in the Store as resources with type
    other-styles and path {apiId}/{styleId}.{ext}.
    The file extension {ext} must have the following value depending on the style encoding:
    • OGC SLD 1.0: sld10
    • OGC SLD 1.1: sld11
    • QGIS QML: qml
    • ArcGIS Desktop: lyr
    • ArcGIS Pro: lyrx

Layer Control

The layer control dialog in the webmap is activated via the webmapWithLayerControl option (see 'Options' below).

The dialog can be configured in the MapLibre style metadata (member ldproxy:layerControl). On the top level there are the following JSON members:

  • onlyLegend (Boolean, default: false): With true only the groups and layers with the symbols are displayed without the possibility to deactivate layers.
  • opened (Boolean, default: false): If true is set, the layer selection dialog will be displayed open when the map is loaded.
  • entries (default: one merge group per source layer in the vector tiles): The configuration of the groups and layers as described below.

In entries the following items allowed:

  • The id of a MapLibre layer in the style (string). The layer is displayed in the dialog with the id as name. The symbol of the layer is created without specifying attributes or a particular zoom layer.
  • A layer object. id is the id of the MapLibre layer in the style (string, mandatory). label is the name of the layer in the dialog (string, default: id). zoom is the zoom level to use when creating symbols (number, default: none). properties are attributes (object, default {}) to be used during symbol generation.
  • A group object. type is always "group". id is an id of the group (string, mandatory). label is the name of the group in the dialog (string, default: id). With onlyLegend the possibility to disable layers can be disabled for the group (Boolean, default: false). entries can contain layers (objects or string), groups or merge groups (array, default: []).
  • A radio group object. It may only occur on the top level of entries. Only exactly one entry can be selected from the group, e.g. for the selection of a basemap. type is always "radio-group". id, label have the same effect as for normal groups. entries can only contain layers (objects or string) (array, default: []).
  • A merge group object. type is always "merge-group". A merge group is a group where entries may only contain layers (objects or string) (array, default: []); these entries are not displayed as subentries in the dialog, but a symbol is created from all layers together. Instead of specifying entries, source-layer (string, default: none) can be specified alternatively; in this case, all layers with this source layer become entries.

For an example, see below.

Options

NameDefaultDescriptionTypeSince
buildingBlock
Always STYLES.
string
v3.1
enabled
false
Enable the building block?
boolean
v3.1
caching
{}
Sets fixed values for HTTP Caching Headers for the resources.
object
v3.1
styleEncodings
[ "Mapbox", "HTML" ]
List of enabled stylesheet encodings. Supported are Mapbox/MapLibre Style (Mapbox), OGC SLD 1.0 (SLD10), OGC SLD 1.1 (SLD11), QGIS QML ("QML"), ArcGIS Layer ("lyr" und "lyrx"), 3D Tiles ("3D Tiles") and HTML (HTML). HTML is an output only encoding for web maps that requires a Mapbox/MapLibre Style stylesheet. For details see conformance classes Mapbox Style, OGC SLD 1.0, OGC SLD 1.1 und HTML. Upcoming change Currently there is no way to disable the defaults Mapbox and HTML. That will be changed in v4, you will then have to repeat the defaults if you want to add additional encodings.
array
v3.1
managerEnabled
false
Option to manage styles using POST, PUT and DELETE. If styleInfosOnCollection is enabled, style information may be created and updated using PATCH. Siehe die Konformitätsklasse "Manage styles".
boolean
v3.1
validationEnabled
false
Option to validate styles when using POST and PUT by setting the header Prefer. For details see conformance class Validation of styles.
boolean
v3.1
useIdFromStylesheet
boolean
v3.1
deriveCollectionStyles
false
Only applies to styles in Mapbox Style format. Controls whether the styles at the collection level should be derived from the styles in the parent style collection. The prerequisite is that the name of the source in the stylesheet corresponds to {apiId} and the name of the source-layer corresponds to {collectionId}. If a style is to be used for displaying features in the FEATURES_HTML building block, the option should be enabled.
boolean
v3.1
webmapWithPopup
true
Option to support popups in web maps for Mapbox Style styles that show attributes for the top-most object.
boolean
v3.1
webmapWithLayerControl
false
Option to support layer controls in web maps for Mapbox Style styles. Allows to collectively enable and disable all layers for a certain feature collection.
boolean
v3.1
layerControlAllLayers
false
Option to support layer controls for additional layers like background maps. Requires webmapWithLayerControl: true.
boolean
v3.1
addBoundsToVectorSource
true
Option to add the bounds property to the vector source in a MapLibre style based on the bounding box of the dataset or collection.
boolean
v3.1
legendEnabled
false
Option to support an endpoint to access the legend of a style.
boolean
v3.1

Examples

Example of the specifications in the configuration file:


- buildingBlock: STYLES
  enabled: true
  styleEncodings:
  - Mapbox
  - HTML
  deriveCollectionStyles: true
  managerEnabled: false
  validationEnabled: false
  webmapWithLayerControl: true

Example MapLibre stylesheet with layer control options


{
  "bearing": 0.0,
  "version": 8,
  "pitch": 0.0,
  "name": "topographic",
  "center": [36.1033, 32.6264],
  "zoom": 12.241790506353492,
  "metadata": {
    "ldproxy:layerControl": {
      "opened": true,
      "entries": [
        {
          "id": "Basemap",
          "type": "radio-group",
          "entries": ["Grey Background", "OSM"]
        },
        {
          "id"         : "Agriculture (Surfaces)",
          "type"       : "merge-group"           ,
          "sourceLayer": "AgricultureSrf"
        },
        {
          "id"         : "Cultural (Points)",
          "type"       : "merge-group"      ,
          "sourceLayer": "CulturePnt"
        },
        {
          "id"         : "Cultural (Surfaces)",
          "type"       : "merge-group"        ,
          "sourceLayer": "CultureSrf"
        },
        {
          "id"         : "Facility (Points)",
          "type"       : "merge-group"      ,
          "sourceLayer": "FacilityPnt"
        },
        {
          "id"         : "Hydrography (Curves)",
          "type"       : "merge-group"         ,
          "sourceLayer": "HydrographyCrv"
        },
        {
          "id"         : "Hydrography (Surfaces)",
          "type"       : "merge-group"           ,
          "sourceLayer": "HydrographySrf"
        },
        {
          "id"         : "Military (Surfaces)",
          "type"       : "merge-group"        ,
          "sourceLayer": "MilitarySrf"
        },
        {
          "id"         : "Settlement (Surfaces)",
          "type"       : "merge-group"          ,
          "sourceLayer": "SettlementSrf"
        },
        {
          "id"         : "Structure (Points)",
          "type"       : "merge-group"       ,
          "sourceLayer": "StructurePnt"
        },
        {
          "id": "Transportation - Ground (Curves)",
          "type": "group",
          "entries": [
            {
              "id": "National Road",
              "type": "merge-group",
              "entries": [
                {"id": "transportationgroundcrv.3", "zoom": 8},
                {"id": "transportationgroundcrv.4", "zoom": 8}
              ]
            },
            {
              "id": "Secondary Road",
              "type": "merge-group",
              "entries": [
                {"id": "transportationgroundcrv.5", "zoom": 8},
                {"id": "transportationgroundcrv.6", "zoom": 8}
              ]
            },
            {
              "id": "Local Road",
              "type": "merge-group",
              "entries": [
                {"id": "transportationgroundcrv.7", "zoom": 8},
                {"id": "transportationgroundcrv.8", "zoom": 8}
              ]
            },
            {
              "id": "Bridge",
              "type": "merge-group",
              "entries": [
                {"id": "transportationgroundcrv.0a", "zoom": 8},
                {"id": "transportationgroundcrv.0b", "zoom": 8}
              ]
            },
            {
              "id": "Railway",
              "type": "merge-group",
              "entries": ["transportationgroundcrv.1", "transportationgroundcrv.2"]
            },
            { "id": "Name", "type": "merge-group", "entries": ["transportationgroundcrv.9"] }
          ]
        },
        {
          "id"         : "Utility Infrastructure (Points)",
          "type"       : "merge-group"                    ,
          "sourceLayer": "UtilityInfrastructurePnt"
        },
        {
          "id"         : "Utility Infrastructure (Curves)",
          "type"       : "merge-group"                    ,
          "sourceLayer": "UtilityInfrastructureCrv"
        },
        {
          "id"         : "Vegetation (Surfaces)",
          "type"       : "merge-group"          ,
          "sourceLayer": "VegetationSrf"
        }
      ]
    }
  },
  "sources": {
    "daraa": {
      "type": "vector",
      "tiles": ["{serviceUrl}/tiles/WebMercatorQuad/{z}/{y}/{x}?f=mvt"],
      "maxzoom": 16
    },
    "osm": {
      "type": "raster",
      "tiles": [
        "https://a.tile.openstreetmap.org/{z}/{x}/{y}.png",
        "https://b.tile.openstreetmap.org/{z}/{x}/{y}.png",
        "https://c.tile.openstreetmap.org/{z}/{x}/{y}.png"
      ],
      "tileSize": 256,
      "attribution": "&copy;<a href=\"http://osm.org/copyright\"> OpenStreetMap</a>contributors"
    }
  },
  "sprite": "{serviceUrl}/resources/sprites",
  "glyphs": "https://go-spatial.github.io/carto-assets/fonts/{fontstack}/{range}.pbf",
  "layers": [
    {
      "id": "Grey Background",
      "type": "background",
      "layout": {"visibility": "visible"},
      "paint": {"background-color": "#d3d3d3"}
    },
    {
      "id": "OSM",
      "type": "raster",
      "source": "osm",
      "layout": {"visibility": "none"}
    },
    {
      "type": "fill",
      "source-layer": "AgricultureSrf",
      "paint": {"fill-color": "#7ac5a5"},
      "id": "agriculturesrf",
      "source": "daraa"
    },
    {
      "type": "fill",
      "source-layer": "VegetationSrf",
      "paint": {"fill-color": "#C2E4B9"},
      "id": "vegetationsrf",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "SettlementSrf",
      "paint": {"line-color": "#000000", "line-width": 2},
      "id": "settlementsrf.1",
      "source": "daraa"
    },
    {
      "type": "fill",
      "source-layer": "SettlementSrf",
      "paint": {"fill-color": "#E8C3B2"},
      "id": "settlementsrf.2",
      "source": "daraa"
    },
    {
      "type": "fill",
      "source-layer": "MilitarySrf",
      "paint": {"fill-color": "#f3602f", "fill-opacity": 0.5},
      "id": "militarysrf",
      "source": "daraa"
    },
    {
      "type": "fill",
      "source-layer": "CultureSrf",
      "paint": {"fill-color": "#ab92d2", "fill-opacity": 0.5},
      "id": "culturesrf",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "HydrographyCrv",
      "filter": [ "==", "BH140", ["get", "F_CODE"] ],
      "paint": {
        "line-color": "#00A0C6",
        "line-width": [ "step", ["zoom"], 1, 8, 2, 13, 4 ]
      },
      "id": "hydrographycrv",
      "source": "daraa"
    },
    {
      "type": "fill",
      "source-layer": "HydrographySrf",
      "filter": [ "==", "BH082", ["get", "F_CODE"] ],
      "paint": {"fill-color": "#B0E1ED", "fill-outline-color": "#00A0C6"},
      "id": "hydrographysrf",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AN010", ["get", "F_CODE"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {"line-color": "#404040", "line-width": 4},
      "id": "transportationgroundcrv.1",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AN010", ["get", "F_CODE"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {
        "line-color": "#ffffff",
        "line-dasharray": [6, 6],
        "line-width": 2
      },
      "id": "transportationgroundcrv.2",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AQ040", ["get", "F_CODE"] ],
        [ "==", 13, ["get", "TRS"] ]
      ],
      "layout": {"line-join": "round"},
      "paint": {
        "line-color": "#000000",
        "line-width": [ "step", ["zoom"], 1, 8, 9, 13, 20 ]
      },
      "id": "transportationgroundcrv.0a",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AQ040", ["get", "F_CODE"] ],
        [ "==", 13, ["get", "TRS"] ]
      ],
      "layout": {"line-join": "round"},
      "paint": {
        "line-color": "#ffffff",
        "line-width": [ "step", ["zoom"], 1, 8, 6, 13, 14 ]
      },
      "id": "transportationgroundcrv.0b",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AP030", ["get", "F_CODE"] ],
        [ "==", 3, ["get", "RIN_ROI"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {
        "line-color": "#000000",
        "line-width": [ "step", ["zoom"], 1, 8, 5, 13, 12 ]
      },
      "id": "transportationgroundcrv.3",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AP030", ["get", "F_CODE"] ],
        [ "==", 4, ["get", "RIN_ROI"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {
        "line-color": "#000000",
        "line-width": [ "step", ["zoom"], 1, 8, 5, 13, 12 ]
      },
      "id": "transportationgroundcrv.5",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AP030", ["get", "F_CODE"] ],
        [ "==", 5, ["get", "RIN_ROI"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {
        "line-color": "#000000",
        "line-width": [ "step", ["zoom"], 1, 8, 3.5, 13, 9 ]
      },
      "id": "transportationgroundcrv.7",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AP030", ["get", "F_CODE"] ],
        [ "==", 5, ["get", "RIN_ROI"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {
        "line-color": "#ffffff",
        "line-width": [ "step", ["zoom"], 1, 8, 2, 13, 6 ]
      },
      "id": "transportationgroundcrv.8",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AP030", ["get", "F_CODE"] ],
        [ "==", 4, ["get", "RIN_ROI"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {
        "line-color": "#cb171a",
        "line-width": [ "step", ["zoom"], 1, 8, 3, 13, 8 ]
      },
      "id": "transportationgroundcrv.6",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "TransportationGroundCrv",
      "filter": [
        "all",
        [ "==", "AP030", ["get", "F_CODE"] ],
        [ "==", 3, ["get", "RIN_ROI"] ]
      ],
      "layout": {"line-join": "round", "line-cap": "round"},
      "paint": {
        "line-color": "#ff0000",
        "line-width": [ "step", ["zoom"], 1, 8, 3, 13, 8 ]
      },
      "id": "transportationgroundcrv.4",
      "source": "daraa"
    },
    {
      "type": "symbol",
      "source-layer": "TransportationGroundCrv",
      "filter": [ "!=", "No Information", ["get", "ZI005_FNA"] ],
      "layout": {
        "text-field": "{ZI005_FNA}",
        "text-size": 10,
        "text-font": ["Metropolis Bold"],
        "symbol-placement": "line"
      },
      "paint": {
        "text-halo-color": "#ffffff",
        "text-halo-width": 2,
        "text-color": "#000000"
      },
      "id": "transportationgroundcrv.9",
      "source": "daraa"
    },
    {
      "type": "line",
      "source-layer": "UtilityInfrastructureCrv",
      "filter": [ "==", "AT005", ["get", "F_CODE"] ],
      "paint": {
        "line-color": "#473895",
        "line-width": [ "step", ["zoom"], 1, 8, 1, 13, 4 ]
      },
      "id": "utilityinfrastructurecrv",
      "source": "daraa"
    },
    {
      "type": "symbol",
      "source-layer": "CulturePnt",
      "layout": {"icon-image": "mosque_b", "icon-size": 0.4},
      "paint": {"icon-opacity": 1},
      "id": "culturepnt",
      "source": "daraa"
    },
    {
      "type": "symbol",
      "source-layer": "StructurePnt",
      "filter": [ "!=", "No Information", ["get", "ZI005_FNA"] ],
      "layout": {
        "icon-image": "square",
        "icon-size": 0.15,
        "text-field": "{ZI005_FNA}",
        "text-size": 14,
        "text-offset": [0, 1.5],
        "text-font": ["Metropolis Bold"]
      },
      "paint": {
        "icon-opacity": 1,
        "text-halo-color": "#ffffff",
        "text-halo-width": 2,
        "text-color": "#000000"
      },
      "id": "structurepnt",
      "source": "daraa"
    },
    {
      "type": "circle",
      "source-layer": "UtilityInfrastructurePnt",
      "paint": {
        "circle-radius": 3,
        "circle-opacity": 0.5,
        "circle-stroke-color": "#000000",
        "circle-stroke-width": 1,
        "circle-color": "#ffffff"
      },
      "id": "utilityinfrastructurepnt",
      "source": "daraa"
    },
    {
      "type": "symbol",
      "source-layer": "FacilityPnt",
      "layout": {"icon-image": "circle_b", "icon-size": 0.2},
      "paint": {"icon-opacity": 1},
      "id": "facilitypnt",
      "source": "daraa"
    }
  ]
}

Example style information file


{
  "title" : "topographic",
  "links" : [ {
    "rel" : "self",
    "type" : "application/json",
    "title" : "This document",
    "href" : "https://demo.ldproxy.net/daraa/styles/topographic/metadata?f=json"
  }, {
    "rel" : "alternate",
    "type" : "text/html",
    "title" : "This document as HTML",
    "href" : "https://demo.ldproxy.net/daraa/styles/topographic/metadata?f=html"
  } ],
  "id" : "topographic",
  "scope" : "style",
  "stylesheets" : [ {
    "title" : "Mapbox",
    "version" : "8",
    "specification" : "https://docs.mapbox.com/mapbox-gl-js/style-spec/",
    "native" : true,
    "link" : {
      "rel" : "stylesheet",
      "type" : "application/vnd.mapbox.style+json",
      "title" : "Style in format 'Mapbox'",
      "href" : "https://demo.ldproxy.net/daraa/styles/topographic?f=mbs"
    }
  } ],
  "layers" : [ {
    "id" : "background"
  }, {
    "id" : "agriculturesrf",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/AgricultureSrf/items"
    }
  }, {
    "id" : "vegetationsrf",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/VegetationSrf/items"
    }
  }, {
    "id" : "settlementsrf.1",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/SettlementSrf/items"
    }
  }, {
    "id" : "settlementsrf.2",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/SettlementSrf/items"
    }
  }, {
    "id" : "militarysrf",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/MilitarySrf/items"
    }
  }, {
    "id" : "culturesrf",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/CultureSrf/items"
    }
  }, {
    "id" : "hydrographycrv",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/HydrographyCrv/items"
    }
  }, {
    "id" : "hydrographysrf",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/HydrographySrf/items"
    }
  }, {
    "id" : "transportationgroundcrv.0a",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.0b",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.1",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.2",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.3",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.4",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.5",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.6",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.7",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.8",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "transportationgroundcrv.9",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/TransportationGroundCrv/items"
    }
  }, {
    "id" : "utilityinfrastructurecrv",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/UtilityInfrastructureCrv/items"
    }
  }, {
    "id" : "culturepnt",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/CulturePnt/items"
    }
  }, {
    "id" : "structurepnt",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/StructurePnt/items"
    }
  }, {
    "id" : "utilityinfrastructurepnt",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/UtilityInfrastructurePnt/items"
    }
  }, {
    "id" : "facilitypnt",
    "type" : "geometry",
    "sampleData" : {
      "rel" : "start",
      "href" : "https://demo.ldproxy.net/daraa/collections/FacilityPnt/items"
    }
  } ]
}