87 lines
3.1 KiB
JavaScript
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.');
|
|
}
|
|
};
|
|
})();
|