Files
2026-06-11 18:14:21 +07:00

87 lines
3.1 KiB
JavaScript

// modules/heatmap.js — Heatmap kepadatan, intensitas proporsional jumlah_jiwa (F9)
(function () {
let heatmapLayer = null;
let active = false;
let heatmapKategori = '';
function canUseHeatmap() {
return !!(window.APP_USER?.isOp || window.APP_USER?.isAdmin);
}
function buildHeatData() {
const source = (window._pendudukAll || window._pendudukList || []).filter(function (p) {
return !heatmapKategori || p.kategori === heatmapKategori;
});
const validSource = source
.map(function (p) {
const rawLat = p.lat;
const rawLng = p.lng;
const lat = Number(p.lat);
const lng = Number(p.lng);
return {
hasCoordinate: rawLat !== null && rawLat !== '' && rawLng !== null && rawLng !== '',
lat: lat,
lng: lng,
jumlah_jiwa: Number(p.jumlah_jiwa || 1)
};
})
.filter(function (p) {
const lat = p.lat;
const lng = p.lng;
return p.hasCoordinate && Number.isFinite(lat) && Number.isFinite(lng);
});
const maxJiwa = Math.max(1, ...validSource.map(function (p) {
return p.jumlah_jiwa || 1;
}));
return validSource.map(function (p) {
return [p.lat, p.lng, 0.2 + 0.8 * ((p.jumlah_jiwa || 1) / maxJiwa)];
});
}
window._heatmapUpdate = function () {
if (!window.APP_USER?.isOp && !window.APP_USER?.isAdmin) {
active = false;
if (heatmapLayer && typeof map !== 'undefined' && map.hasLayer(heatmapLayer)) {
map.removeLayer(heatmapLayer);
}
return;
}
if (!active || !heatmapLayer) return;
heatmapLayer.setLatLngs(buildHeatData());
};
window._heatmapSetKategori = function (k) {
heatmapKategori = k;
window._heatmapUpdate();
};
window._toggleHeatmap = function (visible) {
if (!canUseHeatmap() || typeof L === 'undefined' || !L.heatLayer || typeof map === 'undefined') {
active = false;
const checkbox = document.getElementById('chkHeatmap');
if (checkbox) checkbox.checked = false;
if (heatmapLayer && typeof map !== 'undefined' && map.hasLayer(heatmapLayer)) {
map.removeLayer(heatmapLayer);
}
return;
}
active = visible;
if (active) {
if (!heatmapLayer) {
heatmapLayer = L.heatLayer([], {
radius : 25,
blur : 15,
maxZoom : 17,
gradient: { 0.4: 'blue', 0.6: 'cyan', 0.7: 'lime', 0.8: 'yellow', 1.0: 'red' }
});
}
heatmapLayer.addTo(map);
window._heatmapUpdate();
showToast('Heatmap Kepadatan diaktifkan.');
} else {
if (heatmapLayer) map.removeLayer(heatmapLayer);
showToast('Heatmap dinonaktifkan.');
}
};
})();