connect_error) return null; $c->set_charset("utf8mb4"); return $c; } // ── Koneksi ke masing-masing database ──────────────────────────────────── $connPoverty = makeConn("webgis_poverty"); // atau "webgis" sesuai db.sql $connJalan = makeConn("jalan"); $connSpbu = makeConn("spbu"); // ── 1. Data dari webgis_poverty (kemiskinan) ───────────────────────────── $poverty = [ 'total_miskin' => 0, 'total_jiwa' => 0, 'total_ibadah' => 0, 'total_log' => 0, 'terurus' => 0, 'tidak_terurus' => 0, 'pct_terurus' => 0, 'distribusi' => ['kategori' => [], 'tipe_bantuan' => [], 'per_bulan' => []], ]; if ($connPoverty) { // Total KK miskin & jiwa $r = $connPoverty->query("SELECT COUNT(*) as c, COALESCE(SUM(jumlah_jiwa),0) as j FROM penduduk_miskin"); if ($r && $row = $r->fetch_assoc()) { $poverty['total_miskin'] = (int)$row['c']; $poverty['total_jiwa'] = (int)$row['j']; } // Total rumah ibadah $r = $connPoverty->query("SELECT COUNT(*) as c FROM rumah_ibadah"); if ($r && $row = $r->fetch_assoc()) $poverty['total_ibadah'] = (int)$row['c']; // Total log bantuan $r = $connPoverty->query("SELECT COUNT(*) as c FROM log_bantuan"); if ($r && $row = $r->fetch_assoc()) $poverty['total_log'] = (int)$row['c']; // Kategori bantuan $r = $connPoverty->query("SELECT kategori_bantuan, COUNT(*) as c FROM penduduk_miskin GROUP BY kategori_bantuan"); if ($r) while ($row = $r->fetch_assoc()) $poverty['distribusi']['kategori'][$row['kategori_bantuan']] = (int)$row['c']; // Tipe bantuan dari log $r = $connPoverty->query("SELECT tipe_bantuan, COUNT(*) as c FROM log_bantuan GROUP BY tipe_bantuan"); if ($r) while ($row = $r->fetch_assoc()) $poverty['distribusi']['tipe_bantuan'][$row['tipe_bantuan']] = (int)$row['c']; // Bantuan per bulan (6 bulan terakhir) $r = $connPoverty->query(" SELECT DATE_FORMAT(tanggal,'%Y-%m') as bulan, COUNT(*) as cnt FROM log_bantuan WHERE tanggal >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH) GROUP BY bulan ORDER BY bulan ASC "); if ($r) while ($row = $r->fetch_assoc()) $poverty['distribusi']['per_bulan'][] = $row; // Terurus vs tidak (radius sederhana: ada di radius salah satu ibadah) $ibadahRes = $connPoverty->query("SELECT lat, lng, radius FROM rumah_ibadah"); $ibadahArr = []; if ($ibadahRes) while ($row = $ibadahRes->fetch_assoc()) $ibadahArr[] = $row; $miskinRes = $connPoverty->query("SELECT lat, lng FROM penduduk_miskin"); if ($miskinRes) { while ($m = $miskinRes->fetch_assoc()) { $inRadius = false; foreach ($ibadahArr as $ib) { $dlat = deg2rad($ib['lat'] - $m['lat']); $dlng = deg2rad($ib['lng'] - $m['lng']); $a = sin($dlat/2)**2 + cos(deg2rad($m['lat']))*cos(deg2rad($ib['lat']))*sin($dlng/2)**2; $dist = 6371000 * 2 * atan2(sqrt($a), sqrt(1-$a)); if ($dist <= (float)$ib['radius']) { $inRadius = true; break; } } if ($inRadius) $poverty['terurus']++; else $poverty['tidak_terurus']++; } $tot = $poverty['total_miskin']; $poverty['pct_terurus'] = $tot > 0 ? round($poverty['terurus'] / $tot * 100, 1) : 0; } $connPoverty->close(); } // ── 2. Data Jalan ───────────────────────────────────────────────────────── $jalan = [ 'total_jalan' => 0, 'total_panjang_m' => 0, 'per_status' => [], 'total_parsil' => 0, 'total_luas_m2' => 0, 'per_kepemilikan' => [], ]; if ($connJalan) { $r = $connJalan->query("SELECT COUNT(*) as c, COALESCE(SUM(panjang_meter),0) as p FROM jalan"); if ($r && $row = $r->fetch_assoc()) { $jalan['total_jalan'] = (int)$row['c']; $jalan['total_panjang_m'] = (float)$row['p']; } $r = $connJalan->query("SELECT status_jalan, COUNT(*) as c FROM jalan GROUP BY status_jalan"); if ($r) while ($row = $r->fetch_assoc()) $jalan['per_status'][$row['status_jalan']] = (int)$row['c']; $r = $connJalan->query("SELECT COUNT(*) as c, COALESCE(SUM(luas_m2),0) as l FROM parsil_tanah"); if ($r && $row = $r->fetch_assoc()) { $jalan['total_parsil'] = (int)$row['c']; $jalan['total_luas_m2'] = (float)$row['l']; } $r = $connJalan->query("SELECT status_kepemilikan, COUNT(*) as c FROM parsil_tanah GROUP BY status_kepemilikan"); if ($r) while ($row = $r->fetch_assoc()) $jalan['per_kepemilikan'][$row['status_kepemilikan']] = (int)$row['c']; $connJalan->close(); } // ── 3. Data SPBU ────────────────────────────────────────────────────────── $spbu = [ 'total_spbu' => 0, 'buka_24_jam' => 0, 'tidak_24_jam' => 0, 'list' => [], ]; if ($connSpbu) { $r = $connSpbu->query("SELECT COUNT(*) as c FROM spbu"); if ($r && $row = $r->fetch_assoc()) $spbu['total_spbu'] = (int)$row['c']; $r = $connSpbu->query("SELECT SUM(buka_24_jam=1) as buka, SUM(buka_24_jam=0) as tidak FROM spbu"); if ($r && $row = $r->fetch_assoc()) { $spbu['buka_24_jam'] = (int)$row['buka']; $spbu['tidak_24_jam'] = (int)$row['tidak']; } $r = $connSpbu->query("SELECT nama_spbu, nomor_wa, buka_24_jam, latitude, longitude FROM spbu ORDER BY nama_spbu"); if ($r) while ($row = $r->fetch_assoc()) $spbu['list'][] = $row; $connSpbu->close(); } // ── 4. Data Penduduk (choropleth — static dari pontianak.json) ──────────── // Data kepadatan per kecamatan sudah ada di file JS, ringkasan di sini $penduduk = [ 'kecamatan' => [ ['nama' => 'Pontianak Barat', 'density' => 9.331], ['nama' => 'Pontianak Kota', 'density' => 8.102], ['nama' => 'Pontianak Timur', 'density' => 9.196], ['nama' => 'Pontianak Selatan', 'density' => 5.673], ['nama' => 'Pontianak Utara', 'density' => 3.642], ['nama' => 'Pontianak Tenggara', 'density' => 3.103], ] ]; $penduduk['total_kecamatan'] = count($penduduk['kecamatan']); $penduduk['rata_density'] = round(array_sum(array_column($penduduk['kecamatan'],'density')) / $penduduk['total_kecamatan'], 3); $penduduk['terpadat'] = $penduduk['kecamatan'][array_search(max(array_column($penduduk['kecamatan'],'density')), array_column($penduduk['kecamatan'],'density'))]['nama']; // ── Output ──────────────────────────────────────────────────────────────── echo json_encode([ 'status' => 'success', 'poverty' => $poverty, 'jalan' => $jalan, 'spbu' => $spbu, 'penduduk' => $penduduk, ], JSON_UNESCAPED_UNICODE);