First commit / commit pertama

This commit is contained in:
Mr.Haruna
2026-06-13 11:24:58 +07:00
commit 522c4f7200
166 changed files with 13326 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
<?php
/**
* geo_helper.php
* Tanggung Jawab: Menyediakan fungsi matematika spasial manual (seperti Haversine).
*/
class GeoHelper {
/**
* Menghitung jarak antara dua koordinat geografis menggunakan Haversine Formula.
* Mengembalikan jarak dalam satuan Kilometer.
*/
public static function haversineDistance($lat1, $lon1, $lat2, $lon2) {
$earthRadius = 6371; // Jari-jari bumi dalam kilometer
$dLat = deg2rad($lat2 - $lat1);
$dLon = deg2rad($lon2 - $lon1);
$a = sin($dLat / 2) * sin($dLat / 2) +
cos(deg2rad($lat1)) * cos(deg2rad($lat2)) *
sin($dLon / 2) * sin($dLon / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$distance = $earthRadius * $c;
return $distance;
}
/**
* Mencari Warga Miskin dalam radius tertentu dari suatu titik (Rumah Ibadah).
*/
public static function getWargaDalamRadius($pdo, $pusatLat, $pusatLon, $radiusKm = 1.0) {
// Ambil semua data warga miskin
$stmt = $pdo->query("SELECT id, nama_kk, penghasilan, jumlah_tanggungan, ST_AsGeoJSON(geom) as geojson FROM warga_miskin");
$wargaDalamRadius = [];
while ($row = $stmt->fetch()) {
$geom = json_decode($row['geojson'], true);
// GeoJSON Point format: [Longitude, Latitude]
$wargaLon = $geom['coordinates'][0];
$wargaLat = $geom['coordinates'][1];
// Hitung jarak dengan Haversine
$jarak = self::haversineDistance($pusatLat, $pusatLon, $wargaLat, $wargaLon);
if ($jarak <= $radiusKm) {
$wargaDalamRadius[] = [
'id' => $row['id'],
'nama_kk' => $row['nama_kk'],
'penghasilan' => $row['penghasilan'],
'jumlah_tanggungan' => $row['jumlah_tanggungan'],
'jarak_km' => round($jarak, 2),
'geometry' => $geom
];
}
}
// Urutkan berdasarkan jarak terdekat
usort($wargaDalamRadius, function($a, $b) {
return $a['jarak_km'] <=> $b['jarak_km'];
});
return $wargaDalamRadius;
}
}
?>
+29
View File
@@ -0,0 +1,29 @@
<?php
/**
* response_helper.php
* Tanggung Jawab: Standarisasi format response JSON.
*/
header('Content-Type: application/json; charset=utf-8');
$allowedOrigin = getenv('CORS_ALLOWED_ORIGIN');
if ($allowedOrigin !== false && $allowedOrigin !== '') {
header('Access-Control-Allow-Origin: ' . $allowedOrigin);
header('Vary: Origin');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With');
}
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { exit(0); }
function sendSuccess($data = null, $message = 'Success', $statusCode = 200) {
http_response_code($statusCode);
echo json_encode(['status' => 'success', 'message' => $message, 'data' => $data]);
exit();
}
function sendError($message = 'Error', $statusCode = 400) {
http_response_code($statusCode);
echo json_encode(['status' => 'error', 'message' => $message]);
exit();
}
?>