xdiego1st / laravel-mapku
Enterprise-grade Reusable GIS & Interactive Mapping Package for Laravel based on MapLibre GL JS, featuring Built-in Tile Proxy, Multi-Instance Isolation, and Dynamic Boundary Management.
Package info
github.com/xDiego1st/laravel-mapku
Language:JavaScript
pkg:composer/xdiego1st/laravel-mapku
Requires
- php: ^8.2 || ^8.3 || ^8.4 || ^8.5
- illuminate/http: ^10.0 || ^11.0 || ^12.0 || ^13.0
- illuminate/support: ^10.0 || ^11.0 || ^12.0 || ^13.0
- illuminate/view: ^10.0 || ^11.0 || ^12.0 || ^13.0
Requires (Dev)
- orchestra/testbench: ^8.0 || ^9.0 || ^10.0
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Enterprise-grade GIS & Real-time Live Tracking Interactive Mapping Package for Laravel 10, 11, 12, dan 13 based on MapLibre GL JS, featuring Built-in Tile Proxy Caching (Anti-CORS), Multi-Instance Isolation, Dynamic GeoJSON Boundary Management, Real-time Fleet Tracking, and High-Performance Glassmorphism UI.
🚀 Fitur Utama
- Framework-Native & Modern: Mendukung PHP 8.2+ dan Laravel 10, 11, 12, hingga 13.
- GPU-Accelerated WebGL Rendering: MapLibre GL JS engine memberikan rendering 60 FPS yang sangat halus dan responsif.
- 7 Lapisan Basemap Premium:
- Google Satellite HD
- Google Hybrid
- OpenStreetMap
- Esri World Imagery
- Dark Mode (CartoDB Dark Matter)
- Topografi (OpenTopoMap)
- Drone Orthophoto (Esri Clarity)
- Built-in Server-Side Tile Proxy: Solusi permanen mengatasi masalah CORS dan peta blank pada Superapp Webview (Android/iOS) dengan caching 7 hari di disk server.
- Real-Time Fleet & Live Tracking (
marker-type="truck"):- Pin armada kendaraan custom DOM dengan Pulsating Radar Beacon animasi radar sinyal.
- Dukungan rotasi arah kompas (heading) secara real-time.
- Sinkronisasi instan via Laravel Echo / WebSockets (
updateEntityLocation()). - Label kode armada presisi tengah bawah tanpa lag atau jitter saat zoom.
- Interactive Spatial Inspector: Telemetri koordinat (Latitude, Longitude), level zoom, dan Point-in-Polygon (PIP) deteksi kecamatan/kelurahan saat kursor bergerak.
- Collapsible Glassmorphism Legend Panel: Kartu legenda modern dengan hitungan otomatis per kategori dan pencegahan teks overflow.
- Floating Telemetry Command Bar: Status ringkasan jumlah armada/aset per status dengan badge interaktif.
- Omni Search & Complex Filter Drawer: Pencarian instan berdasarkan ID, nama titik, wilayah, status, dan kategori.
- Theme Customizer 2.0: Preset warna (Sky, Emerald, Amber, Rose, Violet, Cyan, Slate) dengan slider real-time untuk opacity, blur, saturasi, dan border.
- Multi-Instance Isolation: Mendukung banyak peta dalam satu halaman web tanpa tabrakan event listener atau state.
📦 Instalasi
Install package melalui Composer:
composer require xdiego1st/laravel-mapku
Publikasikan file konfigurasi dan aset statis (CSS, JS, Fonts):
php artisan vendor:publish --tag=mapping-config php artisan vendor:publish --tag=mapping-assets --force
🛠️ Penggunaan Dasar
1. Memuat Asset di Blade Layout
Tambahkan direktif @mappingStyles di <head> dan @mappingScripts sebelum penutup </body>:
<!DOCTYPE html> <html lang="id"> <head> <meta charset="utf-8"> <title>Peta Spasial</title> @mappingStyles </head> <body class="w-full h-full"> {{ $slot }} @mappingScripts </body> </html>
2. Komponen Peta Standar (GIS / Titik Aset)
<x-mapping-map id="peta-aset-utama" height="100vh" width="100%" :center="['lat' => 0.507068, 'lng' => 101.447779]" :zoom="12" :markers="$markers" :categories="['CCTV', 'PDAM', 'PEMDA']" theme="sky" :enable-spatial-inspector="true" :enable-legend="true" :enable-telemetry="true" :enable-gis-controls="true" />
🚛 Real-Time Fleet & Live Tracking Armada
Untuk pelacakan armada kendaraan dinas, truk logistik, atau ambulans secara real-time:
1. Definisi di Blade / Livewire
Gunakan atribut marker-type="truck":
<div wire:ignore class="w-full h-screen"> <x-mapping-map id="armada-tracking-map" height="100vh" width="100vw" :center="['lat' => 0.533000, 'lng' => 101.448000]" :zoom="13" :markers="$markers" :categories="['DALAM_PERJALANAN', 'SAMPAI_LOKASI', 'PROSES_PENGERJAAN', 'DITUGASKAN', 'SIAGA']" marker-type="truck" :telemetry-metrics="[ ['key' => 'DALAM_PERJALANAN', 'label' => 'Dalam Perjalanan', 'color' => 'blue'], ['key' => 'SAMPAI_LOKASI', 'label' => 'Sampai Lokasi', 'color' => 'amber'], ['key' => 'PROSES_PENGERJAAN', 'label' => 'Proses Pengerjaan', 'color' => 'emerald'], ['key' => 'DITUGASKAN', 'label' => 'Ditugaskan', 'color' => 'purple'], ['key' => 'SIAGA', 'label' => 'Siaga di Pool', 'color' => 'slate'], ]" brand-title="Live Tracking Armada" brand-badge="UPT" theme="sky" :enable-spatial-inspector="true" :enable-legend="true" :enable-telemetry="true" :enable-detail-drawer="true" /> </div>
2. Format Marker Tracking
Kirimkan array marker dengan struktur berikut:
$markers[] = [ 'id' => 'armada_1', 'title' => 'TRUK-01', 'subtitle' => 'Budi Santoso (Supir)', 'category' => 'DALAM_PERJALANAN', 'status' => 'aktif', 'status_color' => 'blue', // blue, amber, emerald, purple, slate 'lat' => 0.512345, 'lng' => 101.456789, 'marker_type' => 'truck', 'extra' => [ 'armada_code' => 'TRK-01', 'heading' => 85, // Derajat rotasi arah kompas (0 - 360) 'speed_kmh' => 45, 'plate_number' => 'BM 1234 PAL', 'color' => '#2563eb', ], 'attributes' => [ 'Supir' => 'Budi Santoso', 'Kontak' => '0812-3456-7890', 'Kecepatan' => '45 km/jam', 'Status' => 'Meluncur ke Lokasi Pemohon', ] ];
3. Pembaruan Real-Time via JavaScript API
Dapatkan instance peta dan jalankan method updateEntityLocation() saat menerima broadcast event (misal via Laravel Echo):
window.Echo.channel('armada.1') .listen('.ArmadaLocationUpdated', (e) => { window.LaravelMapping.get('armada-tracking-map')?.updateEntityLocation( 'armada_' + e.armada_id, // ID Marker parseFloat(e.lat), // Latitude parseFloat(e.lng), // Longitude parseFloat(e.speed_kmh), // Kecepatan (opsional) parseFloat(e.heading) // Arah Rotasi Derajat (opsional) ); });
🎨 Mengganti Batas Wilayah (GeoJSON Boundary)
Di file config/mapping.php:
'boundary' => [ 'enabled' => true, 'name' => 'Kota Pekanbaru', 'source' => 'resources/geojson/pekanbaru.geojson', 'fit_bounds' => true, 'endpoints' => [ 'kota' => '/api/mapping/boundary/kota', 'kecamatan' => '/api/mapping/boundary/kecamatan', 'kelurahan' => '/api/mapping/boundary/kelurahan', ], ],
💡 Best Practices & Solusi Troubleshooting
1. Menghindari Layar Hitam / Blank Saat Polling di Livewire
Bungkus komponen <x-mapping-map> di dalam container yang memiliki atribut wire:ignore:
<div wire:ignore class="w-full h-full"> <x-mapping-map ... /> </div>
Ini mencegah mekanisme DOM Morphing bawaan Livewire mereset canvas WebGL MapLibre saat terjadi re-render server state.
2. Posisi Marker Bebas & Smooth Tanpa Lag Saat Zooming
Pada versi v1.0.5, seluruh wrapper marker truk custom DOM diatur dengan:
position: absolute !important; top: 0 !important; left: 0 !important;- Menggunakan
will-change: transform;tanpatransition: transformpada elemen pembungkus root. Hal ini menjamin MapLibre GL JS dapat menggerakkan seluruh pin armada dengan performa 60 FPS WebGL canvas camera tanpa keterlambatan (lag/jitter) atau tumpukan kolom vertikal 48px.
3. Teks Legenda Terbungkus Rapi
Kontainer Legenda Map diatur dengan width: 250px, box-sizing: border-box, dan teks bantuan wrapping otomatis di dalam card glassmorphism agar tidak meluap ke luar card atau menabrak pill telemetri bawah.
📄 Lisensi
Paket ini dirilis di bawah lisensi MIT License. Dikembangkan oleh Rasyid Abdul Halim, S.Tr.Kom untuk ekosistem aplikasi geospasial modern di Indonesia.