# 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 ```sql -- 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`: ```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 ```bash # 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 1. Klik tombol **"+ Rumah Ibadah"** (pojok kanan atas) 2. Kursor berubah → **klik lokasi di peta** 3. Isi form: Nama, Jenis, PIC, No. WA, Radius 4. Alamat **otomatis terisi** dari reverse geocoding (Nominatim/OSM) 5. Klik **Simpan** ### Tambah Penduduk Miskin 1. Klik tombol **"+ Penduduk"** 2. **Klik lokasi rumah** di peta 3. Isi: Nama KK, Jumlah anggota 4. Sistem otomatis menentukan rumah ibadah terdekat dalam radius 5. **Titik hijau** = dalam radius | **Titik merah** = luar radius ### Ubah Radius 1. Klik marker rumah ibadah → popup → tombol **📐 Radius** 2. Atau klik ikon 📐 di list sidebar 3. **Drag slider** untuk mengubah radius (preview langsung) 4. 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