# SKPL/SRS - WebGIS Poverty Mapping Application ## Software Requirements Specification & Project Implementation Plan **Dokumen Spesifikasi Kebutuhan Perangkat Lunak (SKPL)** **Versi:** 1.0 **Tanggal:** May 2026 **Status:** Final --- ## 1. RINGKASAN EKSEKUTIF ### 1.1 Deskripsi Proyek Aplikasi WebGIS Poverty Mapping adalah sistem informasi berbasis web yang dirancang untuk memetakan dan mengelola data kemiskinan di tingkat kecamatan. Sistem ini memungkinkan pengguna untuk: - Memetakan lokasi rumah penduduk miskin - Mencatat data rumah ibadah (worship) dengan radius layanan - Mengelola data geografis (jalan, parsil) - Menganalisis pola kemiskinan berdasarkan lokasi geografis - Menghasilkan laporan berbasis data spasial ### 1.2 Tujuan Sistem 1. Menyediakan platform terpadu untuk pendataan kemiskinan berbasis GIS 2. Meningkatkan akurasi dan efisiensi pengumpulan data sosial 3. Memfasilitasi pengambilan keputusan berbasis data spasial 4. Menyediakan visualisasi data yang intuitif dan interaktif ### 1.3 Stakeholder - Pemerintah Daerah / Kelurahan - Petugas Pendataan Sosial - Pejabat Pengambil Keputusan - Masyarakat (untuk laporan hasil analisis) --- ## 2. KEBUTUHAN SISTEM ### 2.1 Kebutuhan Fungsional (Functional Requirements) #### 2.1.1 Manajemen Data Geografis Dasar **FR-001: Tampilkan Peta Interaktif** - Sistem harus menampilkan peta OpenStreetMap dengan Leaflet.js - Fitur zoom dan pan untuk eksplorasi - Menampilkan layer administrasi (kecamatan) dari GeoJSON **FR-002: Penambahan Titik Data** - Pengguna dapat menambahkan tiga tipe titik: - **Rumah Ibadah (Worship)**: Lokasi ibadah dengan radius layanan - **Rumah Penduduk Miskin (Poor House)**: Lokasi keluarga penerima bantuan sosial - **Data Umum (Point)**: Data spasial umum lainnya **FR-003: Input Data Rumah Ibadah** - Atribut wajib: nama, jenis, alamat - Atribut tambahan: kontak, no_wa, kegiatan, kapasitas - Radius layanan dapat disesuaikan (default 200m) - Visualisasi radius dengan circle pada peta **FR-004: Input Data Rumah Penduduk Miskin** - Atribut wajib: nama_kepala_keluarga, alamat - Atribut sosial: jumlah_anggota, kondisi_rumah, sumber_penghasilan - Atribut bantuan: kebutuhan_prioritas, status_bantuan - Kategori kondisi rumah: sangat buruk, buruk, sedang, baik **FR-005: Manajemen Jalan & Parsil** - Input panjang jalan (dalam meter) - Input luas parsil/bidang (dalam m²) - Pencatatan status jalan/parsil - Support untuk geometri LineString dan Polygon #### 2.1.2 Operasi CRUD **FR-006: Create (Buat Data)** - Interface form untuk input data baru - Validasi input real-time - Penyimpanan otomatis ke database - Konfirmasi berhasil/gagal **FR-007: Read (Baca Data)** - Retrieving all data dari database - Filtering berdasarkan tipe data - Pagination untuk dataset besar - Export ke GeoJSON format **FR-008: Update (Ubah Data)** - Edit data existing dari peta atau form - Update geometri dengan drag & drop - Pencatatan waktu modifikasi - Riwayat perubahan (audit trail) **FR-009: Delete (Hapus Data)** - Penghapusan data dengan konfirmasi - Soft delete atau hard delete sesuai kebijakan - Pencatatan penghapus dan waktu penghapusan #### 2.1.3 Analisis & Pelaporan **FR-010: Analisis Proximity** - Deteksi rumah miskin dalam radius rumah ibadah - Hitung jumlah penduduk miskin per rumah ibadah - Identifikasi area dengan konsentrasi kemiskinan tinggi **FR-011: Statistik Spasial** - Jumlah total penduduk miskin per wilayah - Distribusi kemiskinan berdasarkan kondisi rumah - Analisis kebutuhan prioritas **FR-012: Export Laporan** - Export data ke format Excel/CSV - Generate report PDF dengan visualisasi peta - Summary statistics per distrik/admin area --- ### 2.2 Kebutuhan Non-Fungsional (Non-Functional Requirements) #### 2.2.1 Performa **NFR-001: Response Time** - Loading peta: < 3 detik - Penyimpanan data: < 2 detik - Query data: < 5 detik untuk 10,000+ records **NFR-002: Scalability** - Support minimal 50,000 titik data - Handle 100+ pengguna concurrent - Database optimization untuk query performa **NFR-003: Browser Compatibility** - Chrome 90+ - Firefox 88+ - Safari 14+ - Edge 90+ #### 2.2.2 Keamanan **NFR-004: Authentication** - Implementasi user login (sederhana) - Session management - Password encryption **NFR-005: Data Validation** - Server-side validation wajib - Client-side validation untuk UX - Sanitasi input untuk mencegah SQL injection - CSRF protection **NFR-006: Data Privacy** - HTTPS untuk transmisi data - Enkripsi data sensitif di database - Access control berbasis user role #### 2.2.3 Availability & Maintainability **NFR-007: Availability** - System uptime: 99% (outside maintenance windows) - Backup otomatis harian - Disaster recovery plan **NFR-008: Maintainability** - Code modular dan well-documented - API documentation lengkap - Database backup procedures - Version control (Git) #### 2.2.4 Usability **NFR-009: User Interface** - Responsive design (mobile-friendly) - Intuitive navigation - Accessibility compliance (WCAG 2.1 AA) - Loading feedback (progress indicators) **NFR-010: Documentation** - User manual tersedia - API documentation - Database schema documentation - Installation & deployment guide --- ## 3. ARSITEKTUR SISTEM ### 3.1 Arsitektur Keseluruhan ``` ┌─────────────────────────────────────────────────┐ │ Web Browser (Client-Side) │ │ ┌──────────────────────────────────────────┐ │ │ │ Leaflet.js Map Visualization │ │ │ │ HTML5 Form Inputs │ │ │ │ JavaScript Event Handlers │ │ │ │ Turf.js Spatial Analysis │ │ │ └──────────────────────────────────────────┘ │ └──────────────────┬──────────────────────────────┘ │ AJAX/Fetch │ JSON ┌──────────────────▼──────────────────────────────┐ │ HTTP/REST API (PHP Backend) │ │ ┌──────────────────────────────────────────┐ │ │ │ GET /api/get.php - Retrieve Data │ │ │ │ GET /api/get_point.php │ │ │ │ POST /api/save.php - Create/Read │ │ │ │ POST /api/save_point.php │ │ │ │ POST /api/update.php - Update │ │ │ │ POST /api/update_point.php │ │ │ │ POST /api/delete.php - Delete │ │ │ │ POST /api/delete_point.php │ │ │ └──────────────────────────────────────────┘ │ └──────────────────┬──────────────────────────────┘ │ SQL Queries │ MySQLi Extension ┌──────────────────▼──────────────────────────────┐ │ MySQL Database (webgis_unified) │ │ ┌──────────────────────────────────────────┐ │ │ │ Table: data_unified │ │ │ │ - Point Features (Worship, Poor House) │ │ │ │ - Linear Features (Jalan) │ │ │ │ - Polygon Features (Parsil) │ │ │ │ - Attributes (Sosial, Administratif) │ │ │ └──────────────────────────────────────────┘ │ └─────────────────────────────────────────────────┘ ``` ### 3.2 Tech Stack | Layer | Technology | Version | Purpose | |-------|-----------|---------|---------| | **Frontend** | HTML5 | - | Markup | | | CSS3 | - | Styling | | | JavaScript | ES6+ | Interactivity | | | Leaflet.js | 1.9.4 | Map Library | | | Leaflet.Draw | 1.0.4 | Drawing Tools | | | Turf.js | 6.0+ | Spatial Analysis | | **Backend** | PHP | 7.4+ | Server Logic | | **Database** | MySQL | 5.7+ | Data Storage | | **Server** | Apache | 2.4+ | Web Server | | **Tools** | Git | - | Version Control | --- ## 4. MODEL DATA & SCHEMA DATABASE ### 4.1 Entity Relationship Diagram **Single Unified Table Model:** ``` data_unified ├── id (PK) ├── tipe (ENUM) ├── nama ├── jenis ├── alamat ├── kontak ├── no_wa ├── kegiatan ├── kapasitas ├── radius_meter ├── nama_kepala_keluarga ├── jumlah_anggota ├── kondisi_rumah ├── sumber_penghasilan ├── kebutuhan_prioritas ├── status_bantuan ├── latitude ├── longitude ├── status ├── panjang (untuk jalan) ├── luas (untuk parsil) ├── geom (GeoJSON) ├── created_at └── updated_at ``` ### 4.2 SQL Schema ```sql CREATE TABLE data_unified ( id INT AUTO_INCREMENT PRIMARY KEY, tipe ENUM('point','worship','poor_house','jalan','parsil') NOT NULL DEFAULT 'point', -- Atribut Umum nama VARCHAR(200) NULL, jenis VARCHAR(100) NULL, alamat VARCHAR(255) NULL, kontak VARCHAR(100) NULL, no_wa VARCHAR(50) NULL, status VARCHAR(50) NULL, -- Atribut Rumah Ibadah (Worship) kegiatan VARCHAR(255) NULL, kapasitas INT NULL, radius_meter INT NULL, -- Atribut Rumah Miskin (Poor House) nama_kepala_keluarga VARCHAR(200) NULL, jumlah_anggota INT NULL, kondisi_rumah VARCHAR(100) NULL, sumber_penghasilan VARCHAR(255) NULL, kebutuhan_prioritas VARCHAR(255) NULL, status_bantuan VARCHAR(100) NULL, -- Atribut Geografis latitude DOUBLE NULL, longitude DOUBLE NULL, -- Atribut Jalan & Parsil panjang DECIMAL(10,2) NULL, luas DECIMAL(10,2) NULL, geom TEXT NULL, -- Audit Trail created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- Indexes untuk performa KEY idx_tipe (tipe), KEY idx_status (status), KEY idx_created_at (created_at), FULLTEXT KEY ft_nama (nama), FULLTEXT KEY ft_alamat (alamat) ); ``` ### 4.3 Data Dictionary | Field | Type | Length | Null | Key | Description | |-------|------|--------|------|-----|-------------| | id | INT | - | NO | PK | Unique identifier | | tipe | ENUM | - | NO | - | Data type (worship/poor_house/point/jalan/parsil) | | nama | VARCHAR | 200 | YES | - | Name/label of feature | | jenis | VARCHAR | 100 | YES | - | Category/type (e.g., Masjid, Gereja for worship) | | alamat | VARCHAR | 255 | YES | - | Address/location description | | kontak | VARCHAR | 100 | YES | - | Contact person | | no_wa | VARCHAR | 50 | YES | - | WhatsApp number | | kegiatan | VARCHAR | 255 | YES | - | Activities (for worship places) | | kapasitas | INT | - | YES | - | Capacity (people) | | radius_meter | INT | - | YES | - | Service radius in meters | | nama_kepala_keluarga | VARCHAR | 200 | YES | - | Head of family name | | jumlah_anggota | INT | - | YES | - | Number of family members | | kondisi_rumah | VARCHAR | 100 | YES | - | House condition (sangat buruk/buruk/sedang/baik) | | sumber_penghasilan | VARCHAR | 255 | YES | - | Income source | | kebutuhan_prioritas | VARCHAR | 255 | YES | - | Priority needs for assistance | | status_bantuan | VARCHAR | 100 | YES | - | Assistance status | | latitude | DOUBLE | - | YES | - | Latitude coordinate | | longitude | DOUBLE | - | YES | - | Longitude coordinate | | panjang | DECIMAL | 10,2 | YES | - | Length in meters (roads) | | luas | DECIMAL | 10,2 | YES | - | Area in m² (parcels) | | geom | TEXT | - | YES | - | GeoJSON geometry | | status | VARCHAR | 50 | YES | - | Feature status (aktif/nonaktif/draf) | | created_at | DATETIME | - | NO | - | Record creation timestamp | | updated_at | DATETIME | - | NO | - | Last update timestamp | --- ## 5. ENDPOINT API DOCUMENTATION ### 5.1 Base Configuration - **Base URL:** `http://localhost/webgis/` - **Content-Type:** `application/json` - **Response Format:** JSON ### 5.2 API Endpoints #### 5.2.1 GET Endpoints **GET /get.php** - Retrieve All Data ``` GET /get.php Response: { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {...}, "properties": {...} } ] } Status Codes: - 200: Success - 500: Server error ``` **GET /get_point.php** - Retrieve Specific Point Types ``` GET /get_point.php?tipe=worship Query Parameters: - tipe: worship|poor_house|point Response: Same as above ``` #### 5.2.2 POST Endpoints **POST /save.php** - Create New Feature ``` POST /save.php Content-Type: application/json Request Body: { "tipe": "worship|poor_house|point|jalan|parsil", "nama": "string", "jenis": "string", "alamat": "string", "latitude": number, "longitude": number, "geom": "GeoJSON string (for line/polygon)", ... other attributes based on tipe } Response: { "success": true, "id": number, "message": "Data saved successfully" } Status Codes: - 200: Success - 400: Bad request (validation error) - 500: Server error ``` **POST /update.php** - Update Existing Feature ``` POST /update.php Content-Type: application/json Request Body: { "id": number, "tipe": "string", "nama": "string", ... other fields to update } Response: { "success": true, "message": "Data updated successfully" } ``` **POST /delete.php** - Delete Feature ``` POST /delete.php Content-Type: application/json Request Body: { "id": number } Response: { "success": true, "message": "Data deleted successfully" } ``` --- ## 6. USE CASES ### 6.1 Use Case Diagram ``` ┌──────────────────────────────┐ │ WebGIS System Actor │ └────────────┬─────────────────┘ │ ┌────────┼────────┐ │ │ │ ▼ ▼ ▼ ┌─────────────────────────────────┐ │ Petugas Pendataan / Admin │ │ - View Map │ │ - Add Point/Line/Polygon │ │ - Edit Features │ │ - Delete Features │ │ - Export Data │ │ - View Analytics │ └─────────────────────────────────┘ ``` ### 6.2 Use Case Descriptions **UC-001: Menampilkan Peta** - Actor: Petugas Pendataan - Precondition: User membuka aplikasi - Main Flow: 1. System loads map with OSM basemap 2. Display administrative areas from GeoJSON 3. Load existing data points from database 4. Display different markers based on tipe - Postcondition: Map displayed with all data **UC-002: Menambahkan Data Rumah Ibadah** - Actor: Petugas Pendataan - Precondition: Map is loaded - Main Flow: 1. User selects "Rumah Ibadah" from type dropdown 2. Set radius value 3. Click on map to place marker 4. Enter data form (nama, jenis, alamat, etc.) 5. Click Save 6. System validates data 7. System saves to database 8. Update map with new marker 9. Display success message - Alternative: Cancel before save - Postcondition: New data saved and displayed **UC-003: Edit Data** - Actor: Petugas Pendataan - Main Flow: 1. Click on existing marker 2. View/edit form 3. Modify values 4. Optionally drag marker to new location 5. Click Update 6. System validates 7. System updates database 8. Update map display - Postcondition: Data updated **UC-004: Analisis Proximity** - Actor: Admin/Pengambil Keputusan - Main Flow: 1. View analysis report 2. System calculates poor houses within worship radius 3. Display statistics 4. Show on map with visual clustering - Postcondition: Analysis results displayed --- ## 7. KEBUTUHAN DATA & DATABASE ### 7.1 Data Population **Initial Data Required:** - Administrative boundaries (Kecamatan level) - GeoJSON - Reference data for house conditions - Reference data for assistance types - Reference data for income sources **Sample Data:** - 100-1000 test records untuk UAT - Mix of all data types - Various conditions and statuses ### 7.2 Database Backup & Recovery **Backup Strategy:** - Daily automatic backup at 2:00 AM - Weekly full backup on Sunday - Monthly archive backup - Store backups locally and on network drive **Recovery Procedure:** - Documented restore procedure - Test restore monthly - RTO: 1 hour - RPO: 1 day --- ## 8. FASE IMPLEMENTASI ### Phase 1: Setup & Database (Week 1) - [x] Database design finalization - [ ] Database creation & migration scripts - [ ] User management tables (if needed) - [ ] Initial data loading ### Phase 2: API Development (Week 1-2) - [ ] Implement CRUD endpoints - [ ] Data validation layer - [ ] Error handling - [ ] API testing ### Phase 3: Frontend Enhancement (Week 2-3) - [ ] UI/UX improvements - [ ] Form validation enhancement - [ ] Data visualization enhancements - [ ] Mobile responsiveness ### Phase 4: Analysis & Reporting (Week 3) - [ ] Proximity analysis implementation - [ ] Statistics calculations - [ ] Report generation - [ ] Data export features ### Phase 5: Testing & QA (Week 4) - [ ] Unit testing - [ ] Integration testing - [ ] UAT with stakeholders - [ ] Performance testing ### Phase 6: Deployment & Documentation (Week 4-5) - [ ] Production deployment - [ ] User training - [ ] Documentation finalization - [ ] Knowledge transfer --- ## 9. TESTING STRATEGY ### 9.1 Unit Testing - Test individual PHP functions - Test validation rules - Test data transformations ### 9.2 Integration Testing - Test API endpoints - Test database operations - Test data flow ### 9.3 System Testing - End-to-end workflows - Performance testing (load testing) - Security testing ### 9.4 User Acceptance Testing (UAT) - Test with actual users - Verify requirements met - Collect feedback ### 9.5 Test Coverage - Target: Minimum 80% code coverage - Critical paths: 100% coverage - Tools: PHPUnit for PHP testing --- ## 10. MAINTENANCE & SUPPORT ### 10.1 Maintenance Plan **Preventive Maintenance:** - Monthly database optimization - Weekly log review - Quarterly backup restoration tests **Corrective Maintenance:** - Bug fixes within 24 hours (critical) - Bug fixes within 1 week (normal) - Security patches immediately ### 10.2 Support Levels | Priority | Response Time | Resolution Target | |----------|---------------|------------------| | Critical | 1 hour | 4 hours | | High | 4 hours | 1 day | | Medium | 1 day | 1 week | | Low | 3 days | 2 weeks | --- ## 11. CHANGE LOG | Version | Date | Author | Changes | |---------|------|--------|---------| | 1.0 | May 2026 | Development Team | Initial SKPL/SRS document | | | | | - Complete system requirements | | | | | - Database schema | | | | | - API documentation | | | | | - Implementation plan | --- ## 12. APPENDIX ### 12.1 Glossary - **GIS**: Geographic Information System - **Poverty Mapping**: Pemetaan Kemiskinan - **Kecamatan**: District (administrative division) - **Rumah Ibadah**: Worship place (mosque, church, etc.) - **Geom**: Geometry (spatial data representation) - **GeoJSON**: JSON format for geographic data ### 12.2 References - Leaflet.js Documentation: https://leafletjs.com/ - OpenStreetMap: https://www.openstreetmap.org/ - MySQL Documentation: https://dev.mysql.com/ - PHP MySQLi: https://www.php.net/manual/en/book.mysqli.php - GeoJSON Specification: https://geojson.org/ ### 12.3 Approval | Role | Name | Signature | Date | |------|------|-----------|------| | Project Manager | - | - | - | | Technical Lead | - | - | - | | Client Representative | - | - | - | --- **Document End** *Dokumen ini bersifat rahasia dan hanya untuk penggunaan internal. Reproduksi tanpa persetujuan dilarang.*