// ========================================== // 1. INISIALISASI PETA & LAYER // ========================================== var map = L.map('map', { zoomControl: false }).setView([-0.0227, 109.3425], 14); // Zoom control di kanan bawah (lebih bersih) L.control.zoom({ position: 'bottomright' }).addTo(map); // Custom pane initialization removed L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); // Layer Group untuk masing-masing data var drawnItems = new L.FeatureGroup().addTo(map); //var batasKotaLayer = L.layerGroup().addTo(map); //var sungaiLayer = L.layerGroup().addTo(map); var rumahIbadahLayer = L.layerGroup().addTo(map); var radiusLayer = L.layerGroup().addTo(map); var pendudukMiskinLayer = L.layerGroup().addTo(map); var pendudukMiskinCluster = L.markerClusterGroup({ showCoverageOnHover: false, zoomToBoundsOnClick: true, maxClusterRadius: 50 }).addTo(map); // Inisialisasi Heatmap kosong (akan diisi datanya saat load data) var povertyHeatLayer = L.heatLayer([], { radius: 22, blur: 18, maxZoom: 17 }).addTo(map); // Inisialisasi Layers Control (di kanan atas) var overlayMaps = { "🕌 Rumah Ibadah": rumahIbadahLayer, "🔥 Kepadatan Kemiskinan (Heatmap)": povertyHeatLayer, "👥 Semua Penduduk Miskin": pendudukMiskinCluster, "👥 Penduduk Terdekat (Analisis)": pendudukMiskinLayer }; L.control.layers(null, overlayMaps, { collapsed: true, position: 'bottomleft' }).addTo(map); // ========================================== // ICON DEFINITIONS // ========================================== // Unused marker icons removed // Icon Rumah Ibadah Kustom — bangunan rumah ibadah bergaya universal var rumahIbadahIcon = L.divIcon({ className: '', html: `
`, iconSize: [38, 38], iconAnchor: [19, 38], popupAnchor: [0, -38] }); var databasePendudukMiskin = []; function loadRumahIbadah() { rumahIbadahLayer.clearLayers(); fetch('load.php?jenis=rumah_ibadah') .then(res => res.json()) .then(dataRumahIbadah => { fetch('load.php?jenis=penduduk_miskin') .then(res => res.json()) .then(dataPendudukMiskin => { databasePendudukMiskin = dataPendudukMiskin; // Mengisi koordinat data kemiskinan ke dalam Heatmap var heatPoints = dataPendudukMiskin.map(p => [ parseFloat(p.lat || p.latitude), parseFloat(p.lng || p.longitude), 1.0 ]); povertyHeatLayer.setLatLngs(heatPoints); // Marker Clustering untuk semua penduduk miskin pendudukMiskinCluster.clearLayers(); dataPendudukMiskin.forEach(penduduk => { var latPenduduk = parseFloat(penduduk.lat || penduduk.latitude); var lngPenduduk = parseFloat(penduduk.lng || penduduk.longitude); var statusBantuan = penduduk.bantuan || 'Belum Menerima'; var poorFamilyIcon = L.divIcon({ className: '', html: ``, iconSize: [14, 14], iconAnchor: [7, 7], popupAnchor: [0, -7] }); var actionButtons = ''; if (IS_ADMIN) { actionButtons = `