// ==========================================
// 1. INISIALISASI PETA & LAYER
// ==========================================
var map = L.map('map', { zoomControl: false }).setView([-0.0227, 109.3425], 14);
// Zoom control di kanan bawah (tampilan modern)
L.control.zoom({ position: 'bottomright' }).addTo(map);
// OpenStreetMap Tile Layer
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// Layer Groups
var jalanLayer = L.layerGroup().addTo(map);
var parsilLayer = L.layerGroup().addTo(map);
var drawnItems = new L.FeatureGroup().addTo(map);
// Layer Control (Checkbox di kanan atas)
var overlayMaps = {
"🛣️ Jaringan Jalan": jalanLayer,
"🏘️ Parsil Bangunan": parsilLayer
};
L.control.layers(null, overlayMaps, { collapsed: true, position: 'bottomleft' }).addTo(map);
// Global Variables
var databasePencarian = [];
var sidebarDrawMode = null; // 'polyline' | 'polygon'
var sidebarKoordinat = "";
var sidebarDrawHandler = null;
// ==========================================
// 2. FUNGSI LOAD DATA DARI DATABASE
// ==========================================
function loadJalan() {
jalanLayer.clearLayers();
// Reset database pencarian khusus kategori Jalan
databasePencarian = databasePencarian.filter(item => item.kategori !== 'Jalan');
fetch('load.php?jenis=jalan')
.then(res => res.json())
.then(data => {
data.forEach(item => {
try {
var geom = JSON.parse(item.koordinat);
// Warna berdasarkan status jalan
var warna = item.status === 'Jalan Nasional' ? '#ef4444' // Red
: item.status === 'Jalan Provinsi' ? '#fbbf24' // Yellow/Amber
: '#10b981'; // Green (Kabupaten)
var viewHTML = `
`;
var layerJalan = L.geoJSON(geom, {
style: { color: warna, weight: 5, opacity: 0.85 }
}).bindPopup(viewHTML).addTo(jalanLayer);
layerJalan.on('click', function () {
map.fitBounds(layerJalan.getBounds(), { padding: [50, 50] });
});
databasePencarian.push({
namaLower: item.nama_jalan.toLowerCase(),
namaAsli: item.nama_jalan,
kategori: 'Jalan',
ikon: '🛣️',
tipe: 'area',
layer: layerJalan
});
} catch (error) {
console.error("Error parse koordinat jalan ID: " + item.id, error);
}
});
})
.catch(e => console.log('Belum ada data Jalan', e));
}
function loadParsil() {
parsilLayer.clearLayers();
// Reset database pencarian khusus kategori Parsil
databasePencarian = databasePencarian.filter(item => item.kategori !== 'Parsil');
fetch('load.php?jenis=parsil')
.then(res => res.json())
.then(data => {
data.forEach(item => {
try {
var geom = JSON.parse(item.koordinat);
// Warna berdasarkan status sertifikat tanah
var warna = item.status === 'SHM' ? '#10b981' // Green
: item.status === 'HGB' ? '#3b82f6' // Blue
: item.status === 'HGU' ? '#8b5cf6' // Purple
: '#f59e0b'; // Orange (HP)
var viewHTML = `
`;
var layerParsil = L.geoJSON(geom, {
style: { fillColor: warna, color: warna, weight: 2, fillOpacity: 0.45 }
}).bindPopup(viewHTML).addTo(parsilLayer);
layerParsil.on('click', function () {
map.fitBounds(layerParsil.getBounds(), { padding: [50, 50] });
});
databasePencarian.push({
namaLower: item.nama_pemilik.toLowerCase(),
namaAsli: item.nama_pemilik,
kategori: 'Parsil',
ikon: '🏘️',
tipe: 'area',
layer: layerParsil
});
} catch (error) {
console.error("Error parse koordinat parsil ID: " + item.id, error);
}
});
})
.catch(e => console.log('Belum ada data Parsil', e));
}
// Load data awal
loadJalan();
loadParsil();
// ==========================================
// 3. EDIT & UPDATE DATA
// ==========================================
function formEditJalan(id, nama, status) {
setTimeout(function () {
var container = document.getElementById(`popup-jalan-${id}`);
if (!container) return;
container.innerHTML = `
`;
}, 50);
}
function formEditParsil(id, nama, status) {
setTimeout(function () {
var container = document.getElementById(`popup-parsil-${id}`);
if (!container) return;
container.innerHTML = `
`;
}, 50);
}
function updateData(e, tabel, id) {
e.preventDefault();
var formData = new FormData();
formData.append('tabel', tabel);
formData.append('id', id);
if (tabel === 'jalan') {
formData.append('nama_jalan', document.getElementById('edit_nama').value);
formData.append('status', document.getElementById('edit_status').value);
} else if (tabel === 'parsil') {
formData.append('nama_pemilik', document.getElementById('edit_nama').value);
formData.append('status', document.getElementById('edit_status').value);
}
fetch('update_data.php', { method: 'POST', body: formData })
.then(r => r.text())
.then(res => {
alert(res);
map.closePopup();
if (tabel === 'jalan') loadJalan();
if (tabel === 'parsil') loadParsil();
})
.catch(error => console.error("Error updating data:", error));
}
// ==========================================
// 4. HAPUS DATA
// ==========================================
function deleteData(tabel, id) {
if (confirm('Apakah Anda yakin ingin menghapus data ini secara permanen?')) {
var formData = new FormData();
formData.append('id', id);
formData.append('tabel', tabel);
fetch('delete_data.php', { method: 'POST', body: formData })
.then(r => r.text())
.then(res => {
alert(res);
map.closePopup();
if (tabel === 'jalan') loadJalan();
if (tabel === 'parsil') loadParsil();
})
.catch(error => console.error("Error deleting data:", error));
}
}
// ==========================================
// 5. SISTEM PENCARIAN & AUTOCMPLETE
// ==========================================
function jalankanPencarian() {
var kataKunci = document.getElementById('search-input').value.toLowerCase();
var kategori = document.getElementById('search-category').value;
var wadahHasil = document.getElementById('search-results');
wadahHasil.innerHTML = '';
if (kataKunci.length < 2) {
wadahHasil.style.display = 'none';
return;
}
var hasil = databasePencarian.filter(function (item) {
var cocokNama = item.namaLower.includes(kataKunci);
var cocokKategori = (kategori === 'Semua') || (item.kategori === kategori);
return cocokNama && cocokKategori;
});
if (hasil.length > 0) {
wadahHasil.style.display = 'block';
wadahHasil.innerHTML = ``;
hasil.forEach(function (item) {
var badgeClass = item.kategori === 'Jalan' ? 'badge-Jalan' : 'badge-Parsil';
var bgColors = item.kategori === 'Jalan' ? 'rgba(245,158,11,0.1)' : 'rgba(163,116,255,0.1)';
var div = document.createElement('div');
div.className = 'result-item';
div.innerHTML = `
${item.namaAsli}
Klik untuk zoom ke lokasi