Change the basemap style

Learn how to change a basemap style in a map using the basemap styles service.

The basemap styles service provides a number basemap layer styles such as topography, streets, outdoor, navigation, and imagery that you can use in maps.

In this tutorial, you use a <select> dropdown menu with ol-mapbox-style to toggle between a number of different basemap layer styles.

Prerequisites

You need an ArcGIS Location Platform or ArcGIS Online account.

Steps

Create a new pen

  1. To get started, you can complete the Display a map tutorial or use the .

Get an access token

You need an access token with the correct privileges to access the resources used in this tutorial.

  1. Go to the Create an API key tutorial and create an API key with the following privilege(s):

    • Privileges
      • Location services > Basemaps
  2. Copy the API key access token to your clipboard when prompted.

  3. In CodePen, update the accessToken variable to use your access token.

    Use dark colors for code blocks
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const accessToken = "YOUR_ACCESS_TOKEN";
    const basemapId = "arcgis/outdoor";
    const basemapURL = `https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/${basemapId}?token=${accessToken}`;
    olms.apply(map, basemapURL);
    
  4. Run the code to ensure the basemap is displayed in the map.

To learn about the other types of authentication available, go to Types of authentication.

Remove basemap references

  1. Remove the basemapId, basemapURL, and the olms function.

    Expand
    Use dark colors for code blocks
    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
        <script>
    
          const map = new ol.Map({ target: "map" });
    
          map.setView(
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
            })
          );
    
          const accessToken = "YOUR_ACCESS_TOKEN";
    
          const basemapId = "arcgis/outdoor";
    
          const basemapURL = `https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles/${basemapId}?token=${accessToken}`;
    
          olms.apply(map, basemapURL)
    
            .then(() => {
            // Add Esri attribution
            // Learn more in https://esriurl.com/attribution
              const source = map.getLayers().item(0).getSource();
              source.setAttributions("Powered by <a href='https://www.esri.com/en-us/home' target='_blank'>Esri</a> | ")
    
          });
    
        </script>
    
    Expand

Add a basemap selector

OpenLayers does not have a basemap layer switching widget, so you will use the a plain HTML <select> element.

  1. In the <head> tag, add CSS that will position the <select> menu wrapper element in the upper right corner and provide styling.

    Expand
    Use dark colors for code blocks
    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
        <style>
          html,
          body,
          #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
            font-family: Arial, Helvetica, sans-serif;
            font-size: 14px;
            color: #323232;
          }
    
          #basemaps-wrapper {
            position: absolute;
            top: 20px;
            right: 20px;
          }
          #basemaps {
            font-size: 16px;
            padding: 4px 8px;
          }
    
        </style>
    
    Expand
  2. In the <body> element, add the wrapper tag with an id of basemaps-wrapper.

    Expand
    Use dark colors for code blocks
    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
      <body>
        <div id="map"></div>
    
        <div id="basemaps-wrapper">
    
        </div>
    
    Expand
  3. In the wrapper element, add a <select> element with basemap layer enumerations and labels.

    Expand
    Use dark colors for code blocks
    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
        <div id="basemaps-wrapper">
    
            <select id="basemaps">
              <option value="arcgis/outdoor">arcgis/outdoor</option>
              <option value="arcgis/community">arcgis/community</option>
              <option value="arcgis/navigation">arcgis/navigation</option>
              <option value="arcgis/streets">arcgis/streets</option>
              <option value="arcgis/streets-relief">arcgis/streets-relief</option>
              <option value="arcgis/imagery">arcgis/imagery</option>
              <option value="arcgis/oceans">arcgis/oceans</option>
              <option value="arcgis/topographic">arcgis/topographic</option>
              <option value="arcgis/light-gray">arcgis/light-gray</option>
              <option value="arcgis/dark-gray">arcgis/dark-gray</option>
              <option value="arcgis/human-geography">arcgis/human-geography</option>
              <option value="arcgis/charted-territory">arcgis/charted-territory</option>
              <option value="arcgis/nova">arcgis/nova</option>
              <option value="osm/standard">osm/standard</option>
              <option value="osm/navigation">osm/navigation</option>
              <option value="osm/streets">osm/streets</option>
              <option value="osm/blueprint">osm/blueprint</option>
            </select>
    
        </div>
    
    Expand

Set the initial basemap layer

When the page loads, initialize the basemap layer to the first option in the menu.

  1. Create a function called url that computes the style service URL for a basemap layer.

    Expand
    Use dark colors for code blocks
    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
        <script>
    
          const accessToken = "YOUR_ACCESS_TOKEN";
    
          const map = new ol.Map({ target: "map" });
          map.setView(
            new ol.View({
              center: ol.proj.fromLonLat([-118.805, 34.027]),
              zoom: 12
            })
          );
    
          const baseUrl = "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles";
          const url = (style) => `${baseUrl}/${style}?token=${accessToken}`;
    
    Expand
  2. Create a function called setBasemap that will clear existing layers and use olms to instantiate a basemap layer by name.

    Expand
    Use dark colors for code blocks
    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
          const baseUrl = "https://basemapstyles-api.arcgis.com/arcgis/rest/services/styles/v2/styles";
          const url = (style) => `${baseUrl}/${style}?token=${accessToken}`;
    
          const setBasemap = (style) => {
            // Clear out existing layers.
            map.setLayerGroup(new ol.layer.Group());
    
            // Instantiate the given basemap layer.
            olms.apply(map, url(style)).then(() => {
    
              // Add Esri attribution
              // Learn more in https://esriurl.com/attribution
              const source = map.getLayers().item(0).getSource();
              source.setAttributions("Powered by <a href='https://www.esri.com/en-us/home' target='_blank'>Esri</a> | ")
    
            });
          };
    
    Expand
  3. Call setBasemap to initialize the basemap layer to the arcgis/outdoor enumeration to match the first basemap in the select element.

    Expand
    Use dark colors for code blocks
    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
          const setBasemap = (style) => {
            // Clear out existing layers.
            map.setLayerGroup(new ol.layer.Group());
    
            // Instantiate the given basemap layer.
            olms.apply(map, url(style)).then(() => {
    
              // Add Esri attribution
              // Learn more in https://esriurl.com/attribution
              const source = map.getLayers().item(0).getSource();
              source.setAttributions("Powered by <a href='https://www.esri.com/en-us/home' target='_blank'>Esri</a> | ")
    
            });
          };
    
          setBasemap("arcgis/outdoor");
    
    Expand

Set the selected basemap layer

Call setBasemap when the user selects an option in the <select> menu.

  1. Extract the <select> DOM element using document.querySelector.

    Expand
    Use dark colors for code blocks
    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
          setBasemap("arcgis/outdoor");
    
          const basemapsSelectElement = document.querySelector("#basemaps");
    
    Expand
  2. Call setBasemap in response to change events on the <select> element.

    Expand
    Use dark colors for code blocks
    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
          const basemapsSelectElement = document.querySelector("#basemaps");
    
          basemapsSelectElement.addEventListener("change", (e) => {
            setBasemap(e.target.value);
          });
    
    Expand

Run the app

In CodePen, run your code to display the map.

Use the layer switcher menu at the top right to select and explore different basemap layer styles.

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.