Filter symbols by toggling a list
Filter a set of symbols based on a property value in the data.<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.3.css" /> <script src="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.3.js"></script> <style> body { margin: 0; padding: 0; } html,body,#map { height: 100%; } .filter-group { font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif; font-weight: 600; position: absolute; top: 10px; right: 10px; z-index: 1; border-radius: 3px; width: 120px; color: #fff; } .filter-group input[type='checkbox']:first-child + label { border-radius: 3px 3px 0 0; } .filter-group label:last-child { border-radius: 0 0 3px 3px; border: none; } .filter-group input[type='checkbox'] { display: none; } .filter-group input[type='checkbox'] + label { background-color: #3386c0; display: block; cursor: pointer; padding: 10px; border-bottom: 1px solid rgba(0, 0, 0, 0.25); } .filter-group input[type='checkbox'] + label { background-color: #3386c0; text-transform: capitalize; } .filter-group input[type='checkbox'] + label:hover, .filter-group input[type='checkbox']:checked + label { background-color: #4ea0da; } .filter-group input[type='checkbox']:checked + label:before { content: '✔'; margin-right: 5px; } </style> </head> <body> <div id="map"></div> <div id="filter-group" class="filter-group"></div> <script> const places = { type: 'FeatureCollection', features: [ { type: 'Feature', properties: { icon: 'theatre', }, geometry: { type: 'Point', coordinates: [-77.038659, 38.931567], }, }, { type: 'Feature', properties: { icon: 'theatre', }, geometry: { type: 'Point', coordinates: [-77.003168, 38.894651], }, }, { type: 'Feature', properties: { icon: 'bar', }, geometry: { type: 'Point', coordinates: [-77.090372, 38.881189], }, }, { type: 'Feature', properties: { icon: 'bicycle', }, geometry: { type: 'Point', coordinates: [-77.052477, 38.943951], }, }, { type: 'Feature', properties: { icon: 'music', }, geometry: { type: 'Point', coordinates: [-77.031706, 38.914581], }, }, { type: 'Feature', properties: { icon: 'music', }, geometry: { type: 'Point', coordinates: [-77.020945, 38.878241], }, }, { type: 'Feature', properties: { icon: 'music', }, geometry: { type: 'Point', coordinates: [-77.007481, 38.876516], }, }, ], }; const filterGroup = document.getElementById('filter-group'); TrimbleMaps.setAPIKey('YOUR_API_KEY_HERE'); const map = new TrimbleMaps.Map({ container: 'map', style: TrimbleMaps.Common.Style.TRANSPORTATION, center: [-77.04, 38.907], zoom: 11.15, }); map.on('load', () => { // Add a GeoJSON source containing place coordinates and information. map.addSource('places', { 'type': 'geojson', 'data': places }); places.features.forEach((feature) => { const symbol = feature.properties['icon']; const layerID = `poi-${symbol}`; // Add a layer for this symbol type if it hasn't been added already. if (!map.getLayer(layerID)) { map.addLayer({ 'id': layerID, 'type': 'symbol', 'source': 'places', 'layout': { 'icon-image': `${symbol}_15`, 'icon-overlap': 'always' }, 'filter': ['==', 'icon', symbol] }); // Add checkbox and label elements for the layer. const input = document.createElement('input'); input.type = 'checkbox'; input.id = layerID; input.checked = true; filterGroup.appendChild(input); const label = document.createElement('label'); label.setAttribute('for', layerID); label.textContent = symbol; filterGroup.appendChild(label); // When the checkbox changes, update the visibility of the layer. input.addEventListener('change', (e) => { map.setLayoutProperty( layerID, 'visibility', e.target.checked ? 'visible' : 'none' ); }); } }); }); </script> </body> </html>
Filter symbols by toggling a list
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.3.css" /> <script src="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.3.js"></script> <style> body { margin: 0; padding: 0; } html,body,#map { height: 100%; } .filter-group { font: 12px/20px 'Helvetica Neue', Arial, Helvetica, sans-serif; font-weight: 600; position: absolute; top: 10px; right: 10px; z-index: 1; border-radius: 3px; width: 120px; color: #fff; } .filter-group input[type='checkbox']:first-child + label { border-radius: 3px 3px 0 0; } .filter-group label:last-child { border-radius: 0 0 3px 3px; border: none; } .filter-group input[type='checkbox'] { display: none; } .filter-group input[type='checkbox'] + label { background-color: #3386c0; display: block; cursor: pointer; padding: 10px; border-bottom: 1px solid rgba(0, 0, 0, 0.25); } .filter-group input[type='checkbox'] + label { background-color: #3386c0; text-transform: capitalize; } .filter-group input[type='checkbox'] + label:hover, .filter-group input[type='checkbox']:checked + label { background-color: #4ea0da; } .filter-group input[type='checkbox']:checked + label:before { content: '✔'; margin-right: 5px; } </style> </head> <body> <div id="map"></div> <div id="filter-group" class="filter-group"></div> <script> const places = { type: 'FeatureCollection', features: [ { type: 'Feature', properties: { icon: 'theatre', }, geometry: { type: 'Point', coordinates: [-77.038659, 38.931567], }, }, { type: 'Feature', properties: { icon: 'theatre', }, geometry: { type: 'Point', coordinates: [-77.003168, 38.894651], }, }, { type: 'Feature', properties: { icon: 'bar', }, geometry: { type: 'Point', coordinates: [-77.090372, 38.881189], }, }, { type: 'Feature', properties: { icon: 'bicycle', }, geometry: { type: 'Point', coordinates: [-77.052477, 38.943951], }, }, { type: 'Feature', properties: { icon: 'music', }, geometry: { type: 'Point', coordinates: [-77.031706, 38.914581], }, }, { type: 'Feature', properties: { icon: 'music', }, geometry: { type: 'Point', coordinates: [-77.020945, 38.878241], }, }, { type: 'Feature', properties: { icon: 'music', }, geometry: { type: 'Point', coordinates: [-77.007481, 38.876516], }, }, ], }; const filterGroup = document.getElementById('filter-group'); TrimbleMaps.setAPIKey('YOUR_API_KEY_HERE'); const map = new TrimbleMaps.Map({ container: 'map', style: TrimbleMaps.Common.Style.TRANSPORTATION, center: [-77.04, 38.907], zoom: 11.15, }); map.on('load', () => { // Add a GeoJSON source containing place coordinates and information. map.addSource('places', { 'type': 'geojson', 'data': places }); places.features.forEach((feature) => { const symbol = feature.properties['icon']; const layerID = `poi-${symbol}`; // Add a layer for this symbol type if it hasn't been added already. if (!map.getLayer(layerID)) { map.addLayer({ 'id': layerID, 'type': 'symbol', 'source': 'places', 'layout': { 'icon-image': `${symbol}_15`, 'icon-overlap': 'always' }, 'filter': ['==', 'icon', symbol] }); // Add checkbox and label elements for the layer. const input = document.createElement('input'); input.type = 'checkbox'; input.id = layerID; input.checked = true; filterGroup.appendChild(input); const label = document.createElement('label'); label.setAttribute('for', layerID); label.textContent = symbol; filterGroup.appendChild(label); // When the checkbox changes, update the visibility of the layer. input.addEventListener('change', (e) => { map.setLayoutProperty( layerID, 'visibility', e.target.checked ? 'visible' : 'none' ); }); } }); }); </script> </body> </html>