% require 'uri' %>
function getUrlParams() {
const params = {};
const queryString = window.location.search.substring(1);
const regex = /([^&=]+)=([^&]*)/g;
let match;
while (match = regex.exec(queryString)) {
params[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);
}
return params;
}
function createMap(divName) {
// Get URL parameters
const params = getUrlParams();
const lon = params.lon ? parseFloat(params.lon) : null;
const lat = params.lat ? parseFloat(params.lat) : null;
const zoom = params.zoom ? parseInt(params.zoom) : null;
// Create a map
var map = L.map(divName, {
worldCopyJump: true
});
// Set initial view if URL parameters are available, otherwise fitBounds
if (lat !== null && lon !== null && zoom !== null) {
map.setView([lat, lon], zoom);
} else {
map.fitBounds(<%= @bbox.to_json %>);
}
// Create a layer switcher
var layers = L.control.layers(null, null, {collapsed:false}).addTo(map);
// Add OpenStreetMap layer
layers.addBaseLayer(L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
attribution: "© OpenStreetMap and contributors, under an open license",
maxZoom: 19
}), "OpenStreetMap");
<% @layers.sort_by { |layer| layer[:name] }.each do |layer| -%>
// Create <%= layer[:name] %> layer
var <%= layer[:name].gsub("-", "_") %> = L.tileLayer(<%= layer[:url].to_json %>, {
attribution: <%= layer[:attribution].to_json %>,
maxZoom: <%= layer[:maxZoom].to_json %>
});
// Add <%= layer[:name] %> to layer switcher
<% if layer[:overlay] -%>
layers.addOverlay(<%= layer[:name].gsub("-", "_") %>, <%= layer[:title].to_json %>);
<% else %>
layers.addBaseLayer(<%= layer[:name].gsub("-", "_") %>, <%= layer[:title].to_json %>);
<% end -%>
<% if layer[:default] -%>
// Add <%= layer[:name] %> to map
<%= layer[:name].gsub("-", "_") %>.addTo(map);
<% end -%>
<% end -%>
// Add the permalink control
map.addControl(new L.Control.Permalink());
var lc = L.control.locate({
position: 'topright'
}).addTo(map);
return map;
}