172 lines
7.5 KiB
PHP
172 lines
7.5 KiB
PHP
<?php
|
|
/**
|
|
* stats_extended.php
|
|
* Dashboard terintegrasi: webgis_poverty + jalan + spbu + penduduk choropleth
|
|
*/
|
|
header('Content-Type: application/json; charset=UTF-8');
|
|
require_once '../auth_helper.php';
|
|
requireLogin();
|
|
|
|
// ── Helper: buat koneksi terpisah ─────────────────────────────────────────
|
|
function makeConn($dbName) {
|
|
$c = new mysqli("localhost", "root", "", $dbName);
|
|
if ($c->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);
|