Examples
Layers (32)
Display buildings in 3DExtrude polygons for 3D indoor mappingAdd a 3D modelAdjust a layer's opacityAnimate a lineAnimate a series of imagesAnimate a pointChange building color based on zoom levelChange the case of labelsDisplay HTML clusters with custom propertiesCreate and style clustersChange a layer's color with buttonsAdd a custom style layerStyle circles with a data-driven propertyStyle lines with a data-driven propertyDisplay and style rich text labelsUse a fallback imageAdd a pattern to a polygonAdd a new layer below labelsAdd a GeoJSON lineDraw GeoJSON pointsAdd hillshadingCreate a heatmap layerCreate a gradient line using an expressionAdd multiple geometries from one GeoJSON sourceStyle ocean depth dataShow and hide layersUpdate a choropleth layer by zoom levelChange worldview of administrative boundariesVariable label placementVisualize population densityAdd a GeoJSON polygon

Join local JSON data with vector tile geometries

Style a choropleth by merging local JSON data with vector tile geometries.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Join local JSON data with vector tile geometries</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
<script src="https://api.mapbox.com/mapbox-gl-js/v1.6.1/mapbox-gl.js"></script>
<link href="https://api.mapbox.com/mapbox-gl-js/v1.6.1/mapbox-gl.css" rel="stylesheet" />
<style>
body { margin: 0; padding: 0; }
#map { position: absolute; top: 0; bottom: 0; width: 100%; };
</style>
</head>
<body>
<div id="map"></div>
<script>
mapboxgl.accessToken = '<your access token here>';
var map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/light-v10',
center: [-99.9, 41.5],
zoom: 1
});
// Join local JSON data with vector tile geometry
// USA unemployment rate in 2009
// Source https://data.bls.gov/timeseries/LNS14000000
var maxValue = 13;
var data = [
{ 'STATE_ID': '01', 'unemployment': 13.17 },
{ 'STATE_ID': '02', 'unemployment': 9.5 },
{ 'STATE_ID': '04', 'unemployment': 12.15 },
{ 'STATE_ID': '05', 'unemployment': 8.99 },
{ 'STATE_ID': '06', 'unemployment': 11.83 },
{ 'STATE_ID': '08', 'unemployment': 7.52 },
{ 'STATE_ID': '09', 'unemployment': 6.44 },
{ 'STATE_ID': '10', 'unemployment': 5.17 },
{ 'STATE_ID': '12', 'unemployment': 9.67 },
{ 'STATE_ID': '13', 'unemployment': 10.64 },
{ 'STATE_ID': '15', 'unemployment': 12.38 },
{ 'STATE_ID': '16', 'unemployment': 10.13 },
{ 'STATE_ID': '17', 'unemployment': 9.58 },
{ 'STATE_ID': '18', 'unemployment': 10.63 },
{ 'STATE_ID': '19', 'unemployment': 8.09 },
{ 'STATE_ID': '20', 'unemployment': 5.93 },
{ 'STATE_ID': '21', 'unemployment': 9.86 },
{ 'STATE_ID': '22', 'unemployment': 9.81 },
{ 'STATE_ID': '23', 'unemployment': 7.82 },
{ 'STATE_ID': '24', 'unemployment': 8.35 },
{ 'STATE_ID': '25', 'unemployment': 9.1 },
{ 'STATE_ID': '26', 'unemployment': 10.69 },
{ 'STATE_ID': '27', 'unemployment': 11.53 },
{ 'STATE_ID': '28', 'unemployment': 9.29 },
{ 'STATE_ID': '29', 'unemployment': 9.94 },
{ 'STATE_ID': '30', 'unemployment': 9.29 },
{ 'STATE_ID': '31', 'unemployment': 5.45 },
{ 'STATE_ID': '32', 'unemployment': 4.21 },
{ 'STATE_ID': '33', 'unemployment': 4.27 },
{ 'STATE_ID': '34', 'unemployment': 4.09 },
{ 'STATE_ID': '35', 'unemployment': 7.83 },
{ 'STATE_ID': '36', 'unemployment': 8.01 },
{ 'STATE_ID': '37', 'unemployment': 9.34 },
{ 'STATE_ID': '38', 'unemployment': 11.23 },
{ 'STATE_ID': '39', 'unemployment': 7.08 },
{ 'STATE_ID': '40', 'unemployment': 11.22 },
{ 'STATE_ID': '41', 'unemployment': 6.2 },
{ 'STATE_ID': '42', 'unemployment': 9.11 },
{ 'STATE_ID': '44', 'unemployment': 10.42 },
{ 'STATE_ID': '45', 'unemployment': 8.89 },
{ 'STATE_ID': '46', 'unemployment': 11.03 },
{ 'STATE_ID': '47', 'unemployment': 7.35 },
{ 'STATE_ID': '48', 'unemployment': 8.92 },
{ 'STATE_ID': '49', 'unemployment': 7.65 },
{ 'STATE_ID': '50', 'unemployment': 8.01 },
{ 'STATE_ID': '51', 'unemployment': 7.62 },
{ 'STATE_ID': '53', 'unemployment': 7.77 },
{ 'STATE_ID': '54', 'unemployment': 8.49 },
{ 'STATE_ID': '55', 'unemployment': 9.42 },
{ 'STATE_ID': '56', 'unemployment': 7.59 }
];
map.on('load', function() {
// Add source for state polygons hosted on Mapbox, based on US Census Data:
// https://www.census.gov/geo/maps-data/data/cbf/cbf_state.html
map.addSource('states', {
type: 'vector',
url: 'mapbox://mapbox.us_census_states_2015'
});
var expression = ['match', ['get', 'STATE_ID']];
// Calculate color for each state based on the unemployment rate
data.forEach(function(row) {
var green = (row['unemployment'] / maxValue) * 255;
var color = 'rgba(' + 0 + ', ' + green + ', ' + 0 + ', 1)';
expression.push(row['STATE_ID'], color);
});
// Last value is the default, used where there is no data
expression.push('rgba(0,0,0,0)');
// Add layer from the vector tile source with data-driven style
map.addLayer(
{
'id': 'states-join',
'type': 'fill',
'source': 'states',
'source-layer': 'states',
'paint': {
'fill-color': expression
}
},
'waterway-label'
);
});
</script>
</body>
</html>
Was this example helpful?