Learn how to use renderers to apply data-driven styling to feature layers.
A feature layer is a dataset within a hosted feature service. Each feature layer consists of features that share a single geometry type (point, line, or polygon), along with a set of attributes. Client-side, feature layers can be styled using a renderer. Renderers use attribute values to apply the appropriate symbols to each feature when the layer is displayed. Additionally, renderers can work with visual variables and expressions to create more complex, data-driven visualizations.
In this tutorial, you will use three different renderers to style three hosted feature layers.
Prerequisites
Steps
Create a new pen
- To get started, either complete the Display a map tutorial or .
Get an access token
You need an access token with the correct privileges to access the location services used in this tutorial.
- Go to the Create an API key tutorial and create an API key with the following privilege(s):
 - Privileges
- Location services > Basemaps
 
 - Item access
- Note: If you are using your own custom data layer for this tutorial, you need to grant the API key credentials access to the layer item. Learn more in Item access privileges.
 
 
- Privileges
- In CodePen, set esrito your access token.Config.api Key Use dark colors for code blocks var esriConfig = { apiKey: "YOUR_ACCESS_TOKEN", };
To learn about other ways to get an access token, go to Types of authentication.
Display a map
Follow the steps in the Display a map tutorial to add a map with the arcgis/topographic basemap layer, centered on Point Dume State Beach, Malibu, California.
Add script and modules
In a new <script at the bottom of the <body, use $arcgis.import() to add the Feature module.
The ArcGIS Maps SDK for JavaScript is available via CDN and npm, but this tutorial is based on CDN. The $arcgis.import global function accepts a module path or array of module paths, and returns a promise that resolves with the requested modules. This function can only be used when working with the CDN; otherwise, use the standard import syntax. To learn more about the SDK's different modules, visit the References page.
    <script type="module">
      const FeatureLayer = await $arcgis.import("@arcgis/core/layers/FeatureLayer.js");
    </script>
Style trailheads (points)
Use the Simple, Picture, and Label classes to style the points with an image, and then define label attributes to display for the Trailheads feature layer.
- 
Create a trailheadsand define it as aRenderer simplerenderer. Set thesymbolproperty to draw a hiker image accessed from itsurl.Use dark colors for code blocks // Define a simple renderer and symbol const trailheadsRenderer = { type: "simple", symbol: { type: "picture-marker", url: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png", width: "18px", height: "18px", }, };
- 
Create a trailheadsand set theLabels symbolproperty to draw a label with theTRL._NAME Use dark colors for code blocks // Define a label for the trailheads const trailheadsLabels = { symbol: { type: "text", color: "#FFFFFF", haloColor: "#5E8D74", haloSize: "2px", font: { size: "12px", family: "Noto Sans", style: "italic", weight: "normal", }, }, labelPlacement: "above-center", labelExpressionInfo: { expression: "$feature.TRL_NAME", }, };
- 
Create a trailheadsFeature. Set theLayer urlproperty to access its URL endpoint. Set therendererandlabelingbefore addingInfo trailheadsto themap. The feature layer will autocast therendererandlabelingto create class instances of the objects.Info Use dark colors for code blocks labelPlacement: "above-center", labelExpressionInfo: { expression: "$feature.TRL_NAME", }, }; // Create the layer and set the renderer const trailheads = new FeatureLayer({ url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads/FeatureServer/0", renderer: trailheadsRenderer, labelingInfo: [trailheadsLabels], });
- 
Use document.queryto get a reference to the Map component, then wait for it to be ready with the viewOnReady method. Then, addSelector() trailheadslayer to the map after the renderer and label definitions.Use dark colors for code blocks <script type="module"> const FeatureLayer = await $arcgis.import("@arcgis/core/layers/FeatureLayer.js"); const viewElement = document.querySelector("arcgis-map"); await viewElement.viewOnReady(); // Define a simple renderer and symbol const trailheadsRenderer = { type: "simple", symbol: { type: "picture-marker", url: "http://static.arcgis.com/images/Symbols/NPS/npsPictograph_0231b.png", width: "18px", height: "18px", }, }; // Define a label for the trailheads const trailheadsLabels = { symbol: { type: "text", color: "#FFFFFF", haloColor: "#5E8D74", haloSize: "2px", font: { size: "12px", family: "Noto Sans", style: "italic", weight: "normal", }, }, labelPlacement: "above-center", labelExpressionInfo: { expression: "$feature.TRL_NAME", }, }; // Create the layer and set the renderer const trailheads = new FeatureLayer({ url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trailheads/FeatureServer/0", renderer: trailheadsRenderer, labelingInfo: [trailheadsLabels], }); viewElement.map.add(trailheads); </script>
- 
View hiker symbols with trailhead names. 
Style trails (lines)
Use the Simple and Visual classes to style trails in the Trails feature layer. Visual variables define the attribute to use to style trails with a greater elevation gain wider compared to trails with smaller elevation changes. This is one form of data-driven visualization.
- 
Create a trailsand define it as aRenderer simplerenderer.Use dark colors for code blocks // Define a unique value renderer and symbols const trailsRenderer = { type: "simple", symbol: { color: "#BA55D3", type: "simple-line", style: "solid", },
- 
In the visualarray, set theVariables fieldtoELEVto determine line width._GAIN Use dark colors for code blocks visualVariables: [ { type: "size", field: "ELEV_GAIN", minDataValue: 0, maxDataValue: 2300, minSize: "3px", maxSize: "7px", }, ], };
- 
Create a trailsFeature. Set theLayer urlto access its URL endpoint.Use dark colors for code blocks // Create the layer and set the renderer const trails = new FeatureLayer({ url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails/FeatureServer/0", renderer: trailsRenderer, opacity: 0.75, });
- 
Add trailslayer to the map. Set therendererandopacityproperties before addingtrailsto the map. The feature layer will autocast therenderera create class instances of the object.Use dark colors for code blocks viewElement.map.add(trails, 0);
- 
View trails of differing widths based on elevation gain. 
Show bike-only trails (lines)
You can use a renderer and definition expression to style a subset of data from a feature layer. To style bike-only trails from the Trails feature layer, use the definition, Simple and Simple classes. The layer is added on top of the existing trails layer.
- 
Create a bikeand define it as aTrails Renderer simplerenderer. Set thesymbolto draw a line that is styled with dots in pink.Use dark colors for code blocks // Add bikes only trails const bikeTrailsRenderer = { type: "simple", symbol: { type: "simple-line", style: "short-dot", color: "#FF91FF", width: "1px", }, };
- 
Create a bikeTrails Featureand set theLayer urlandrendererproperties. Set thedefinition(a SQL where clause) to access bike trails from the Trails feature layer before addingExpression biketo the map.Trails Use dark colors for code blocks const bikeTrails = new FeatureLayer({ url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Trails/FeatureServer/0", renderer: bikeTrailsRenderer, definitionExpression: "USE_BIKE = 'YES'", });
- 
Add bikelayer to the map. The feature layer will autocast theTrails renderera create class instances of the object.Use dark colors for code blocks viewElement.map.add(bikeTrails, 1);
- 
View the location of bike trails in relation to other trails. 
Style open spaces (polygons)
You can use renderers to style feature layer data by unique attribute values. Use the Unique and Simple classes to style polygon features with different fill colors, based on the TYPE attribute in the Parks and Open Spaces feature layer.
- 
Create a createfunction withFill Symbol valueandcoloras parameters. The function will return asolid,simple-fillsymbol for each park type.Use dark colors for code blocks // Add parks with a class breaks renderer and unique symbols function createFillSymbol(value, color) { return { value: value, symbol: { color: color, type: "simple-fill", style: "solid", outline: { style: "none", }, }, label: value, }; }
- 
Create an openand define it asSpaces Renderer unique-value. Set thefieldproperty toTYPE. In theuniquearray, set unique colors for each park type.Value Infos Use dark colors for code blocks const openSpacesRenderer = { type: "unique-value", field: "TYPE", uniqueValueInfos: [ createFillSymbol("Natural Areas", "#9E559C"), createFillSymbol("Regional Open Space", "#A7C636"), createFillSymbol("Local Park", "#149ECE"), createFillSymbol("Regional Recreation Park", "#ED5151"), ], };
- 
Create an openspacesFeature. Set theLayer urlto access its URL endpoint. Set therendererandopacityproperties before addingopenspacesto themap. The feature layer will autocast therendererto create class instances of the object.Use dark colors for code blocks // Create the layer and set the renderer const openspaces = new FeatureLayer({ url: "https://services3.arcgis.com/GVgbJbqm8hXASVYi/arcgis/rest/services/Parks_and_Open_Space/FeatureServer/0", renderer: openSpacesRenderer, opacity: 0.2, });
- 
Add openspaceslayer to the map. The feature layer will autocast therendererto create class instances of the object.Use dark colors for code blocks viewElement.map.add(openspaces, 0);
Run the app
In CodePen, run your code to display the map.
The completed map should display all of the layers with a unique, data-driven style.
What's next?
Learn how to use additional SDK features and ArcGIS services in these tutorials: