diff --git a/01/api/delete_data.php b/01/api/delete_data.php
deleted file mode 100644
index a387307..0000000
--- a/01/api/delete_data.php
+++ /dev/null
@@ -1,21 +0,0 @@
- "error", "message" => "ID tidak valid"]);
- exit;
-}
-
-$sql = "DELETE FROM spbu WHERE id=$id";
-
-if ($conn->query($sql)) {
- echo json_encode(["status" => "success"]);
-} else {
- echo json_encode(["status" => "error", "message" => $conn->error]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/delete_jalan.php b/01/api/delete_jalan.php
deleted file mode 100644
index 08c4943..0000000
--- a/01/api/delete_jalan.php
+++ /dev/null
@@ -1,21 +0,0 @@
- "error", "message" => "ID tidak valid"]);
- exit;
-}
-
-$sql = "DELETE FROM jalan WHERE id=$id";
-
-if ($conn->query($sql)) {
- echo json_encode(["status" => "success"]);
-} else {
- echo json_encode(["status" => "error", "message" => $conn->error]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/delete_parsil.php b/01/api/delete_parsil.php
deleted file mode 100644
index 3f4496b..0000000
--- a/01/api/delete_parsil.php
+++ /dev/null
@@ -1,21 +0,0 @@
- "error", "message" => "ID tidak valid"]);
- exit;
-}
-
-$sql = "DELETE FROM parsil WHERE id=$id";
-
-if ($conn->query($sql)) {
- echo json_encode(["status" => "success"]);
-} else {
- echo json_encode(["status" => "error", "message" => $conn->error]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/read_data.php b/01/api/read_data.php
deleted file mode 100644
index 64845fd..0000000
--- a/01/api/read_data.php
+++ /dev/null
@@ -1,25 +0,0 @@
-query($sql);
-
-if (!$result) {
-echo json_encode([
-"status" => "error",
-"message" => "Gagal membaca tabel spbu",
-"detail" => $conn->error
-]);
-exit;
-}
-
-$data = [];
-
-while($row = $result->fetch_assoc()){
-$data[] = $row;
-}
-
-echo json_encode($data);
-?>
\ No newline at end of file
diff --git a/01/api/read_jalan.php b/01/api/read_jalan.php
deleted file mode 100644
index 65ab6d4..0000000
--- a/01/api/read_jalan.php
+++ /dev/null
@@ -1,25 +0,0 @@
-query($sql);
-
-if (!$result) {
-echo json_encode([
-"status" => "error",
-"message" => "Gagal membaca tabel jalan",
-"detail" => $conn->error
-]);
-exit;
-}
-
-$data = [];
-
-while($row = $result->fetch_assoc()){
-$data[] = $row;
-}
-
-echo json_encode($data);
-?>
\ No newline at end of file
diff --git a/01/api/read_parsil.php b/01/api/read_parsil.php
deleted file mode 100644
index 078a4cc..0000000
--- a/01/api/read_parsil.php
+++ /dev/null
@@ -1,25 +0,0 @@
-query($sql);
-
-if (!$result) {
-echo json_encode([
-"status" => "error",
-"message" => "Gagal membaca tabel parsil",
-"detail" => $conn->error
-]);
-exit;
-}
-
-$data = [];
-
-while($row = $result->fetch_assoc()){
-$data[] = $row;
-}
-
-echo json_encode($data);
-?>
\ No newline at end of file
diff --git a/01/api/save_data.php b/01/api/save_data.php
deleted file mode 100644
index 62b6c1f..0000000
--- a/01/api/save_data.php
+++ /dev/null
@@ -1,53 +0,0 @@
- "error", "message" => "Data tidak lengkap"]);
- exit;
-}
-
-try {
- $stmt = $conn->prepare("INSERT INTO spbu (nama,no,status,lat,lng) VALUES (?,?,?,?,?)");
- if(!$stmt) {
- $err = $conn->error;
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " SPBU PREPARE ERR: $err\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"prepare","message"=>$err]);
- exit;
- }
-
- $stmt->bind_param("sssdd", $nama, $no, $status, $lat, $lng);
-
- if($stmt->execute()){
- $id = $stmt->insert_id;
- ob_clean();
- echo json_encode(["status"=>"success","id"=>$id]);
- } else {
- $err = $stmt->error;
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " SPBU EXEC ERR: $err | Payload: $raw\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"execute","message"=>$err]);
- }
- $stmt->close();
-} catch (Exception $e) {
- $err = $e->getMessage();
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " SPBU EXCEPTION: $err | Payload: $raw\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"exception","message"=>$err]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/save_jalan.php b/01/api/save_jalan.php
deleted file mode 100644
index 828e75c..0000000
--- a/01/api/save_jalan.php
+++ /dev/null
@@ -1,59 +0,0 @@
- "error", "message" => "Nama tidak boleh kosong"]);
- exit;
-}
-
-try {
- $stmt = $conn->prepare("INSERT INTO jalan (nama,status,panjang,koordinat) VALUES (?,?,?,?)");
- if(!$stmt) {
- $err = $conn->error;
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " JALAN PREPARE ERR: $err\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"prepare","message"=>$err]);
- exit;
- }
-
- $stmt->bind_param("ssds", $nama, $status, $panjang, $koordinat);
-
- if($stmt->execute()){
- $id = $stmt->insert_id;
- ob_clean();
- echo json_encode(["status"=>"success","id"=>$id]);
- } else {
- $err = $stmt->error;
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " JALAN EXEC ERR: $err | Payload: $raw\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"execute","message"=>$err]);
- }
- $stmt->close();
-} catch (Exception $e) {
- $err = $e->getMessage();
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " JALAN EXCEPTION: $err | Payload: $raw\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"exception","message"=>$err]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/save_parsil.php b/01/api/save_parsil.php
deleted file mode 100644
index 2542008..0000000
--- a/01/api/save_parsil.php
+++ /dev/null
@@ -1,60 +0,0 @@
- "error", "message" => "Nama tidak boleh kosong"]);
- exit;
-}
-
-try {
- $stmt = $conn->prepare("INSERT INTO parsil (nama, pemilik, status, luas, koordinat) VALUES (?,?,?,?,?)");
- if(!$stmt) {
- $err = $conn->error;
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " PARSIL PREPARE ERR: $err\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"prepare","message"=>$err]);
- exit;
- }
-
- $stmt->bind_param("sssds", $nama, $pemilik, $status, $luas, $koordinat);
-
- if($stmt->execute()){
- $id = $stmt->insert_id;
- ob_clean();
- echo json_encode(["status"=>"success","id"=>$id]);
- } else {
- $err = $stmt->error;
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " PARSIL EXEC ERR: $err | Payload: $raw\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"execute","message"=>$err]);
- }
- $stmt->close();
-} catch (Exception $e) {
- $err = $e->getMessage();
- file_put_contents('error_log.txt', date('[Y-m-d H:i:s]') . " PARSIL EXCEPTION: $err | Payload: $raw\n", FILE_APPEND);
- ob_clean();
- echo json_encode(["status"=>"error","step"=>"exception","message"=>$err]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/update_data.php b/01/api/update_data.php
deleted file mode 100644
index f5f82b3..0000000
--- a/01/api/update_data.php
+++ /dev/null
@@ -1,27 +0,0 @@
-real_escape_string($data['nama'] ?? '');
-$no = $conn->real_escape_string($data['no'] ?? '');
-$status = $conn->real_escape_string($data['status'] ?? 'Tidak');
-$lat = isset($data['lat']) ? floatval($data['lat']) : 0;
-$lng = isset($data['lng']) ? floatval($data['lng']) : 0;
-
-if ($id <= 0 || $nama === '' || $no === '') {
- echo json_encode(["status" => "error", "message" => "Data tidak valid"]);
- exit;
-}
-
-$sql = "UPDATE spbu SET nama='$nama', no='$no', status='$status', lat='$lat', lng='$lng' WHERE id=$id";
-
-if ($conn->query($sql)) {
- echo json_encode(["status" => "success"]);
-} else {
- echo json_encode(["status" => "error", "message" => $conn->error]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/update_jalan.php b/01/api/update_jalan.php
deleted file mode 100644
index 4ce6b3e..0000000
--- a/01/api/update_jalan.php
+++ /dev/null
@@ -1,35 +0,0 @@
-real_escape_string($data['nama'] ?? '');
-$status = $conn->real_escape_string($data['status'] ?? 'Kabupaten');
-$panjang = isset($data['panjang']) ? floatval($data['panjang']) : 0;
-$koordinatInput = $data['koordinat'] ?? [];
-
-if ($id <= 0 || $nama === '') {
- echo json_encode(["status" => "error", "message" => "Data tidak valid"]);
- exit;
-}
-
-if (is_string($koordinatInput)) {
- $decoded = json_decode($koordinatInput, true);
- $koordinat = (json_last_error() === JSON_ERROR_NONE) ? json_encode($decoded) : '[]';
-} else {
- $koordinat = json_encode($koordinatInput);
-}
-
-$koordinat = $conn->real_escape_string($koordinat);
-
-$sql = "UPDATE jalan SET nama='$nama', status='$status', panjang='$panjang', koordinat='$koordinat' WHERE id=$id";
-
-if ($conn->query($sql)) {
- echo json_encode(["status" => "success"]);
-} else {
- echo json_encode(["status" => "error", "message" => $conn->error]);
-}
-?>
\ No newline at end of file
diff --git a/01/api/update_parsil.php b/01/api/update_parsil.php
deleted file mode 100644
index b8b225c..0000000
--- a/01/api/update_parsil.php
+++ /dev/null
@@ -1,36 +0,0 @@
-real_escape_string($data['nama'] ?? '');
-$pemilik = $conn->real_escape_string($data['pemilik'] ?? '');
-$status = $conn->real_escape_string($data['status'] ?? 'SHM');
-$luas = isset($data['luas']) ? floatval($data['luas']) : 0;
-$koordinatInput = $data['koordinat'] ?? [];
-
-if ($id <= 0 || $nama === '') {
- echo json_encode(["status" => "error", "message" => "Data tidak valid"]);
- exit;
-}
-
-if (is_string($koordinatInput)) {
- $decoded = json_decode($koordinatInput, true);
- $koordinat = (json_last_error() === JSON_ERROR_NONE) ? json_encode($decoded) : '[]';
-} else {
- $koordinat = json_encode($koordinatInput);
-}
-
-$koordinat = $conn->real_escape_string($koordinat);
-
-$sql = "UPDATE parsil SET nama='$nama', pemilik='$pemilik', status='$status', luas='$luas', koordinat='$koordinat' WHERE id=$id";
-
-if ($conn->query($sql)) {
- echo json_encode(["status" => "success"]);
-} else {
- echo json_encode(["status" => "error", "message" => $conn->error]);
-}
-?>
\ No newline at end of file
diff --git a/01/index.html b/01/index.html
index cea55b0..20de51e 100644
--- a/01/index.html
+++ b/01/index.html
@@ -2950,10 +2950,7 @@
}
.pf h4 i { font-size: 15px !important; opacity: .9; }
/* Color the h4 based on icon color */
- .pf h4:has(.fa-gas-pump) { background: linear-gradient(135deg,#064e3b,#059669); }
- .pf h4:has(.fa-road) { background: linear-gradient(135deg,#1e3a8a,#2563eb); }
- .pf h4:has(.fa-vector-square){ background: linear-gradient(135deg,#78350f,#d97706); }
-
+
.pf label {
display: block;
font-size: 10px !important;
@@ -3284,10 +3281,7 @@
0
0
- 0
- 0
- 0
-
+
Legenda Peta
@@ -3341,20 +3335,7 @@
Rumah Ibadah Tambah lokasi ibadah
- Opsional
-
-
- SPBU Tambah titik SPBU
-
-
- Jalan Gambar ruas jalan
-
-
-
- Parsil / Lahan Gambar area persil
-
-
@@ -3523,10 +3504,10 @@
/* STATE */
const state = {
- mode: null, spbu: [], jalan: [], parsil: [], kemiskinan: [], masjid: [],
- featureRefs: { spbu: {}, jalan: {}, parsil: {}, kemiskinan: {}, masjid: {} },
+ mode: null, kemiskinan: [], masjid: [],
+ featureRefs: { kemiskinan: {}, masjid: {} },
kkLayerRefs: {}, blankRefs: {}, useSatellite: false, geometryEdit: null, activeCard: null,
- spbuFilterVis: { open24: true, non24: true }, drawingLine: false, drawingPoly: false,
+ drawingLine: false, drawingPoly: false,
tempPoints: [], tempMarkers: [], tempPolyline: null, tempPolygon: null
};
@@ -3542,22 +3523,12 @@
const layers = {
kemiskinan: L.layerGroup().addTo(map),
masjid: L.layerGroup().addTo(map),
- blankspot: L.layerGroup().addTo(map),
- // Layer opsional — OFF by default (tidak .addTo(map))
- spbu24: L.layerGroup(),
- spbuNon24: L.layerGroup(),
- jalan: L.layerGroup(),
- parsil: L.layerGroup()
- };
+ blankspot: L.layerGroup().addTo(map),};
const layersControl = L.control.layers(null, {
'KemiskinanData KK miskin': layers.kemiskinan,
'Rumah IbadahFasilitas ibadah': layers.masjid,
'Blank SpotDi luar radius rumah ibadah': layers.blankspot,
- 'SPBU 24 JamBuka 24 jam': layers.spbu24,
- 'SPBU Non-24Tidak 24 jam': layers.spbuNon24,
- 'JalanJaringan jalan': layers.jalan,
- 'Parsil / LahanData persil tanah': layers.parsil,
- }, { collapsed: false, position: 'topright' }).addTo(map);
+ }, { collapsed: false, position: 'topright' }).addTo(map);
decorateLayersControl();
function decorateLayersControl() {
const container = layersControl.getContainer();
@@ -3565,7 +3536,7 @@
const overlays = container.querySelector('.leaflet-control-layers-overlays');
if (!overlays) return;
const labels = Array.from(overlays.querySelectorAll('label'));
- if (labels.length < 6) return;
+ if (labels.length < 3) return;
overlays.innerHTML = '';
const addGroup = (title, items, color) => {
const head = document.createElement('div');
@@ -3613,7 +3584,7 @@
});
};
addGroup('Tematik Utama', [labels[0], labels[1], labels[2]]);
- addGroup('Opsional', [labels[3], labels[4], labels[5], labels[6]], '#64748b');
+
}
const statusStoreKey = 'gis-kemiskinan-status';
@@ -3897,18 +3868,6 @@
const fWarga = state.kemiskinan.find(d => (`${d.nama_kk} ${d.alamat}`).toLowerCase().includes(q));
if (fWarga) return focusFeature('kemiskinan', fWarga.id);
- // 3. Cari SPBU
- const fSpbu = state.spbu.find(d => (d.nama || '').toLowerCase().includes(q));
- if (fSpbu) return focusFeature('spbu', fSpbu.id);
-
- // 4. Cari Jalan
- const fJalan = state.jalan.find(d => (d.nama || '').toLowerCase().includes(q));
- if (fJalan) return focusFeature('jalan', fJalan.id);
-
- // 5. Cari Parsil
- const fParsil = state.parsil.find(d => (`${d.nama} ${d.pemilik}`).toLowerCase().includes(q));
- if (fParsil) return focusFeature('parsil', fParsil.id);
-
// Jika tidak ketemu
alert('Data "' + q + '" tidak ditemukan.');
}
@@ -4124,7 +4083,7 @@
function setMode(m) {
cancelDrawing();
state.mode = state.mode === m ? null : m;
- ['kemiskinan', 'masjid', 'spbu', 'jalan', 'parsil'].forEach(x => {
+ ['kemiskinan', 'masjid'].forEach(x => {
const el = document.getElementById('btn-' + x);
if (el) el.className = 'mbtn';
});
@@ -4134,11 +4093,6 @@
const msgs = {
kemiskinan: 'Klik peta untuk menambah data Kemiskinan',
masjid: 'Klik peta untuk menambah titik Rumah Ibadah',
- spbu: 'Klik peta untuk menambah titik SPBU',
- jalan: 'Klik untuk gambar jalan — klik ganda untuk selesai',
- parsil: 'Klik untuk gambar parsil — klik titik awal atau dbl-klik selesai',
- line: 'Klik untuk gambar jalan — klik ganda untuk selesai',
- poly: 'Klik untuk gambar parsil — klik titik awal atau dbl-klik selesai',
};
hint.textContent = msgs[m] || 'Klik peta';
hint.classList.add('show');
@@ -4157,14 +4111,9 @@
if (!state.mode) return;
if (state.mode === 'kemiskinan') handleKemiskinanClick(e);
else if (state.mode === 'masjid') handleMasjidClick(e);
- else if (state.mode === 'spbu') handlePointClick(e);
- else if (state.mode === 'jalan') handleLineClick(e);
- else if (state.mode === 'parsil') handlePolyClick(e);
});
map.on('dblclick', function (e) {
- if ((state.mode === 'jalan' || state.mode === 'line') && state.drawingLine) finishLine(e);
- if ((state.mode === 'parsil' || state.mode === 'poly') && state.drawingPoly) finishPoly(e);
- if (['jalan','parsil','line','poly'].includes(state.mode)) L.DomEvent.stopPropagation(e);
+
});
/* ── MODERN MARKER ICON ── */
@@ -4229,102 +4178,9 @@
window._tmpM = tmpM;
}
- function savePoint() {
+
- const nama = document.getElementById('p-nama').value.trim();
- const no = document.getElementById('p-no').value.trim();
- const status = document.getElementById('p-status').value;
- const lat = parseFloat(document.getElementById('p-lat').value);
- const lng = parseFloat(document.getElementById('p-lng').value);
-
- if (!nama || !no) {
- alert('Lengkapi nama dan nomor SPBU!');
- return;
- }
-
- fetch("api/save_data.php", {
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify({
- nama: nama,
- no: no,
- status: status,
- lat: lat,
- lng: lng
- })
- })
- .then(res => res.json())
- .then(response => {
-
- if (response.status == "success") {
-
- const d = {
- id: response.id || Date.now(),
- nama,
- no,
- status,
- lat,
- lng
- };
-
- state.spbu.push(d);
-
- renderSPBU(d);
-
- updateCount('spbu', state.spbu.length);
-
- addCard(
- 'spbu',
- d.id,
- nama,
- 'No: ' + no,
- status === 'Ya' ? 'Buka 24 Jam' : 'Tidak Buka 24 Jam',
- status === 'Ya' ? '#1a6b3c' : '#b93328'
- );
-
- if (window._tmpM) {
- map.closePopup();
- map.removeLayer(window._tmpM);
- window._tmpM = null;
- }
-
- setMode(null);
- ensureLayerVisible('spbu', d.id);
- focusFeature('spbu', d.id);
-
- } else {
- alert("Gagal menyimpan: " + (response.message || "Periksa database"));
- }
-
- })
- .catch(err => {
- console.error(err);
- alert("Terjadi error jaringan");
- });
-
- }
-
- function renderSPBU(d) {
- const color = d.status === 'Ya' ? '#10b981' : '#ef4444';
- const icon = createModernMarker(color, 'fas fa-gas-pump', d.nama);
- const m = L.marker([d.lat, d.lng], { icon, draggable: true });
- m.bindPopup(`
-
${d.nama}
-
-
No. SPBU${d.no}
-
Status${d.status === 'Ya' ? '✔ Buka 24 Jam' : '✖ Tidak Buka 24 Jam'}
-
Koordinat${d.lat.toFixed(5)}, ${d.lng.toFixed(5)}
-
-
-
-
-
-
`, { autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] });
- m.addTo(d.status === 'Ya' ? layers.spbu24 : layers.spbuNon24);
- state.featureRefs.spbu[String(d.id)] = m;
- }
+
/* ── JALAN ── */
function handleLineClick(e) {
@@ -4337,231 +4193,14 @@
document.getElementById('hint').textContent = `📍 ${state.tempPoints.length} titik — klik ganda untuk selesai`;
}
- function finishLine(e) {
- if (state.tempPoints.length < 2) { alert('Minimal 2 titik!'); return; }
- const pts = [...state.tempPoints];
- const len = calcLen(pts);
- window._tempLinePts = pts;
- window._tempLineLen = len;
- clearTemp();
- L.popup({ closeOnClick: false, keepInView: true, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] })
- .setLatLng(pts[Math.floor(pts.length / 2)])
- .setContent(`
-
Tambah Jalan
-
-
-
-
-
-
- Panjang terukur:
- ${fmtLen(len)}
-
-
-
`).addTo(map);
- }
+
- function saveLine() {
- const pts = window._tempLinePts || [];
- const len = window._tempLineLen || 0;
+
+
- const nama = document.getElementById('j-nama').value.trim();
- const status = document.getElementById('j-status').value;
+
- if (!nama) {
- alert('Isi nama jalan!');
- return;
- }
-
- fetch("api/save_jalan.php", {
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify({
- nama: nama,
- status: status,
- panjang: len,
- koordinat: pts
- })
- })
- .then(res => res.json())
- .then(response => {
-
- if (response.status == "success") {
-
- const d = {
- id: response.id || Date.now(),
- nama,
- status,
- pts,
- len
- };
-
- state.jalan.push(d);
-
- renderJalan(d);
-
- updateCount('jalan', state.jalan.length);
-
- addCard(
- 'jalan',
- d.id,
- nama,
- status + ' · ' + fmtLen(len),
- status,
- jColor[status]
- );
-
- map.closePopup();
- setMode(null);
- ensureLayerVisible('jalan', d.id);
- focusFeature('jalan', d.id);
-
- } else {
-
- // log removed
- alert("Gagal simpan jalan");
-
- }
-
- })
- .catch(err => {
- // log removed
- alert("Error simpan jalan");
- });
-
- }
- function renderJalan(d) {
-
- const pts = normalizeLinePoints(d.pts);
- if (pts.length < 2) {
- // log removed
- return;
- }
-
- const c = jColor[d.status] || '#ef4444';
-
- const w =
- d.status === 'Nasional' ? 6 :
- d.status === 'Provinsi' ? 5 : 4;
-
- const line = L.polyline(pts, {
- color: c,
- weight: w,
- opacity: 0.95,
- lineCap: 'round',
- lineJoin: 'round',
- className: 'path-glow'
- })
- .bindPopup(`
-
-
${d.nama}
-
-
-
- Status
- ${d.status}
-
-
- Panjang
- ${fmtLen(d.len)}
-
-
-
-
-
-
-
-
-
-`, { autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] })
- .addTo(layers.jalan);
-
- state.featureRefs.jalan[String(d.id)] = line;
-
- }
-
- function normalizeLinePoints(raw) {
-
- let pts = raw;
-
- if (typeof pts === 'string') {
- try {
- pts = JSON.parse(pts);
- } catch (_) {
- return [];
- }
- }
-
- // Kompatibilitas data lama: koordinat sempat tersimpan sebagai JSON string di dalam JSON string.
- if (typeof pts === 'string') {
- try {
- pts = JSON.parse(pts);
- } catch (_) {
- return [];
- }
- }
-
- if (!Array.isArray(pts) || pts.length === 0) return [];
-
- if (Array.isArray(pts[0])) {
- return pts
- .map(p => [parseFloat(p[0]), parseFloat(p[1])])
- .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1]));
- }
-
- if (pts[0] && typeof pts[0] === 'object' && pts[0].lat !== undefined) {
- return pts
- .map(p => [parseFloat(p.lat), parseFloat(p.lng)])
- .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1]));
- }
-
- return [];
-
- }
-
- function normalizePolyPoints(raw) {
-
- let pts = raw;
-
- if (typeof pts === 'string') {
- try {
- pts = JSON.parse(pts);
- } catch (_) {
- return [];
- }
- }
-
- if (typeof pts === 'string') {
- try {
- pts = JSON.parse(pts);
- } catch (_) {
- return [];
- }
- }
-
- if (!Array.isArray(pts) || pts.length === 0) return [];
-
- if (Array.isArray(pts[0])) {
- return pts
- .map(p => [parseFloat(p[0]), parseFloat(p[1])])
- .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1]));
- }
-
- if (pts[0] && typeof pts[0] === 'object' && pts[0].lat !== undefined) {
- return pts
- .map(p => [parseFloat(p.lat), parseFloat(p.lng)])
- .filter(p => Number.isFinite(p[0]) && Number.isFinite(p[1]));
- }
-
- return [];
-
- }
+
/* ── PARSIL ── */
function handlePolyClick(e) {
@@ -4585,160 +4224,11 @@
`🗺️ ${state.tempPoints.length} titik — klik titik awal atau dbl-klik selesai`;
}
- function finishPoly(e) {
- if (state.tempPoints.length < 3) { alert('Minimal 3 titik!'); return; }
- const pts = [...state.tempPoints];
- const area = calcArea(pts);
- window._tempPolyPts = pts;
- window._tempPolyArea = area;
- clearTemp();
- const center = L.polygon(pts).getBounds().getCenter();
- L.popup({ closeOnClick: false, keepInView: true, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] })
- .setLatLng(center)
- .setContent(`
-
Tambah Parsil / Lahan
-
-
-
-
-
-
-
-
- Luas terukur:
- ${fmtArea(area)}
-
-
-
`).addTo(map);
- }
+
- function saveParsil() {
- const pts = window._tempPolyPts || [];
- const area = window._tempPolyArea || 0;
+
- const nama = document.getElementById('ps-nama').value.trim();
- const pemilik = document.getElementById('ps-pemilik').value.trim();
- const status = document.getElementById('ps-status').value;
-
- if (!nama) {
- alert('Isi nama parsil!');
- return;
- }
-
- fetch("api/save_parsil.php", {
- method: "POST",
- headers: {
- "Content-Type": "application/json"
- },
- body: JSON.stringify({
- nama: nama,
- pemilik: pemilik,
- status: status,
- luas: area,
- koordinat: pts
- })
- })
- .then(res => res.json())
- .then(response => {
-
- if (response.status == "success") {
-
- const parsil = {
- id: response.id || Date.now(),
- nama,
- pemilik,
- status,
- pts,
- area
- };
-
- state.parsil.push(parsil);
-
- renderParsil(parsil);
-
- updateCount('parsil', state.parsil.length);
-
- addCard(
- 'parsil',
- parsil.id,
- parsil.nama,
- parsil.status,
- parsil.status,
- '#1a5276'
- );
-
- map.closePopup();
- setMode(null);
- ensureLayerVisible('parsil', parsil.id);
- focusFeature('parsil', parsil.id);
-
- }
-
- else {
- // log removed
- alert("Gagal simpan parsil");
- }
-
- })
- .catch(err => {});
- }
-
- function renderParsil(d) {
-
- const pts = normalizePolyPoints(d.pts);
- if (pts.length < 3) {
- // log removed
- return;
- }
-
- const c = pColor[d.status];
-
- const poly = L.polygon(pts, {
- color: c,
- fillColor: c,
- fillOpacity: 0.25,
- weight: 3,
- dashArray: '8, 6',
- lineCap: 'round',
- lineJoin: 'round',
- className: 'parsil-glow'
- })
- .bindPopup(`
-
-
${d.nama}
-
-
-
- Pemilik
- ${d.pemilik || '-'}
-
-
- Status
- ${d.status}
-
-
- Luas
- ${fmtArea(d.area)}
-
-
-
-
-
-
-
-
-
-`)
- .addTo(layers.parsil);
-
- state.featureRefs.parsil[String(d.id)] = poly;
-
- }
+
function getById(type, id) {
return state[type].find(x => String(x.id) === String(id));
@@ -4911,11 +4401,7 @@
}
function refreshType(type) {
- if (state.geometryEdit && state.geometryEdit.type === type) stopGeometryEdit();
- if (type === 'spbu') {
- layers.spbu24.clearLayers();
- layers.spbuNon24.clearLayers();
- } else {
+ if (state.geometryEdit && state.geometryEdit.type === type) stopGeometryEdit(); else {
layers[type].clearLayers();
}
state.featureRefs[type] = {};
@@ -4952,31 +4438,7 @@
renderDashboard();
}
- function openEditSpbu(id) {
- const d = getById('spbu', id);
- if (!d) return;
- const ref = state.featureRefs.spbu[String(id)];
- const ll = ref && ref.getLatLng ? ref.getLatLng() : { lat: d.lat, lng: d.lng };
- const html = `
-
Edit SPBU
-
-
-
-
-
-
-
-
-
-
-
- `;
- map.closePopup();
- L.popup({ maxWidth: 290, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng([ll.lat, ll.lng]).setContent(html).openOn(map);
- }
+
function saveEditSpbu(id) {
const nama = document.getElementById('e-spbu-nama').value.trim();
@@ -5011,33 +4473,7 @@
.catch(() => alert('Error update SPBU'));
}
- function openEditJalan(id) {
- if (state.geometryEdit && (state.geometryEdit.type !== 'jalan' || String(state.geometryEdit.id) !== String(id))) {
- stopGeometryEdit();
- }
- const d = getById('jalan', id);
- if (!d) return;
- const pts = normalizeLinePoints(d.pts);
- const ref = state.featureRefs.jalan[String(id)];
- const center = ref && ref.getBounds ? ref.getBounds().getCenter() : map.getCenter();
- const html = `
-
Edit Jalan
-
-
-
-
-
-
-
-
- `;
- map.closePopup();
- L.popup({ maxWidth: 330, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng(center).setContent(html).openOn(map);
- }
+
function saveEditJalan(id) {
if (state.geometryEdit && state.geometryEdit.type === 'jalan' && String(state.geometryEdit.id) === String(id)) {
@@ -5075,36 +4511,7 @@
.catch(() => alert('Error update jalan'));
}
- function openEditParsil(id) {
- if (state.geometryEdit && (state.geometryEdit.type !== 'parsil' || String(state.geometryEdit.id) !== String(id))) {
- stopGeometryEdit();
- }
- const d = getById('parsil', id);
- if (!d) return;
- const pts = normalizePolyPoints(d.pts);
- const ref = state.featureRefs.parsil[String(id)];
- const center = ref && ref.getBounds ? ref.getBounds().getCenter() : map.getCenter();
- const html = `
-
Edit Parsil
-
-
-
-
-
-
-
-
-
-
- `;
- map.closePopup();
- L.popup({ maxWidth: 330, autoPanPaddingTopLeft: [0, 80], autoPanPaddingBottomRight: [0, 20] }).setLatLng(center).setContent(html).openOn(map);
- }
+
function saveEditParsil(id) {
if (state.geometryEdit && state.geometryEdit.type === 'parsil' && String(state.geometryEdit.id) === String(id)) {
@@ -5290,10 +4697,6 @@
document.addEventListener("DOMContentLoaded", function () {
- loadSPBU();
- loadJalan();
- loadParsil();
-
// Kemiskinan butuh data Masjid untuk hitung Blank Spot (merah/hijau)
// Jadi pastikan loadMasjid selesai dulu baru loadKemiskinan
loadMasjid().then(() => {
@@ -5302,120 +4705,11 @@
});
- function loadSPBU() {
+
- fetch("api/read_data.php")
- .then(res => res.json())
- .then(data => {
+
- data.forEach(d => {
-
- const spbu = {
- id: d.id,
- nama: d.nama,
- no: d.no,
- status: d.status,
- lat: parseFloat(d.lat),
- lng: parseFloat(d.lng)
- };
-
- state.spbu.push(spbu);
-
- renderSPBU(spbu);
-
- updateCount('spbu', state.spbu.length);
-
- addCard(
- 'spbu',
- spbu.id,
- spbu.nama,
- 'No: ' + spbu.no,
- spbu.status === 'Ya' ? 'Buka 24 Jam' : 'Tidak Buka 24 Jam',
- spbu.status === 'Ya' ? '#1a6b3c' : '#b93328'
- );
-
- });
-
- })
- .catch(err => {});
-
- }
-
- function loadJalan() {
-
- fetch("api/read_jalan.php")
- .then(res => res.json())
- .then(data => {
-
- data.forEach(d => {
-
- const jalan = {
- id: d.id,
- nama: d.nama,
- status: d.status,
- len: parseFloat(d.panjang),
- pts: d.koordinat
- };
-
- state.jalan.push(jalan);
-
- renderJalan(jalan);
-
- updateCount('jalan', state.jalan.length);
-
- addCard(
- 'jalan',
- jalan.id,
- jalan.nama,
- jalan.status,
- jalan.status,
- '#e74c3c'
- );
-
- });
-
- })
- .catch(err => {});
-
- }
-
- function loadParsil() {
-
- fetch("api/read_parsil.php")
- .then(res => res.json())
- .then(data => {
-
- data.forEach(d => {
-
- const parsil = {
- id: d.id,
- nama: d.nama,
- pemilik: d.pemilik,
- status: d.status,
- area: parseFloat(d.luas),
- pts: d.koordinat
- };
-
- state.parsil.push(parsil);
-
- renderParsil(parsil);
-
- updateCount('parsil', state.parsil.length);
-
- addCard(
- 'parsil',
- parsil.id,
- parsil.nama,
- parsil.status,
- parsil.status,
- '#1a5276'
- );
-
- });
-
- })
- .catch(err => {});
- }
+
/* ── KEMISKINAN ── */
function getKemiskinanDraft() {
diff --git a/01/index.html.bak b/01/index.html.bak
new file mode 100644
index 0000000..cea55b0
--- /dev/null
+++ b/01/index.html.bak
@@ -0,0 +1,7482 @@
+
+
+
+
+
+
+ SiPetaSos — Sistem Informasi Peta Sosial
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Mode Publik — Data KK miskin tidak ditampilkan.
+ Login untuk akses penuh termasuk peta, daftar, dan pencarian data.
+
+
+
+
+
+
+
+ SiPetaSos
+ Sistem Informasi Peta Sosial & Rumah Ibadah
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Login
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Daftar KK miskin dan detail informasi hanya dapat diakses oleh pengguna yang telah masuk ke
+ sistem.
+
+ -
+
+ Daftar lengkap KK miskin
+
+ -
+
+ Titik peta interaktif
+
+ -
+
+ Ekspor laporan data
+
+ -
+
+ Monitoring blank spot
+
+
+
+ Masuk ke Sistem
+
+
Statistik & titik peta dapat dilihat tanpa
+ login.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Ganti Sandi
+
Perbarui password akun Anda
+
+
+
+
+
+
Error
+
Password berhasil diubah!
+
+
+
+
+
+
+
+
+
+
+