UAS SIG Proyek WebGis

This commit is contained in:
L4zyL4mb
2026-06-10 21:46:56 +07:00
commit df18a7a99a
35 changed files with 8977 additions and 0 deletions
+141
View File
@@ -0,0 +1,141 @@
<?php
// ============================================
// api/jalan.php - CRUD API Data Jalan
// ============================================
require_once '../config.php';
$method = $_SERVER['REQUEST_METHOD'];
$db = getDB();
switch ($method) {
// ── READ: Ambil semua / satu jalan ──────────────────────────────
case 'GET':
if (isset($_GET['id'])) {
$id = intval($_GET['id']);
$stmt = $db->prepare("SELECT * FROM jalan WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
if ($row) {
$row['geometry'] = json_decode($row['geometry']);
echo json_encode(['success' => true, 'data' => $row]);
} else {
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']);
}
} else {
$result = $db->query("SELECT * FROM jalan ORDER BY created_at DESC");
$data = [];
while ($row = $result->fetch_assoc()) {
$row['geometry'] = json_decode($row['geometry']);
$data[] = $row;
}
echo json_encode(['success' => true, 'data' => $data]);
}
break;
// ── CREATE: Tambah jalan baru ───────────────────────────────────
case 'POST':
$input = json_decode(file_get_contents('php://input'), true);
if (
empty($input['nama_jalan']) ||
empty($input['status_jalan']) ||
empty($input['geometry']) ||
!isset($input['panjang'])
) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Data tidak lengkap']);
break;
}
$nama_jalan = trim($input['nama_jalan']);
$status_jalan = $input['status_jalan'];
$panjang = floatval($input['panjang']);
$geometry = json_encode($input['geometry']);
$valid_status = ['Nasional', 'Provinsi', 'Kabupaten'];
if (!in_array($status_jalan, $valid_status)) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Status jalan tidak valid']);
break;
}
$stmt = $db->prepare(
"INSERT INTO jalan (nama_jalan, status_jalan, panjang, geometry) VALUES (?, ?, ?, ?)"
);
$stmt->bind_param('ssds', $nama_jalan, $status_jalan, $panjang, $geometry);
if ($stmt->execute()) {
echo json_encode([
'success' => true,
'message' => 'Data jalan berhasil disimpan',
'id' => $db->insert_id
]);
} else {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Gagal menyimpan data']);
}
break;
// ── UPDATE: Edit jalan ──────────────────────────────────────────
case 'PUT':
$input = json_decode(file_get_contents('php://input'), true);
if (empty($input['id'])) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'ID diperlukan']);
break;
}
$id = intval($input['id']);
$nama_jalan = trim($input['nama_jalan']);
$status_jalan = $input['status_jalan'];
$panjang = floatval($input['panjang']);
$geometry = json_encode($input['geometry']);
$stmt = $db->prepare(
"UPDATE jalan SET nama_jalan=?, status_jalan=?, panjang=?, geometry=? WHERE id=?"
);
$stmt->bind_param('ssdsi', $nama_jalan, $status_jalan, $panjang, $geometry, $id);
if ($stmt->execute()) {
echo json_encode(['success' => true, 'message' => 'Data jalan berhasil diupdate']);
} else {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Gagal mengupdate data']);
}
break;
// ── DELETE: Hapus jalan ─────────────────────────────────────────
case 'DELETE':
$input = json_decode(file_get_contents('php://input'), true);
$id = intval($input['id'] ?? ($_GET['id'] ?? 0));
if (!$id) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'ID diperlukan']);
break;
}
$stmt = $db->prepare("DELETE FROM jalan WHERE id = ?");
$stmt->bind_param('i', $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['success' => true, 'message' => 'Data jalan berhasil dihapus']);
} else {
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']);
}
break;
default:
http_response_code(405);
echo json_encode(['success' => false, 'message' => 'Method tidak diizinkan']);
}
$db->close();
?>
+194
View File
@@ -0,0 +1,194 @@
<?php
// ============================================
// api/kerusakan.php - CRUD API Kerusakan Jalan
// ============================================
require_once '../config.php';
$method = $_SERVER['REQUEST_METHOD'];
$db = getDB();
// Handle sub-resource: ?action=histori&id=X
$action = $_GET['action'] ?? '';
if ($action === 'histori') {
// GET histori untuk kerusakan tertentu
$id = intval($_GET['id'] ?? 0);
if (!$id) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'ID diperlukan']); exit; }
$stmt = $db->prepare("SELECT * FROM histori_kerusakan WHERE kerusakan_id=? ORDER BY tgl_perubahan DESC");
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$data = [];
while ($row = $result->fetch_assoc()) $data[] = $row;
echo json_encode(['success'=>true, 'data'=>$data]);
$db->close(); exit;
}
if ($action === 'update_status') {
// POST update status + catat histori
$input = json_decode(file_get_contents('php://input'), true);
$id = intval($input['id'] ?? 0);
$status_baru = $input['status_baru'] ?? '';
$catatan = $input['catatan'] ?? '';
if (!$id || !$status_baru) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'ID dan status_baru diperlukan']); exit; }
// Ambil status lama
$stmt = $db->prepare("SELECT status_laporan FROM kerusakan_jalan WHERE id=?");
$stmt->bind_param('i', $id);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
if (!$row) { http_response_code(404); echo json_encode(['success'=>false,'message'=>'Data tidak ditemukan']); exit; }
$status_lama = $row['status_laporan'];
// Update status
$stmt2 = $db->prepare("UPDATE kerusakan_jalan SET status_laporan=? WHERE id=?");
$stmt2->bind_param('si', $status_baru, $id);
$stmt2->execute();
// Catat histori
$stmt3 = $db->prepare("INSERT INTO histori_kerusakan (kerusakan_id, status_lama, status_baru, catatan) VALUES (?,?,?,?)");
$stmt3->bind_param('isss', $id, $status_lama, $status_baru, $catatan);
$stmt3->execute();
echo json_encode(['success'=>true, 'message'=>'Status kerusakan diupdate']);
$db->close(); exit;
}
switch ($method) {
// ── READ ────────────────────────────────────────────────────────
case 'GET':
if (isset($_GET['id'])) {
$id = intval($_GET['id']);
$stmt = $db->prepare("SELECT * FROM kerusakan_jalan WHERE id=?");
$stmt->bind_param('i', $id);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
if ($row) {
echo json_encode(['success'=>true, 'data'=>$row]);
} else {
http_response_code(404);
echo json_encode(['success'=>false, 'message'=>'Data tidak ditemukan']);
}
} else {
// Filter opsional: ?jalan_id=X atau ?status=X
$where = [];
$params = '';
$vals = [];
if (!empty($_GET['jalan_id'])) {
$where[] = 'jalan_id=?'; $params .= 'i'; $vals[] = intval($_GET['jalan_id']);
}
if (!empty($_GET['status'])) {
$where[] = 'status_laporan=?'; $params .= 's'; $vals[] = $_GET['status'];
}
$sql = "SELECT k.*, j.nama_jalan as jalan_nama FROM kerusakan_jalan k LEFT JOIN jalan j ON k.jalan_id=j.id";
if ($where) $sql .= ' WHERE '.implode(' AND ', $where);
$sql .= ' ORDER BY k.tgl_laporan DESC';
$stmt = $db->prepare($sql);
if ($params) $stmt->bind_param($params, ...$vals);
$stmt->execute();
$result = $stmt->get_result();
$data = [];
while ($row = $result->fetch_assoc()) $data[] = $row;
// Hitung kluster per lokasi (radius ~50m)
foreach ($data as &$item) {
$cnt = 0;
foreach ($data as $other) {
$dlat = ($item['lat'] - $other['lat']) * 111000;
$dlng = ($item['lng'] - $other['lng']) * 111000 * cos(deg2rad($item['lat']));
if (sqrt($dlat*$dlat + $dlng*$dlng) < 50) $cnt++;
}
$item['laporan_terdekat'] = $cnt;
}
echo json_encode(['success'=>true, 'data'=>$data]);
}
break;
// ── CREATE ──────────────────────────────────────────────────────
case 'POST':
$input = json_decode(file_get_contents('php://input'), true);
$required = ['deskripsi','tingkat_urgensi','lat','lng'];
foreach ($required as $f) {
if (empty($input[$f]) && $input[$f] !== 0) {
http_response_code(400);
echo json_encode(['success'=>false,'message'=>"Field $f diperlukan"]);
exit;
}
}
$jalan_id = !empty($input['jalan_id']) ? intval($input['jalan_id']) : null;
$nama_jalan_ref = trim($input['nama_jalan_ref'] ?? '');
$deskripsi = trim($input['deskripsi']);
$tingkat_urgensi = $input['tingkat_urgensi'];
$lat = floatval($input['lat']);
$lng = floatval($input['lng']);
$foto_base64 = $input['foto_base64'] ?? null;
$valid_urgensi = ['Rendah','Sedang','Tinggi','Kritis'];
if (!in_array($tingkat_urgensi, $valid_urgensi)) {
http_response_code(400);
echo json_encode(['success'=>false,'message'=>'Tingkat urgensi tidak valid']);
break;
}
$stmt = $db->prepare(
"INSERT INTO kerusakan_jalan (jalan_id, nama_jalan_ref, deskripsi, tingkat_urgensi, lat, lng, foto_base64) VALUES (?,?,?,?,?,?,?)"
);
$stmt->bind_param('isssdds', $jalan_id, $nama_jalan_ref, $deskripsi, $tingkat_urgensi, $lat, $lng, $foto_base64);
if ($stmt->execute()) {
echo json_encode(['success'=>true,'message'=>'Laporan kerusakan berhasil disimpan','id'=>$db->insert_id]);
} else {
http_response_code(500);
echo json_encode(['success'=>false,'message'=>'Gagal menyimpan data']);
}
break;
// ── UPDATE ──────────────────────────────────────────────────────
case 'PUT':
$input = json_decode(file_get_contents('php://input'), true);
$id = intval($input['id'] ?? 0);
if (!$id) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'ID diperlukan']); break; }
$deskripsi = trim($input['deskripsi'] ?? '');
$tingkat_urgensi = $input['tingkat_urgensi'] ?? '';
$nama_jalan_ref = trim($input['nama_jalan_ref'] ?? '');
$stmt = $db->prepare("UPDATE kerusakan_jalan SET deskripsi=?, tingkat_urgensi=?, nama_jalan_ref=? WHERE id=?");
$stmt->bind_param('sssi', $deskripsi, $tingkat_urgensi, $nama_jalan_ref, $id);
if ($stmt->execute()) {
echo json_encode(['success'=>true,'message'=>'Data kerusakan diupdate']);
} else {
http_response_code(500);
echo json_encode(['success'=>false,'message'=>'Gagal mengupdate data']);
}
break;
// ── DELETE ──────────────────────────────────────────────────────
case 'DELETE':
$input = json_decode(file_get_contents('php://input'), true);
$id = intval($input['id'] ?? ($_GET['id'] ?? 0));
if (!$id) { http_response_code(400); echo json_encode(['success'=>false,'message'=>'ID diperlukan']); break; }
$stmt = $db->prepare("DELETE FROM kerusakan_jalan WHERE id=?");
$stmt->bind_param('i', $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['success'=>true,'message'=>'Laporan kerusakan dihapus']);
} else {
http_response_code(404);
echo json_encode(['success'=>false,'message'=>'Data tidak ditemukan']);
}
break;
default:
http_response_code(405);
echo json_encode(['success'=>false,'message'=>'Method tidak diizinkan']);
}
$db->close();
?>
+144
View File
@@ -0,0 +1,144 @@
<?php
// ============================================
// api/tanah.php - CRUD API Data Parsil Tanah
// ============================================
require_once '../config.php';
$method = $_SERVER['REQUEST_METHOD'];
$db = getDB();
switch ($method) {
// ── READ ────────────────────────────────────────────────────────
case 'GET':
if (isset($_GET['id'])) {
$id = intval($_GET['id']);
$stmt = $db->prepare("SELECT * FROM tanah WHERE id = ?");
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
if ($row) {
$row['geometry'] = json_decode($row['geometry']);
echo json_encode(['success' => true, 'data' => $row]);
} else {
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']);
}
} else {
$result = $db->query("SELECT * FROM tanah ORDER BY created_at DESC");
$data = [];
while ($row = $result->fetch_assoc()) {
$row['geometry'] = json_decode($row['geometry']);
$data[] = $row;
}
echo json_encode(['success' => true, 'data' => $data]);
}
break;
// ── CREATE ──────────────────────────────────────────────────────
case 'POST':
$input = json_decode(file_get_contents('php://input'), true);
if (
empty($input['kode_kavling']) ||
empty($input['nama_pemilik']) ||
empty($input['status_tanah']) ||
empty($input['geometry']) ||
!isset($input['luas'])
) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Data tidak lengkap']);
break;
}
$kode_kavling = trim($input['kode_kavling']);
$nama_pemilik = trim($input['nama_pemilik']);
$status_tanah = $input['status_tanah'];
$luas = floatval($input['luas']);
$geometry = json_encode($input['geometry']);
$valid_status = ['SHM', 'HGB', 'HGU', 'HP'];
if (!in_array($status_tanah, $valid_status)) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Status tanah tidak valid']);
break;
}
$stmt = $db->prepare(
"INSERT INTO tanah (kode_kavling, nama_pemilik, status_tanah, luas, geometry) VALUES (?, ?, ?, ?, ?)"
);
$stmt->bind_param('sssds', $kode_kavling, $nama_pemilik, $status_tanah, $luas, $geometry);
if ($stmt->execute()) {
echo json_encode([
'success' => true,
'message' => 'Data tanah berhasil disimpan',
'id' => $db->insert_id
]);
} else {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Gagal menyimpan data']);
}
break;
// ── UPDATE ──────────────────────────────────────────────────────
case 'PUT':
$input = json_decode(file_get_contents('php://input'), true);
if (empty($input['id'])) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'ID diperlukan']);
break;
}
$id = intval($input['id']);
$kode_kavling = trim($input['kode_kavling']);
$nama_pemilik = trim($input['nama_pemilik']);
$status_tanah = $input['status_tanah'];
$luas = floatval($input['luas']);
$geometry = json_encode($input['geometry']);
$stmt = $db->prepare(
"UPDATE tanah SET kode_kavling=?, nama_pemilik=?, status_tanah=?, luas=?, geometry=? WHERE id=?"
);
$stmt->bind_param('sssdsi', $kode_kavling, $nama_pemilik, $status_tanah, $luas, $geometry, $id);
if ($stmt->execute()) {
echo json_encode(['success' => true, 'message' => 'Data tanah berhasil diupdate']);
} else {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Gagal mengupdate data']);
}
break;
// ── DELETE ──────────────────────────────────────────────────────
case 'DELETE':
$input = json_decode(file_get_contents('php://input'), true);
$id = intval($input['id'] ?? ($_GET['id'] ?? 0));
if (!$id) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'ID diperlukan']);
break;
}
$stmt = $db->prepare("DELETE FROM tanah WHERE id = ?");
$stmt->bind_param('i', $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['success' => true, 'message' => 'Data tanah berhasil dihapus']);
} else {
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Data tidak ditemukan']);
}
break;
default:
http_response_code(405);
echo json_encode(['success' => false, 'message' => 'Method tidak diizinkan']);
}
$db->close();
?>