Map Styles Symbol
Map styles with a symbol style marker layer on astyledata event.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.5.css" />
<script src="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.5.js"></script>
<style>
body { margin: 0; padding: 0; }
#map {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
}
#menu {
position: absolute;
background: #fff;
padding: 10px;
font-family: 'Open Sans', sans-serif;
}
</style>
</head>
<body>
<div id="map"></div>
<div id="menu">
<input id="transportation" type="radio" name="rtoggle" value="TRANSPORTATION" checked="checked" />
<label for="transportation">transportation</label>
<input id="basic" type="radio" name="rtoggle" value="BASIC" />
<label for="basic">basic</label>
<input id="datalight" type="radio" name="rtoggle" value="DATALIGHT" />
<label for="datalight">datalight</label>
<input id="datadark" type="radio" name="rtoggle" value="DATADARK" />
<label for="datadark">datadark</label>
<input id="terrain" type="radio" name="rtoggle" value="TERRAIN" />
<label for="terrain">terrain</label>
<input id="satellite" type="radio" name="rtoggle" value="SATELLITE" />
<label for="satellite">satellite</label>
</div>
<script>
// This example shows how to switch map styles with a custom symbol layer.
TrimbleMaps.setAPIKey('YOUR_API_KEY_HERE');
const map = new TrimbleMaps.Map({
container: 'map', // container id
style: TrimbleMaps.Common.Style.TRANSPORTATION, // initial style
center: [-74.60018, 40.36144], // starting position [lng, lat]
zoom: 12 // starting zoom
});
// Data for our custom marker
const geoJsonData = {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [{
type: 'Feature',
properties: {
name: 'Trimble Maps HQ'
},
geometry: {
type: 'Point',
coordinates: [-74.60018, 40.36144]
}
}]
}
};
// Function to switch map styles
function switchLayer(event) {
const styleId = event.target.value;
map.setStyle(TrimbleMaps.Common.Style[styleId]);
}
// Attach event listener to radio buttons
const layerList = document.getElementById('menu');
const inputs = layerList.getElementsByTagName('input');
for (const input of inputs) {
input.onclick = switchLayer;
}
// This event fires when the map's style has been successfully loaded or updated.
// We make the callback function 'async' to use 'await'.
map.on('styledata', async (e) => {
const layerId = 'hqPoints';
const sourceId = 'hqSource';
const markerIconId = 'marker-icon';
const markerImageUrl = 'https://developer.trimblemaps.com/maps-sdk/img/marker_blue.png';
try {
// 1. Add the data source only if it doesn't already exist.
if (!map.getSource(sourceId)) {
map.addSource(sourceId, geoJsonData);
}
// 2. Load the image asynchronously. 'await' pauses the function
// until the image is loaded, preventing a race condition.
const image = await map.loadImage(markerImageUrl);
// 3. Add the loaded image to the map's style with a unique ID,
// but only if it hasn't been added before.
if (!map.hasImage(markerIconId)) {
// The resolved object from loadImage has a 'data' property
// which contains the image data needed by addImage.
map.addImage(markerIconId, image.data);
}
// 4. Finally, add the symbol layer. Because of 'await', this code
// only runs after the image is successfully loaded and added.
if (!map.getLayer(layerId)) {
map.addLayer({
id: layerId,
type: 'symbol',
source: sourceId, // link to the source
layout: {
'icon-image': markerIconId, // use the image we just added
'icon-size': 1,
'icon-allow-overlap': true, // prevent icon from disappearing on zoom
'text-field': ['get', 'name'], // Get the 'name' property from the GeoJSON
'text-offset': [0, 1.25],
'text-anchor': 'top'
},
paint: {
'text-color': '#000000',
'text-halo-color': '#ffffff',
'text-halo-width': 1
}
});
}
} catch (error) {
console.error('An error occurred while adding the custom layer:', error);
}
});
</script>
</body>
</html>
Map Styles Symbol
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.5.css" />
<script src="https://maps-sdk.trimblemaps.com/v4/trimblemaps-4.2.5.js"></script>
<style>
body { margin: 0; padding: 0; }
#map {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
}
#menu {
position: absolute;
background: #fff;
padding: 10px;
font-family: 'Open Sans', sans-serif;
}
</style>
</head>
<body>
<div id="map"></div>
<div id="menu">
<input id="transportation" type="radio" name="rtoggle" value="TRANSPORTATION" checked="checked" />
<label for="transportation">transportation</label>
<input id="basic" type="radio" name="rtoggle" value="BASIC" />
<label for="basic">basic</label>
<input id="datalight" type="radio" name="rtoggle" value="DATALIGHT" />
<label for="datalight">datalight</label>
<input id="datadark" type="radio" name="rtoggle" value="DATADARK" />
<label for="datadark">datadark</label>
<input id="terrain" type="radio" name="rtoggle" value="TERRAIN" />
<label for="terrain">terrain</label>
<input id="satellite" type="radio" name="rtoggle" value="SATELLITE" />
<label for="satellite">satellite</label>
</div>
<script>
// This example shows how to switch map styles with a custom symbol layer.
TrimbleMaps.setAPIKey('YOUR_API_KEY_HERE');
const map = new TrimbleMaps.Map({
container: 'map', // container id
style: TrimbleMaps.Common.Style.TRANSPORTATION, // initial style
center: [-74.60018, 40.36144], // starting position [lng, lat]
zoom: 12 // starting zoom
});
// Data for our custom marker
const geoJsonData = {
type: 'geojson',
data: {
type: 'FeatureCollection',
features: [{
type: 'Feature',
properties: {
name: 'Trimble Maps HQ'
},
geometry: {
type: 'Point',
coordinates: [-74.60018, 40.36144]
}
}]
}
};
// Function to switch map styles
function switchLayer(event) {
const styleId = event.target.value;
map.setStyle(TrimbleMaps.Common.Style[styleId]);
}
// Attach event listener to radio buttons
const layerList = document.getElementById('menu');
const inputs = layerList.getElementsByTagName('input');
for (const input of inputs) {
input.onclick = switchLayer;
}
// This event fires when the map's style has been successfully loaded or updated.
// We make the callback function 'async' to use 'await'.
map.on('styledata', async (e) => {
const layerId = 'hqPoints';
const sourceId = 'hqSource';
const markerIconId = 'marker-icon';
const markerImageUrl = 'https://developer.trimblemaps.com/maps-sdk/img/marker_blue.png';
try {
// 1. Add the data source only if it doesn't already exist.
if (!map.getSource(sourceId)) {
map.addSource(sourceId, geoJsonData);
}
// 2. Load the image asynchronously. 'await' pauses the function
// until the image is loaded, preventing a race condition.
const image = await map.loadImage(markerImageUrl);
// 3. Add the loaded image to the map's style with a unique ID,
// but only if it hasn't been added before.
if (!map.hasImage(markerIconId)) {
// The resolved object from loadImage has a 'data' property
// which contains the image data needed by addImage.
map.addImage(markerIconId, image.data);
}
// 4. Finally, add the symbol layer. Because of 'await', this code
// only runs after the image is successfully loaded and added.
if (!map.getLayer(layerId)) {
map.addLayer({
id: layerId,
type: 'symbol',
source: sourceId, // link to the source
layout: {
'icon-image': markerIconId, // use the image we just added
'icon-size': 1,
'icon-allow-overlap': true, // prevent icon from disappearing on zoom
'text-field': ['get', 'name'], // Get the 'name' property from the GeoJSON
'text-offset': [0, 1.25],
'text-anchor': 'top'
},
paint: {
'text-color': '#000000',
'text-halo-color': '#ffffff',
'text-halo-width': 1
}
});
}
} catch (error) {
console.error('An error occurred while adding the custom layer:', error);
}
});
</script>
</body>
</html>