Style a feature layer

Learn how to use data-driven styling to apply symbol colors and styles to feature layers.

A feature layer is a dataset in a feature service hosted in ArcGIS. Each feature layer contains features with a single geometry type (point, line, or polygon), and a set of attributes. Layers in OpenLayers can contain style functions, which use attribute values to change the appearance of features. This allows you to create complex, data-driven visualizations by relating visual variables to data attributes.

In this tutorial, you apply different styles to enhance the visualization of the Trailheads, Trails and Parks and Open Spaces feature layers.

Prerequisites

You need an ArcGIS account to access the developer dashboard and create an API key.

Steps

Create a new pen

  1. To get started, either complete the Display a map tutorial or .

Set the API key

To access location services, you need an API key or OAuth 2.0 access token.

  1. Go to your dashboard to get an API key. The API key must be scoped to access the services used in this tutorial.

  2. In CodePen, update apiKey to use your key.

    Change line
        
    1
    2
    3
    4
    const apiKey = "YOUR_API_KEY";
    const basemapId = "ArcGIS:Streets";
    const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
    olms(map, basemapURL);
    

Style trailheads with a hiker image and labels

A Style in OpenLayers has several possible components: an image, text, stroke, fill and so on. To display a hiker icon for the trailheads layer, you use an Icon style as the image component. Specify which image file as the src, and the size as the scale parameter.

To display the trailhead name, you use a Text style. Use a left value for textAlign with an offsetX of 10 to display the labels to the right of the icons. Use Fill and Stroke styles as the fill and stroke properties to give the labels white text with a teal outline. The font property is a CSS font definition. Since the label for each trailhead is different, use a function to return a Style for a given feature. Set the text property using feature's TRL_NAME attribute.

  1. Add a map load handler to the olms initialization. Inside, create a trailheadStyle function that takes a feature and returns a Style containing an Icon style. Use http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png for the src and set a scale of 25%.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
    
          olms(map, basemapURL).then(function (map) {
    
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                }),
    
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
          });
        </script>
    
      </body>
    </html>
  2. Add a Text style to display labels with white text, teal outline, in an italic sans-serif font. Set the text property using the feature's TRL_NAME attribute.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                }),
    
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  }),
    
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
                  })
                })
              });
            };
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>

Add the Trailheads feature layer to the map

Use a Vector layer with a Vector source to display the trailheads.

For more information about adding feature layers using GeoJSON, see the Add a feature layer as GeoJSON tutorial.

  1. Add a Vector layer with a Vector source to load and display the trailheads feature layer. Set declutter to be true to prevent label overlap. Pass the trailheadsStyle function as the style property. Use map.addLayer to add this layer to the map.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
                  })
                })
              });
            };
    
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              trailheadsLayerName +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              }),
    
              style: trailheadStyle,
              declutter: true
            });
            map.addLayer(trailheadsLayer);
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>
  2. At the top right, click Run to test your map. You should see hiker icons and trailhead labels.

Style trail width by elevation gain

To visualize the elevation gain of a trail you can use the width of a Stroke style. To do this, create another function which returns a Style. The width of the style's stroke property will be a calculation converting feet of elevation gain to pixels of width.

  1. Create a trailStyle function that takes a feature and returns a Style with a Stroke style. Set the color to pink, and calculate the width property from the feature's ELEV_GAIN attribute.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            });
            map.addLayer(trailheadsLayer);
    
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
                })
              });
            };
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>
  2. Add the Trails feature layer as a Vector layer with a GeoJSON Vector source. Pass your trailStyle function as the style property. Use insertAt to add this layer below the trailheads layer.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
                })
              });
            };
    
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              trailsLayerName +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              }),
    
              style: trailStyle
            });
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>
  3. At the top right, click Run to test your map. You should see the hiking trails in pink with thicker lines for those with more elevation gain.

Add a filtered bike-only trails layer

To dipslay bike-only trails, you can add another style function to display a dashed line for trails that allow biking. You can display a dashed line by passing an array of alternating stroke and gap segments length as the lineDash property in a Stroke style.

The same source from the trailsLayer can be used.

  1. Create a bikeTrailsStyle function. If the feature has a Yes value for USE_BIKE, return a white dashed Stroke style. Otherwise, do not return a Style, so the feature will not be displayed.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            });
            map.getLayers().insertAt(1, trailsLayer);
    
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
    
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
                  })
                });
              }
            };
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>
  2. Add a bikeTrailsLayer using the source from trailsLayer, with the bikeTrailsStyle function. Insert the layer above the trailsLayer.

    Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
                  })
                });
              }
            };
    
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            });
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>
  3. At the top right, click Run to test your map. You should now see the bike-accessible trails with a dashed line.

Style a polygon layer

You can use color to communicate the category of a feature, such as the type of a park or open space. Use a style function to returns a Fill style, in which you derive the color property from the feature's TYPE property.

  1. Create a parksStyle function which returns a Fill style. Look up the feature's TYPE attribute in a table to give a different color for Natural Areas, Regionla Open Space, Local Park and Regional Recreation Park. If the type is not one of these, make the color transparent.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            });
            map.getLayers().insertAt(2, bikeTrailsLayer);
    
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              };
    
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
                })
              });
            };
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              opacity: 0.2,
              style: parksStyle
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>
  2. Create a Vector layer with a Vector source for the parks feature layer. Pass your parksStyle function as the style property, with a low opacity. Insert the parks layer below the trails layers.

    Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.Add line.
                                                                                                                                                                              
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
        <title>OpenLayers Tutorials: Style feature layers</title>
    
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
        </style>
    
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/css/ol.css" type="text/css" />
        <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.4.3/build/ol.js"></script>
        <script src="https://cdn.jsdelivr.net/npm/ol-mapbox-style@6.1.4/dist/olms.js" type="text/javascript"></script>
    
    
      </head>
      <body>
        <div id="map"></div>
    
        <script>
          const apiKey = "YOUR_API_KEY";
          const map = new ol.Map({
            target: "map"
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
          const basemapId = "ArcGIS:Streets";
          const basemapURL = "https://basemaps-api.arcgis.com/arcgis/rest/services/styles/" + basemapId + "?type=style&token=" + apiKey;
          olms(map, basemapURL).then(function (map) {
            const trailheadStyle = function (feature) {
              return new ol.style.Style({
                image: new ol.style.Icon({
                  src: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png",
                  scale: 0.25
                text: new ol.style.Text({
                  text: feature.get("TRL_NAME"),
                  font: "italic 12px sans-serif",
                  offsetX: 10,
                  textAlign: "left",
                  fill: new ol.style.Fill({
                    color: "#FFFFFF"
                  stroke: new ol.style.Stroke({
                    color: "#5E8D74",
                    width: 3
            const trailheadsLayerName = "Trailheads";
            const trailheadsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailheadsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailheadsLayerURL
              style: trailheadStyle,
              declutter: true
            const trailStyle = function (feature) {
              return new ol.style.Style({
                stroke: new ol.style.Stroke({
                  color: "#BA55D3",
                  width: 3 + (4 * feature.get("ELEV_GAIN")) / 2300
            const trailsLayerName = "Trails";
            const trailsLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const trailsLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: trailsLayerURL
              style: trailStyle
            map.getLayers().insertAt(1, trailsLayer);
            const bikeTrailsStyle = function (feature) {
              if (feature.get("USE_BIKE") === "Yes") {
                return new ol.style.Style({
                  stroke: new ol.style.Stroke({
                    lineDash: [1, 4],
                    color: "white",
                    width: 2
            const bikeTrailsLayer = new ol.layer.Vector({
              source: trailsLayer.getSource(),
              style: bikeTrailsStyle
            map.getLayers().insertAt(2, bikeTrailsLayer);
            const parksStyle = function (feature) {
              const type = feature.get("TYPE");
              const colorTable = {
                "Natural Areas": "#9E559C",
                "Regional Open Space": "#A7C636",
                "Local Park": "#149ECE",
                "Regional Recreation Park": "#ED5151"
              return new ol.style.Style({
                fill: new ol.style.Fill({
                  color: colorTable[feature.get("TYPE")] || "transparent"
                })
              });
            };
    
            const parksLayerName = "Parks_and_Open_Space";
            const parksLayerURL =
              "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/" +
              parksLayerName +
              "/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=true&f=pgeojson";
            const parksLayer = new ol.layer.Vector({
              source: new ol.source.Vector({
                format: new ol.format.GeoJSON(),
                url: parksLayerURL
              }),
              opacity: 0.2,
              style: parksStyle
            });
            map.getLayers().insertAt(1, parksLayer);
        </script>
    
      </body>
    </html>

Run the app

In CodePen, run your code to display the map.

You should now see parks of different colors, beneath the trails and trailhead layers.

What's next?

Learn how to use additional ArcGIS location services in these tutorials:

Your browser is no longer supported. Please upgrade your browser for the best experience. See our browser deprecation post for more details.