Files
UAS_WebGIS_CeciliaYvonGunaw…/povertymap/api/helpers.php
T
2026-06-10 22:12:35 +07:00

38 lines
1.5 KiB
PHP

<?php
require_once __DIR__ . '/config.php';
// ── Haversine distance (meter) ──────────────
function haversine(float $lat1, float $lng1, float $lat2, float $lng2): float {
$R = 6371000;
$dLat = deg2rad($lat2 - $lat1);
$dLng = deg2rad($lng2 - $lng1);
$a = sin($dLat/2)**2 + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * sin($dLng/2)**2;
return $R * 2 * atan2(sqrt($a), sqrt(1-$a));
}
// ── Cari rumah ibadah terdekat yang menjangkau koordinat ──
// Hanya rumah ibadah yang sudah verified
function findNearestIbadah(PDO $db, float $lat, float $lng): ?int {
$ibadahs = $db->query("SELECT id, lat, lng, radius FROM rumah_ibadah WHERE status = 'verified'")->fetchAll();
$nearest = null;
$minDist = PHP_FLOAT_MAX;
foreach ($ibadahs as $ib) {
$d = haversine($lat, $lng, (float)$ib['lat'], (float)$ib['lng']);
if ($d <= $ib['radius'] && $d < $minDist) {
$nearest = (int)$ib['id'];
$minDist = $d;
}
}
return $nearest;
}
// ── Re-assign SEMUA warga verified (dipanggil saat radius/ibadah berubah) ──
function reassignAllWarga(PDO $db): void {
$wargas = $db->query("SELECT id, lat, lng FROM warga_miskin WHERE status = 'verified'")->fetchAll();
$stmt = $db->prepare("UPDATE warga_miskin SET ibadah_id = ? WHERE id = ?");
foreach ($wargas as $w) {
$ibadahId = findNearestIbadah($db, (float)$w['lat'], (float)$w['lng']);
$stmt->execute([$ibadahId, $w['id']]);
}
}