Implementasi Geofencing pada Sistem Absensi Online: Cara Membatasi Area Absen dengan Polygon Map di CodeIgniter 4
Di era kerja fleksibel dan sistem hybrid, banyak perusahaan menghadapi masalah klasik: karyawan bisa melakukan absensi dari luar area kerja yang seharusnya. Meskipun sudah menggunakan sistem berbasis GPS, tanpa pembatasan wilayah yang jelas, titik koordinat tetap bisa dimanipulasi atau dilakukan dari radius yang terlalu luas. Inilah celah yang sering dimanfaatkan dalam sistem absensi online konvensional.
Transformasi digital di Indonesia terus meningkat. Berdasarkan tren digitalisasi HR dalam beberapa tahun terakhir, lebih dari 70% perusahaan skala menengah mulai beralih ke sistem presensi digital berbasis web dan mobile. Namun, hanya sebagian kecil yang benar-benar menerapkan validasi lokasi berbasis geofencing polygon. Padahal, teknologi ini mampu membatasi area absen secara presisi menggunakan peta interaktif.
Jika Anda sudah membaca tutorial utama tentang Absensi Foto GPS Berdasarkan Titik Poin Absen Menggunakan CodeIgniter 4, Leaflet, JS, maka artikel ini adalah pengembangan lanjutan untuk meningkatkan keamanan sistem Anda. Di sini kita akan membahas bagaimana membuat pembatasan area absen menggunakan polygon map (geofencing) di CodeIgniter 4 dengan integrasi Leaflet JS.
Apa Itu Geofencing dalam Sistem Absensi?
Geofencing adalah teknik membuat batas wilayah virtual pada peta digital. Dalam konteks absensi online berbasis GPS, geofencing memungkinkan sistem hanya menerima absensi jika posisi pengguna berada di dalam area yang telah ditentukan.
Berbeda dengan validasi radius (lingkaran), polygon memberikan fleksibilitas lebih tinggi karena dapat mengikuti bentuk gedung, kawasan industri, atau area kampus secara presisi.
Konsep Implementasi di CodeIgniter 4
Secara umum, alur sistemnya adalah:
- Admin menentukan area polygon di peta
- Koordinat polygon disimpan ke database
- Saat user absen, sistem membaca latitude dan longitude
- Sistem mengecek apakah titik berada di dalam polygon
- Jika valid → absensi diterima
- Jika tidak → ditolak
Struktur Database
CREATE TABLE geofence_areas ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), coordinates TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); {codeBox}
Field coordinates akan menyimpan JSON array titik polygon.
View Leaflet untuk Menentukan Polygon
<div id="map" style="height:500px;"></div> <link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css"/> <script src="https://unpkg.com/leaflet/dist/leaflet.js"></script> <script src="https://unpkg.com/leaflet-draw/dist/leaflet.draw.js"></script> <script> var map = L.map('map').setView([-6.200000, 106.816666], 15); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, }).addTo(map); var drawnItems = new L.FeatureGroup(); map.addLayer(drawnItems); var drawControl = new L.Control.Draw({ edit: { featureGroup: drawnItems }, draw: { polygon: true, rectangle: false, circle: false, marker: false } }); map.addControl(drawControl); map.on('draw:created', function (e) { var layer = e.layer; drawnItems.addLayer(layer); var coordinates = layer.getLatLngs()[0]; document.getElementById('coordinates').value = JSON.stringify(coordinates); }); </script> <input type="hidden" id="coordinates" name="coordinates"> {codeBox}
Controller CodeIgniter 4
public function saveArea() { $coordinates = $this->request->getPost('coordinates'); $this->geofenceModel->save([ 'name' => 'Area Kantor', 'coordinates' => $coordinates ]); return redirect()->back()->with('success', 'Area berhasil disimpan'); } {codeBox}
Validasi Titik dalam Polygon (Point in Polygon Algorithm)
function pointInPolygon($point, $polygon) { $x = $point['lat']; $y = $point['lng']; $inside = false; for ($i = 0, $j = count($polygon) - 1; $i < count($polygon); $j = $i++) { $xi = $polygon[$i]['lat']; $yi = $polygon[$i]['lng']; $xj = $polygon[$j]['lat']; $yj = $polygon[$j]['lng']; $intersect = (($yi > $y) != ($yj > $y)) && ($x < ($xj - $xi) * ($y - $yi) / ($yj - $yi) + $xi); if ($intersect) $inside = !$inside; } return $inside; } {codeBox}
Integrasi Saat User Absen
public function absen() { $lat = $this->request->getPost('lat'); $lng = $this->request->getPost('lng'); $area = $this->geofenceModel->first(); $polygon = json_decode($area['coordinates'], true); $point = ['lat' => $lat, 'lng' => $lng]; if ($this->pointInPolygon($point, $polygon)) { // simpan absensi return "Absensi berhasil"; } else { return "Anda berada di luar area absen"; } } {codeBox}
Keunggulan Geofencing Polygon Dibanding Radius
- Lebih presisi mengikuti bentuk bangunan
- Mengurangi potensi manipulasi lokasi
- Cocok untuk kawasan industri atau kampus luas
- Bisa dikombinasikan dengan validasi foto GPS
Untuk sistem yang lebih lengkap dengan validasi foto selfie dan titik poin akurat, Anda bisa membaca panduan utama di sini:
Implementasi Absensi Foto GPS Berdasarkan Titik Poin Menggunakan CodeIgniter 4 dan Leaflet JS
Strategi SEO dan Optimasi Sistem
Jika Anda mengembangkan sistem absensi berbasis web untuk kebutuhan komersial, kombinasikan fitur berikut:
- Geofencing polygon
- Validasi radius cadangan
- Absensi foto berbasis kamera
- Timestamp server
- Validasi perangkat
Kombinasi tersebut akan meningkatkan keamanan sistem presensi digital dan mencegah praktik titip absen.
Baca juga: Cara Integrasi Leaflet dan HTML5 Geolocation untuk Absensi Foto Otomatis Berbasis Titik Koordinat
Kesimpulan
Geofencing polygon adalah solusi cerdas untuk meningkatkan validasi lokasi dalam sistem absensi online berbasis CodeIgniter 4. Dengan memanfaatkan Leaflet JS dan algoritma point-in-polygon, sistem dapat membatasi area presensi secara presisi dan fleksibel.
Jika sebelumnya Anda sudah menerapkan sistem titik poin berbasis GPS, maka implementasi geofencing ini adalah upgrade logis berikutnya. Integrasi kedua metode tersebut akan menghasilkan sistem absensi modern yang aman, akurat, dan siap digunakan dalam skala perusahaan.
Silakan lanjutkan eksplorasi sistem absensi lengkap berbasis foto dan titik koordinat pada artikel utama agar implementasi Anda semakin maksimal.
