Initial commit
This commit is contained in:
@@ -0,0 +1,171 @@
|
||||
<?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);
|
||||
Reference in New Issue
Block a user