I am using MapBox and am adding a WMS source pretty much identically to the code at this URL https://docs.mapbox.com/mapbox-gl-js/example/wms/
For convenience, the code is as follows:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Add a WMS source</title>
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<link href="https://api.mapbox.com/mapbox-gl-js/v2.3.0/mapbox-gl.css" rel="stylesheet">
<script src="https://api.mapbox.com/mapbox-gl-js/v2.3.0/mapbox-gl.js"></script>
<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 = 'pk.eyJ1IjoibWFyaWRhdGEiLCJhIjoiY2oxZXU2dzUwMDAwaDJxdGdpOGtoNWc2MyJ9.hs8kOWZetlwyMg6COnKwCg';
var map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/light-v10',
zoom: 8,
center: [-74.5447, 40.6892]
});
map.on('load', function () {
map.addSource('wms-test-source', {
'type': 'raster',
// use the tiles option to specify a WMS tile source URL
// https://docs.mapbox.com/mapbox-gl-js/style-spec/sources/
'tiles': [
'https://img.nj.gov/imagerywms/Natural2015?bbox={bbox-epsg-3857}&format=image/png&service=WMS&version=1.1.1&request=GetMap&srs=EPSG:3857&transparent=true&width=256&height=256&layers=Natural2015'
],
'tileSize': 256
});
map.addLayer(
{
'id': 'wms-test-layer',
'type': 'raster',
'source': 'wms-test-source',
'paint': {}
},
'aeroway-line'
);
});
</script>
</body>
</html>
The challenge that I have is that the WMS source I am getting the tiles from needs to have a username and password sent as Basic Auth in the header.
Does anyone know how I can achieve this using the Mapbox GL JS?
Thanks!
You can use the transformRequest
property to the map initialisation for this. The example in the Mapbox documentation is almost exactly your use case:
var map = new mapboxgl.Map({
container: 'map',
center: [-122.420679, 37.772537],
zoom: 13,
style: style_object,
hash: true,
transformRequest: (url, resourceType)=> {
if(resourceType === 'Source' && url.startsWith('http://myHost')) {
return {
url: url.replace('http', 'https'),
headers: { 'my-custom-header': true},
credentials: 'include' // Include cookies for cross-origin requests
}
}
}
});
You will have to modify it slightly for your WMS scenario.