Mapbox gl js draw - custom buttons
Mapbox gl js draw - custom buttons
by fxi
HTML
<link rel="stylesheet" href="https://api.tiles.mapbox.com/mapbox-gl-js/v0.53.0/mapbox-gl.css">
<script src="https://api.tiles.mapbox.com/mapbox-gl-js/v0.53.0/mapbox-gl.js"></script>
<link rel="stylesheet" href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.css">
<script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-draw/v1.0.9/mapbox-gl-draw.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<div id='map'></div>
CSS
body {
margin: 0;
padding: 0;
}
#map {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
}
JavaScript
function init() {
var map = new mapboxgl.Map({
container: 'map',
style: {
"version": 8,
"name": "Emptiness",
"sources": {
"relief": {
"attributions": "attribution: 'Tiles © Esri — Source: USGS, Esri, TANA, DeLorme, and NPS",
"type": "raster",
"tiles": ["https://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}"]
}
},
"layers": [{
"id": "test",
"type": "raster",
"source": "relief"
}]
},
"zoom": 5,
"center": [-6.10,
31.34
]
});
var draw = new MapboxDraw();
var drawBar = new extendDrawBar({
draw: draw,
buttons: [{
on: 'click',
action: save,
classes: [],
content: '<span>😅</span>'
}]
});
map.addControl(drawBar);
}
/**
* Helpers
*/
function save() {
alert('saved');
}
/**
* Patch
*/
class extendDrawBar {
constructor(opt) {
let ctrl = this;
ctrl.draw = opt.draw;
ctrl.buttons = opt.buttons || [];
ctrl.onAddOrig = opt.draw.onAdd;
ctrl.onRemoveOrig = opt.draw.onRemove;
}
onAdd(map) {
let ctrl = this;
ctrl.map = map;
ctrl.elContainer = ctrl.onAddOrig(map);
ctrl.buttons.forEach((b) => {
ctrl.addButton(b);
});
return ctrl.elContainer;
}
onRemove(map) {
ctrl.buttons.forEach((b) => {
ctrl.removeButton(b);
});
ctrl.onRemoveOrig(map);
}
addButton(opt) {
let ctrl = this;
var elButton = document.createElement('button');
elButton.className = 'mapbox-gl-draw_ctrl-draw-btn';
if (opt.classes instanceof Array) {
opt.classes.forEach((c) => {
elButton.classList.add(c);
});
}
if (opt.content) {
if (opt.content instanceof Element) {
elButton.appendChild(opt.content);
} else {
elButton.innerHTML = opt.content
}
}
elButton.addEventListener(opt.on, opt.action);
...