314 lines
8.4 KiB
Markdown
314 lines
8.4 KiB
Markdown
# Dokumentasi Layer Groups dan Layers Control untuk SPBU Manager
|
|
|
|
## 📋 Daftar Isi
|
|
1. [Overview](#overview)
|
|
2. [Fitur Utama](#fitur-utama)
|
|
3. [Implementasi Teknis](#implementasi-teknis)
|
|
4. [Cara Penggunaan](#cara-penggunaan)
|
|
5. [Struktur Kode](#struktur-kode)
|
|
6. [Troubleshooting](#troubleshooting)
|
|
|
|
---
|
|
|
|
## Overview
|
|
|
|
Aplikasi manajemen data SPBU ini menggunakan **Leaflet Layer Groups** dan **Layers Control** untuk memungkinkan pengguna mengorganisir dan memfilter data SPBU berdasarkan jam operasionalnya.
|
|
|
|
### Tujuan Implementasi
|
|
- ✅ Memisahkan data SPBU 24 Jam dan SPBU Limited Hours ke dalam layer terpisah
|
|
- ✅ Memberikan kontrol kepada pengguna untuk menampilkan/menyembunyikan setiap layer
|
|
- ✅ Meningkatkan user experience dengan interface yang intuitif
|
|
- ✅ Memudahkan visualisasi dan analisis data spasial
|
|
|
|
---
|
|
|
|
## Fitur Utama
|
|
|
|
### 1. **Dual Layer Groups**
|
|
Aplikasi memiliki 2 layer groups utama:
|
|
|
|
| Layer | Keterangan | Ikon |
|
|
|-------|-----------|------|
|
|
| **SPBU 24 Jam** | Stasiun yang buka 24 jam setiap hari | 🕐 |
|
|
| **SPBU Limited Hours** | Stasiun dengan jam operasional terbatas | ⏰ |
|
|
|
|
### 2. **Interactive Layers Control**
|
|
- Terletak di sudut kanan atas peta
|
|
- Menampilkan checkbox untuk setiap layer
|
|
- Memungkinkan toggle layer dengan mudah
|
|
- Simpan state layer saat navigasi peta
|
|
|
|
### 3. **Dynamic Marker Categorization**
|
|
Marker SPBU otomatis dikelompokkan ke layer yang sesuai berdasarkan:
|
|
- Nilai `open_24_hours` di database
|
|
- Status saat ditambahkan pengguna
|
|
- Update real-time saat data berubah
|
|
|
|
---
|
|
|
|
## Implementasi Teknis
|
|
|
|
### 1. **Inisialisasi Layer Groups** (dalam `initMap()`)
|
|
|
|
```javascript
|
|
// Membuat layer groups
|
|
spbu24HoursLayer = L.layerGroup();
|
|
spbuLimitedHoursLayer = L.layerGroup();
|
|
|
|
// Menambahkan ke peta secara default
|
|
spbu24HoursLayer.addTo(map);
|
|
spbuLimitedHoursLayer.addTo(map);
|
|
|
|
// Membuat layers control
|
|
layerControl = L.control.layers(baseLayers, overlayLayers, {
|
|
position: 'topright',
|
|
collapsed: false
|
|
}).addTo(map);
|
|
```
|
|
|
|
### 2. **Struktur Data Marker**
|
|
|
|
Sebelumnya:
|
|
```javascript
|
|
markers[id] = marker;
|
|
```
|
|
|
|
Sesudah (dengan layer groups):
|
|
```javascript
|
|
markers[id] = {
|
|
marker: marker,
|
|
open_24_hours: open_24_hours
|
|
};
|
|
```
|
|
|
|
### 3. **Penambahan Marker ke Layer** (dalam `displayMarker()`)
|
|
|
|
```javascript
|
|
if (open_24_hours) {
|
|
spbu24HoursLayer.addLayer(marker);
|
|
} else {
|
|
spbuLimitedHoursLayer.addLayer(marker);
|
|
}
|
|
```
|
|
|
|
### 4. **Penghapusan Marker dari Layer** (dalam `deleteMarker()`)
|
|
|
|
```javascript
|
|
if (markerData.open_24_hours) {
|
|
spbu24HoursLayer.removeLayer(markerData.marker);
|
|
} else {
|
|
spbuLimitedHoursLayer.removeLayer(markerData.marker);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Cara Penggunaan
|
|
|
|
### Untuk Pengguna
|
|
|
|
#### 1. **Menampilkan/Menyembunyikan Layer**
|
|
- Cari kotak **Layers Control** di sudut kanan atas peta
|
|
- Lihat checkbox untuk:
|
|
- ☑️ **🕐 SPBU 24 Jam** - SPBU yang buka 24 jam
|
|
- ☑️ **⏰ SPBU Limited Hours** - SPBU dengan jam terbatas
|
|
- Klik checkbox untuk menampilkan/menyembunyikan layer
|
|
- Perubahan terjadi secara instant di peta
|
|
|
|
#### 2. **Menambahkan SPBU**
|
|
1. Klik tombol "+ Add Point Manually" atau langsung klik di peta
|
|
2. Isi detail SPBU di modal form
|
|
3. Centang checkbox "Open 24 Hours" jika SPBU buka 24 jam
|
|
4. Klik "Save" untuk menyimpan
|
|
5. Marker akan otomatis masuk ke layer yang sesuai
|
|
|
|
#### 3. **Menghapus SPBU**
|
|
1. Klik marker SPBU di peta
|
|
2. Popup akan muncul
|
|
3. Klik tombol "Delete" untuk menghapus
|
|
4. Konfirmasi penghapusan
|
|
5. Marker akan dihapus dari layer
|
|
|
|
### Untuk Developer
|
|
|
|
#### 1. **Mengakses Layer Groups**
|
|
|
|
```javascript
|
|
// Menambahkan marker ke SPBU 24 Hours
|
|
spbu24HoursLayer.addLayer(marker);
|
|
|
|
// Menghapus marker dari SPBU Limited Hours
|
|
spbuLimitedHoursLayer.removeLayer(marker);
|
|
|
|
// Mendapatkan jumlah markers di layer
|
|
const count24h = spbu24HoursLayer.getLayers().length;
|
|
const countLimited = spbuLimitedHoursLayer.getLayers().length;
|
|
```
|
|
|
|
#### 2. **Mengakses Layers Control**
|
|
|
|
```javascript
|
|
// Menambahkan layer baru ke layers control
|
|
const newLayer = L.layerGroup();
|
|
layerControl.addOverlay(newLayer, 'Layer Name');
|
|
|
|
// Menghapus layer dari layers control
|
|
layerControl.removeLayer(newLayer);
|
|
```
|
|
|
|
---
|
|
|
|
## Struktur Kode
|
|
|
|
### File yang Dimodifikasi
|
|
|
|
#### 1. **app.js**
|
|
|
|
**Deklarasi Global:**
|
|
```javascript
|
|
let spbu24HoursLayer; // Layer untuk SPBU 24 jam
|
|
let spbuLimitedHoursLayer; // Layer untuk SPBU limited hours
|
|
let layerControl; // Kontrol layer
|
|
```
|
|
|
|
**Fungsi Utama yang Dimodifikasi:**
|
|
- `initMap()` - Menginisialisasi layer groups dan layers control
|
|
- `displayMarker()` - Menambahkan marker ke layer yang sesuai
|
|
- `deleteMarker()` - Menghapus marker dari layer
|
|
- `loadMarkers()` - Load semua markers dan masukkan ke layer masing-masing
|
|
|
|
#### 2. **style.css**
|
|
|
|
**CSS Baru untuk Layers Control:**
|
|
```css
|
|
/* Styling untuk Leaflet layers control */
|
|
.leaflet-control-layers { }
|
|
.leaflet-control-layers-toggle { }
|
|
.leaflet-control-layers-expanded { }
|
|
.leaflet-control-layers label { }
|
|
.leaflet-control-layers input[type="checkbox"] { }
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### ❌ Markers tidak muncul setelah ditambahkan
|
|
|
|
**Penyebab:** Layer tidak ditambahkan ke peta atau marker ditambahkan ke layer yang tidak ditampilkan
|
|
**Solusi:**
|
|
1. Pastikan checkbox layer di Layers Control tercentang
|
|
2. Buka Developer Console (F12) dan periksa error
|
|
3. Pastikan database berhasil menyimpan data
|
|
|
|
### ❌ Layers Control tidak muncul
|
|
|
|
**Penyebab:**
|
|
- Leaflet library tidak ter-load dengan benar
|
|
- CSS Leaflet tidak ter-include
|
|
- JavaScript error di console
|
|
|
|
**Solusi:**
|
|
1. Periksa file `index.html` apakah Leaflet CDN sudah di-include
|
|
2. Buka DevTools dan periksa Network tab untuk file CDN
|
|
3. Lihat Console tab untuk error messages
|
|
|
|
### ❌ Marker hilang saat menghapus
|
|
|
|
**Penyebab:** Marker dihapus dari layer tapi masih di-reference di objek `markers`
|
|
|
|
**Solusi:**
|
|
Kode sudah fixed di `deleteMarker()`:
|
|
```javascript
|
|
delete markers[id]; // Menghapus reference
|
|
markerCount--; // Update counter
|
|
```
|
|
|
|
### ❌ Layer tidak bisa di-toggle
|
|
|
|
**Penyebab:** Layer control JavaScript error atau layer tidak di-add ke control
|
|
|
|
**Solusi:**
|
|
1. Periksa browser console (F12) untuk error
|
|
2. Pastikan `layerControl.addOverlay()` dipanggil dengan parameter yang benar
|
|
3. Reload halaman dan coba lagi
|
|
|
|
---
|
|
|
|
## Tips & Tricks
|
|
|
|
### 1. **Performance Optimization**
|
|
Jika ada banyak markers (> 1000), pertimbangkan:
|
|
- Menggunakan Leaflet.markercluster plugin untuk clustering
|
|
- Membagi markers ke sub-layers tambahan
|
|
- Lazy loading markers berdasarkan zoom level
|
|
|
|
### 2. **Extend Functionality**
|
|
Anda bisa menambahkan layer groups baru untuk kategorisasi lainnya:
|
|
|
|
```javascript
|
|
let spbuPromineLayer = L.layerGroup();
|
|
let spbuRegularLayer = L.layerGroup();
|
|
|
|
// Kemudian add ke control:
|
|
layerControl.addOverlay(spbuPromineLayer, '⭐ SPBU Premium');
|
|
layerControl.addOverlay(spbuRegularLayer, '🏢 SPBU Regular');
|
|
```
|
|
|
|
### 3. **Styling Markers Berbeda Per Layer**
|
|
```javascript
|
|
// Marker SPBU 24 Jam dengan warna berbeda
|
|
if (open_24_hours) {
|
|
const greenIcon = L.icon({
|
|
iconUrl: 'images/green-marker.png',
|
|
iconSize: [25, 41]
|
|
});
|
|
marker.setIcon(greenIcon);
|
|
}
|
|
```
|
|
|
|
### 4. **Export Data Per Layer**
|
|
```javascript
|
|
// Export hanya SPBU 24 Jam
|
|
const layers24h = spbu24HoursLayer.getLayers();
|
|
const data = layers24h.map(marker => ({
|
|
lat: marker.getLatLng().lat,
|
|
lng: marker.getLatLng().lng,
|
|
popup: marker.getPopup().getContent()
|
|
}));
|
|
```
|
|
|
|
---
|
|
|
|
## API Reference
|
|
|
|
### Layer Group Methods
|
|
|
|
| Method | Deskripsi | Contoh |
|
|
|--------|-----------|--------|
|
|
| `addLayer(layer)` | Tambah layer | `spbu24HoursLayer.addLayer(marker)` |
|
|
| `removeLayer(layer)` | Hapus layer | `spbu24HoursLayer.removeLayer(marker)` |
|
|
| `getLayers()` | Dapatkan semua layers | `spbu24HoursLayer.getLayers()` |
|
|
| `addTo(map)` | Add layer group ke peta | `spbu24HoursLayer.addTo(map)` |
|
|
| `clearLayers()` | Hapus semua layers | `spbu24HoursLayer.clearLayers()` |
|
|
|
|
### Layers Control Methods
|
|
|
|
| Method | Deskripsi | Contoh |
|
|
|--------|-----------|--------|
|
|
| `addOverlay(layer, name)` | Tambah overlay layer | `layerControl.addOverlay(layer, 'Name')` |
|
|
| `removeLayer(layer)` | Hapus layer dari control | `layerControl.removeLayer(layer)` |
|
|
| `addBaseLayer(layer, name)` | Tambah base layer | `layerControl.addBaseLayer(layer, 'Base')` |
|
|
|
|
---
|
|
|
|
## Kesimpulan
|
|
|
|
Implementasi Layer Groups dan Layers Control memberikan:
|
|
✅ Interface yang lebih intuitif dan user-friendly
|
|
✅ Kontrol yang lebih baik terhadap visualisasi data
|
|
✅ Performa yang optimal dengan grouping
|
|
✅ Scalability untuk menambah kategori baru
|
|
|
|
Untuk pertanyaan lebih lanjut atau improvements, silakan modify code sesuai kebutuhan!
|