var cityData,
cityGeoJSON,
cityLayer,
totalData,
totalId,
dataConfig,
legendBins,
map,
placeDataControl,
legendControl,
selectedPlace,
selectedVar,
stateGeoJSON,
stateLayer,
varControl;
dataConfig = {
"confirmed_per_100k_inhabitants": {
"color": "#1d221b",
"displayText": "Confirmados/100.000 hab.",
"zeroText": "Nenhum",
"opacityFromValue": log2OpacityFromValue,
"valueFromOpacity": log2ValueFromOpacity,
},
"confirmed": {
"color": "#070762",
"displayText": "Casos confirmados",
"zeroText": "Nenhum",
"opacityFromValue": log2OpacityFromValue,
"valueFromOpacity": log2ValueFromOpacity,
},
"deaths_per_100k_inhabitants": {
"color": "#af7272",
"displayText": "Óbitos/100.000 hab.",
"zeroText": "Nenhum",
"opacityFromValue": log2OpacityFromValue,
"valueFromOpacity": log2ValueFromOpacity,
},
"death_rate_percent": {
"color": "#ad1f6b",
"displayText": "Letalidade",
"zeroText": "Nenhum",
"opacityFromValue": linearOpacityFromValue,
"valueFromOpacity": linearValueFromOpacity,
},
"deaths": {
"color": "#990000",
"displayText": "Óbitos confirmados",
"zeroText": "Nenhum",
"opacityFromValue": log2OpacityFromValue,
"valueFromOpacity": log2ValueFromOpacity,
},
};
legendBins = 6;
totalId = 0; // Brasil or state
selectedPlace = totalId;
selectedVar = Object.keys(dataConfig)[0];
function mapType() {
return selectedStateId === undefined ? "country" : "state";
}
function getPlaceData(place) {
return place == totalId ? totalData : cityData[place];
}
function linearOpacityFromValue(value, maxValue) {
return value / maxValue;
}
function linearValueFromOpacity(opacity, maxValue) {
return parseInt(opacity * maxValue);
}
function log2OpacityFromValue(value, maxValue) {
return Math.log2(value + 1) / Math.log2(maxValue + 1);
}
function log2ValueFromOpacity(opacity, maxValue) {
return parseInt(2 ** (opacity * Math.log2(maxValue + 1)) - 1);
}
function cityStyle(feature) {
var value = cityData[feature.id][selectedVar] || 0;
var maxValue = maxValues[selectedVar];
var opacity = dataConfig[selectedVar].opacityFromValue(value, maxValue);
return {
color: "#333",
fillColor: dataConfig[selectedVar].color,
fillOpacity: opacity,
lineJoin: "round",
opacity: 0,
weight: 1,
}
}
function stateStyle(feature) {
return {
color: "#000",
fillColor: "#000",
fillOpacity: 0.0,
lineJoin: "round",
opacity: 1,
weight: 0.75
};
}
function changeVar(newVar) {
selectedVar = newVar;
cityLayer.setStyle(cityStyle);
updateLegendControl();
}
function updateLegendControl() {
var color = dataConfig[selectedVar].color,
displayValue,
div = legendControl.getContainer(),
labels = [`${dataConfig[selectedVar].displayText}`, "
"],
lastOpacity,
maxValue = maxValues[selectedVar],
zeroDisplay = dataConfig[selectedVar].zeroText;
for (var counter = 0; counter <= legendBins; counter += 1) {
var opacity = counter / legendBins;
var value = dataConfig[selectedVar].valueFromOpacity(opacity, maxValue);
var lastValue = lastOpacity === undefined ? 0 : dataConfig[selectedVar].valueFromOpacity(lastOpacity, maxValue);
if (lastOpacity === undefined || lastValue != value) {
displayValue = lastOpacity === undefined ? zeroDisplay : `${lastValue} — ${value}`;
labels.push(` ${displayValue} `);
}
lastOpacity = opacity;
}
div.innerHTML = labels.join("");
}
function updatePlaceDataControl(placeData) {
var div = placeDataControl.getContainer();
var dataLines = [];
Object.keys(dataConfig).forEach(function(item) {
var value = Intl.NumberFormat("pt-BR").format(placeData[item]);
value = item.endsWith("percent") ? `${value}%` : value;
dataLines.push(`
${dataConfig[item].displayText}: ${value}`);
});
div.innerHTML = `
${placeData.city}
${dataLines.join("\n")}
`;
}
function updateVarControl() {
var div = varControl.getContainer();
var inputs = ["10/04/25 - Selecione a variável"];
Object.keys(dataConfig).forEach(function(item) {
inputs.push(``);
});
div.innerHTML = inputs.join("
");
jQuery(".radio-control").change(function() {
changeVar(jQuery(this).val());
});
}
function createMap() {
var minZoom = mapType() == "country" ? 4.5 : 6;
var maxZoom = mapType() == "country" ? 8 : 12;
map = L.map("map", {
fullscreenControl: {pseudoFullscreen: false},
zoomSnap: 0.25,
zoomDelta: 0.25,
minZoom: minZoom,
maxZoom: maxZoom
});
map.setView([-27, -54], minZoom);
}
function hasToAddStateLayer() {
return stateGeoJSON !== undefined && stateLayer === undefined;
}
function hasToAddCityLayer() {
return stateLayer !== undefined && cityGeoJSON !== undefined && cityLayer === undefined;
}
function hasToAddLegendLayer() {
return stateLayer !== undefined && cityLayer !== undefined;
}
function mapHasLoaded() {
return stateLayer !== undefined && cityLayer !== undefined;
}
function mapFit() {
map.fitBounds(stateLayer.getBounds());
}
function updateMap() {
if (hasToAddStateLayer()) {
if (mapType() == "country") {
stateLayer = L.geoJSON(stateGeoJSON, {style: stateStyle}).addTo(map);
}
else if (mapType() == "state") {
var filteredStateGeoJSON = stateGeoJSON;
filteredStateGeoJSON.features = filteredStateGeoJSON.features.filter(function (item) {
return item.properties.CD_GEOCUF == selectedStateId;
});
stateLayer = L.geoJSON(filteredStateGeoJSON, {style: stateStyle}).addTo(map);
}
mapFit();
}
if (hasToAddCityLayer()) {
cityGeoJSON.features = cityGeoJSON.features.filter(function (item) {
var city = cityData[item.id];
return city !== undefined;
});
cityLayer = L.geoJSON(
cityGeoJSON,
{
style: cityStyle,
onEachFeature: function (feature, layer) {
layer.on("mouseover", function () {
this.setStyle({opacity: 1});
updatePlaceDataControl(getPlaceData(this.feature.id));
});
layer.on("click", function () {
this.setStyle({opacity: 0});
updatePlaceDataControl(getPlaceData(this.feature.id));
});
layer.on("mouseout", function () {
this.setStyle({opacity: 0});
updatePlaceDataControl(getPlaceData(totalId));
});
}
}
).addTo(map);
lc = L.control.locate({
strings: {
title: "Mostrar a sua localização"
}
}).addTo(map);
}
L.tileLayer(
'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', {
attribution: 'Quoos, J.H.; tiles by Carto & Data by OpenStreetMap'
}).addTo(map);
if (hasToAddLegendLayer()) {
notesControl = L.control({position: "bottomleft"});
notesControl.onAdd = function (map) {
var div = L.DomUtil.create("div", "info legend");
div.innerHTML = 'Fonte: Secretaria Estadual de Saúde'
div.innerHTML += '
Dados: Brasil.IO
GEDRI-UFSC/PANGEA-UFSM
';
return div;
};
notesControl.addTo(map);
legendControl = L.control({position: "bottomleft"});
legendControl.onAdd = function (map) {
var div = L.DomUtil.create("div", "info legend");
return div;
};
legendControl.addTo(map);
updateLegendControl();
placeDataControl = L.control({position: "bottomright"});
placeDataControl.onAdd = function (map) {
var div = L.DomUtil.create("div", "info legend");
return div;
};
placeDataControl.addTo(map);
updatePlaceDataControl(getPlaceData(selectedPlace));
varControl = L.control({position: "topright"});
varControl.onAdd = function (map) {
var div = L.DomUtil.create("div", "info legend");
return div;
};
varControl.addTo(map);
updateVarControl();
}
if (mapHasLoaded()) {
mapLoaded();
}
}
function mapLoaded() {
jQuery("#loading").css("z-index", -999);
jQuery(".radio-control:first").prop("checked", true).trigger("click");
}
function retrieveData() {
jQuery.getJSON(
dataURL.cities,
function (data) {
cityData = data.cities;
maxValues = data.max;
totalData = data.total;
updateMap();
}
);
jQuery.getJSON(
dataURL.stateGeoJSON,
function (data) {
stateGeoJSON = data;
updateMap();
}
);
jQuery.getJSON(
dataURL.cityGeoJSON,
function (data) {
cityGeoJSON = data;
updateMap();
}
);
}
jQuery(document).ready(function() {
createMap();
retrieveData();
jQuery(window).resize(function() {
if (jQuery(window).width() > 1840) {
jQuery("#table-col").removeClass("xl12").addClass("xl6");
jQuery("#map-col").removeClass("xl12").addClass("xl6");
}
else {
jQuery("#table-col").removeClass("xl6").addClass("xl12");
jQuery("#map-col").removeClass("xl6").addClass("xl12");
}
dt.columns.adjust();
});
window.dispatchEvent(new Event("resize"));
});