133 lines
3.8 KiB
Markdown
133 lines
3.8 KiB
Markdown
# 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
|