var map, marker, streetLayer, satelliteLayer, labelsLayer, hybridLayer; function initMap() { // console.log("πŸš€ initMap() dipanggil"); var latitudeInput = document.getElementById('latitude').value; var longitudeInput = document.getElementById('longitude').value; // console.log("πŸ“ Input awal:", latitudeInput, longitudeInput); // Kalau input sudah ada β†’ pakai itu if (latitudeInput && longitudeInput) { var pos = { lat: parseFloat(latitudeInput), lng: parseFloat(longitudeInput) }; // console.log("βœ… Pakai input manual:", pos); initMapWithPos(pos); } else { // Kalau kosong β†’ coba geolocation if (navigator.geolocation) { // console.log("πŸ“‘ Mencoba geolocation..."); navigator.geolocation.getCurrentPosition(function(position) { var pos = { lat: position.coords.latitude, lng: position.coords.longitude }; // console.log("βœ… Geolocation berhasil:", pos); initMapWithPos(pos); updateFormInputs(pos.lat, pos.lng); }, function() { console.warn("⚠️ Geolocation gagal, fallback ke Jakarta"); handleLocationError(true); initMapWithPos({ lat: -6.2, lng: 106.816666 }); }); } else { console.warn("⚠️ Browser tidak support geolocation, fallback ke Jakarta"); handleLocationError(false); initMapWithPos({ lat: -6.2, lng: 106.816666 }); } } } function initMapWithPos(pos) { // console.log("πŸ—ΊοΈ initMapWithPos() dengan posisi:", pos); // Base layers streetLayer = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: 'Β© OpenStreetMap contributors' }); satelliteLayer = L.tileLayer( 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}', { attribution: 'Tiles Β© Esri' }); labelsLayer = L.tileLayer( 'https://server.arcgisonline.com/ArcGIS/rest/services/Reference/World_Transportation/MapServer/tile/{z}/{y}/{x}', { attribution: 'Labels Β© Esri' }); // Gabungkan satelit + jalan β†’ Hybrid hybridLayer = L.layerGroup([satelliteLayer, labelsLayer]); // Init map map = L.map('map', { center: [pos.lat, pos.lng], zoom: 17, layers: [hybridLayer], fullscreenControl: true, fullscreenControlOptions: { position: 'topleft' } }); // console.log("βœ… Map berhasil dibuat"); // Layer switcher var baseLayers = { "Jalan (OSM)": streetLayer, "Hybrid (Satelit + Jalan)": hybridLayer }; L.control.layers(baseLayers).addTo(map); // Marker awal updateMarker(pos.lat, pos.lng); // Klik peta β†’ pindah marker map.on('click', function(e) { var latitude = e.latlng.lat.toFixed(6); var longitude = e.latlng.lng.toFixed(6); // console.log("πŸ–±οΈ Klik map:", latitude, longitude); updateMarker(latitude, longitude); updateFormInputs(latitude, longitude); }); // Tombol "Lokasi Saya" L.control.locateMe = function(opts) { var control = L.control({position: 'topleft'}); control.onAdd = function(map) { var btn = L.DomUtil.create('button', 'leaflet-bar leaflet-control'); btn.setAttribute("type", "button"); btn.innerHTML = 'πŸ“'; btn.title = "Lokasi Saya"; btn.style.backgroundColor = 'white'; btn.style.width = '34px'; btn.style.height = '34px'; btn.onclick = function(e) { e.preventDefault(); e.stopPropagation(); // console.log("πŸ“ Tombol Lokasi Saya diklik"); if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { var lat = position.coords.latitude; var lng = position.coords.longitude; // console.log("βœ… Lokasi saya:", lat, lng); updateMarker(lat, lng); updateFormInputs(lat, lng); map.setView([lat, lng], 17); }, function() { console.error("❌ Tidak bisa ambil lokasi saya"); alert("Tidak bisa mengambil lokasi Anda"); }, { enableHighAccuracy: true }); } else { console.error("❌ Browser tidak support geolocation"); alert("Geolocation tidak didukung di browser ini"); } }; return btn; }; return control; }; L.control.locateMe().addTo(map); } function updateMarker(latitude, longitude) { // console.log("πŸ“ updateMarker ke:", latitude, longitude); if (marker) { marker.setLatLng([latitude, longitude]) .bindPopup("Lokasi terpilih") .openPopup(); } else { marker = L.marker([latitude, longitude]).addTo(map) .bindPopup("Lokasi terpilih") .openPopup(); } map.setView([latitude, longitude]); } function updateFormInputs(latitude, longitude) { // console.log("πŸ“ updateFormInputs:", latitude, longitude); document.getElementById('latitude').value = latitude; document.getElementById('longitude').value = longitude; document.getElementById('latlong').value = `${latitude}, ${longitude}`; } function handleLocationError(browserHasGeolocation) { console.error(browserHasGeolocation ? '❌ Error: Geolocation service failed.' : '❌ Error: Browser tidak support geolocation.'); } // Sinkronisasi input form ⇄ peta document.addEventListener('DOMContentLoaded', function() { // console.log("πŸ“¦ DOMContentLoaded"); initMap(); const latlongInput = document.getElementById('latlong'); const latitudeInput = document.querySelector('input[data-maps="latitude"]') || document.getElementById('latitude'); const longitudeInput = document.querySelector('input[data-maps="longitude"]') || document.getElementById('longitude'); // Set nilai latlong awal kalau ada if (latitudeInput.value && longitudeInput.value) { latlongInput.value = `${latitudeInput.value}, ${longitudeInput.value}`; // console.log("πŸ”„ Sinkron awal dari input:", latlongInput.value); } // Input manual latlong latlongInput.addEventListener('input', function() { // console.log("⌨️ Input manual latlong:", latlongInput.value); const latlongValue = latlongInput.value.split(','); const latLongRegex = /^(-?\d+(\.\d+)?),\s*(-?\d+(\.\d+)?)$/; if (latLongRegex.test(latlongInput.value.trim())) { if (latlongValue.length === 2) { const lat = parseFloat(latlongValue[0].trim()); const long = parseFloat(latlongValue[1].trim()); // console.log("βœ… Format valid β†’ update map:", lat, long); latitudeInput.value = lat; longitudeInput.value = long; updateMarker(lat, long); map.setView([lat, long], 17); } } else { console.warn("⚠️ Format salah, reset input"); setTimeout(function() { latlongInput.value = ''; latlongInput.placeholder = 'Isi dengan format yang sesuai'; latitudeInput.value = ''; longitudeInput.value = ''; }, 500); } }); // Sinkronisasi ketika latitude / longitude berubah latitudeInput.addEventListener('input', function() { // console.log("πŸ”„ Latitude diubah:", latitudeInput.value); latlongInput.value = `${latitudeInput.value}, ${longitudeInput.value}`; }); longitudeInput.addEventListener('input', function() { // console.log("πŸ”„ Longitude diubah:", longitudeInput.value); latlongInput.value = `${latitudeInput.value}, ${longitudeInput.value}`; }); });