SIG Penduduk Miskin – Berbasis Rumah Ibadah
Aplikasi Sistem Informasi Geografis (SIG) untuk pendataan penduduk miskin berdasarkan wilayah radius rumah ibadah terdekat.
📁 Struktur Folder
sig-kemiskinan/
├── index.html ← Halaman utama (Leaflet + JS)
├── database.sql ← Schema + data contoh
├── includes/
│ └── config.php ← Koneksi DB + fungsi utilitas
├── api/
│ ├── rumah_ibadah.php ← CRUD Rumah Ibadah
│ ├── penduduk.php ← CRUD Penduduk Miskin
│ ├── geocode.php ← Reverse Geocoding (Nominatim)
│ └── update_radius.php ← Update radius + reassign
└── README.md
⚙️ Setup
1. Persyaratan
- PHP 7.4+ (atau 8.x)
- MySQL 5.7+ / MariaDB
- Web server (Apache/Nginx) atau PHP built-in server
2. Database
-- Import file database.sql ke MySQL:
mysql -u root -p < database.sql
Atau lewat phpMyAdmin: Import → pilih database.sql
3. Konfigurasi DB
Edit includes/config.php:
define('DB_HOST', 'localhost');
define('DB_USER', 'root'); // ganti sesuai user MySQL Anda
define('DB_PASS', ''); // ganti dengan password MySQL
define('DB_NAME', 'sig_kemiskinan');
4. Jalankan
# Opsi 1: PHP built-in server (development)
cd sig-kemiskinan
php -S localhost:8080
# Opsi 2: Taruh di folder htdocs (XAMPP/WAMP)
# Copy folder ke C:/xampp/htdocs/sig-kemiskinan
# Akses: http://localhost/sig-kemiskinan
🗺️ Cara Penggunaan
Tambah Rumah Ibadah
- Klik tombol "+ Rumah Ibadah" (pojok kanan atas)
- Kursor berubah → klik lokasi di peta
- Isi form: Nama, Jenis, PIC, No. WA, Radius
- Alamat otomatis terisi dari reverse geocoding (Nominatim/OSM)
- Klik Simpan
Tambah Penduduk Miskin
- Klik tombol "+ Penduduk"
- Klik lokasi rumah di peta
- Isi: Nama KK, Jumlah anggota
- Sistem otomatis menentukan rumah ibadah terdekat dalam radius
- Titik hijau = dalam radius | Titik merah = luar radius
Ubah Radius
- Klik marker rumah ibadah → popup → tombol 📐 Radius
- Atau klik ikon 📐 di list sidebar
- Drag slider untuk mengubah radius (preview langsung)
- Klik Simpan → semua penduduk di-reassign otomatis
Logika Overlap
Jika penduduk masuk dalam radius >1 rumah ibadah: → Diassign ke rumah ibadah yang paling dekat (Haversine distance)
🔌 API Endpoints
| Method | URL | Fungsi |
|---|---|---|
| GET | api/rumah_ibadah.php |
Semua rumah ibadah + stats |
| POST | api/rumah_ibadah.php |
Tambah rumah ibadah |
| PUT | api/rumah_ibadah.php |
Update rumah ibadah |
| DELETE | api/rumah_ibadah.php?id=X |
Hapus |
| GET | api/penduduk.php |
Semua penduduk |
| POST | api/penduduk.php |
Tambah penduduk |
| PUT | api/penduduk.php |
Update penduduk |
| DELETE | api/penduduk.php?id=X |
Hapus |
| GET | api/geocode.php?lat=X&lng=Y |
Reverse geocoding |
| POST | api/update_radius.php |
Update radius + reassign |
🧮 Algoritma Radius
Jarak = Haversine(lat1, lng1, lat2, lng2) // dalam meter
Untuk setiap penduduk P:
candidates = [ibadah | jarak(P, ibadah) <= ibadah.radius]
if candidates:
assign P → min(candidates, key=jarak)
else:
P.rumah_ibadah_id = NULL // luar radius semua
🖥️ Fitur UI
- Peta Leaflet dengan tile OpenStreetMap
- Sidebar panel: list Rumah Ibadah & Penduduk
- Stats bar: total ibadah, KK, jiwa, tercakup/tidak
- Radius fleksibel via slider (100–3000m, default 500m)
- Lingkaran radius real-time di peta
- Reverse geocoding otomatis saat klik peta
- Warna marker penduduk: hijau (dalam radius) / merah (luar)
- Popup informatif + tombol CRUD langsung dari peta
- Responsive mobile-friendly
- Dark theme modern