UAS SIG Proyek WebGis
This commit is contained in:
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -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();
|
||||
?>
|
||||
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
// ============================================
|
||||
// config.php - Konfigurasi Database
|
||||
// ============================================
|
||||
|
||||
define('DB_HOST', 'localhost');
|
||||
define('DB_USER', 'root'); // default Laragon
|
||||
define('DB_PASS', ''); // default Laragon kosong
|
||||
define('DB_NAME', 'sig_tugas');
|
||||
|
||||
function getDB() {
|
||||
$conn = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
|
||||
if ($conn->connect_error) {
|
||||
http_response_code(500);
|
||||
die(json_encode(['error' => 'Koneksi database gagal: ' . $conn->connect_error]));
|
||||
}
|
||||
$conn->set_charset('utf8mb4');
|
||||
return $conn;
|
||||
}
|
||||
|
||||
// Header CORS & JSON untuk semua API
|
||||
header('Content-Type: application/json');
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
|
||||
header('Access-Control-Allow-Headers: Content-Type');
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
||||
http_response_code(200);
|
||||
exit();
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,80 @@
|
||||
-- ============================================
|
||||
-- DATABASE SETUP - SIG Tugas Kuliah
|
||||
-- Manajemen Jalan & Parsil Tanah - Pontianak
|
||||
-- ============================================
|
||||
|
||||
CREATE DATABASE IF NOT EXISTS sig_tugas CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
USE sig_tugas;
|
||||
|
||||
-- Tabel Data Jalan (Polyline)
|
||||
CREATE TABLE IF NOT EXISTS jalan (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
nama_jalan VARCHAR(100) NOT NULL,
|
||||
status_jalan ENUM('Nasional','Provinsi','Kabupaten') NOT NULL,
|
||||
panjang DOUBLE NOT NULL DEFAULT 0 COMMENT 'Panjang dalam meter, dihitung otomatis Leaflet',
|
||||
geometry LONGTEXT NOT NULL COMMENT 'GeoJSON LineString',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Tabel Data Parsil Tanah (Polygon)
|
||||
CREATE TABLE IF NOT EXISTS tanah (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
kode_kavling VARCHAR(50) NOT NULL,
|
||||
nama_pemilik VARCHAR(100) NOT NULL,
|
||||
status_tanah ENUM('SHM','HGB','HGU','HP') NOT NULL,
|
||||
luas DOUBLE NOT NULL DEFAULT 0 COMMENT 'Luas dalam meter persegi, dihitung otomatis Leaflet',
|
||||
geometry LONGTEXT NOT NULL COMMENT 'GeoJSON Polygon',
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- ============================================
|
||||
-- Sample Data - Jalan di Pontianak
|
||||
-- ============================================
|
||||
INSERT INTO jalan (nama_jalan, status_jalan, panjang, geometry) VALUES
|
||||
(
|
||||
'Jl. Ahmad Yani',
|
||||
'Nasional',
|
||||
3250.5,
|
||||
'{"type":"LineString","coordinates":[[109.3425,-0.0222],[109.3480,-0.0198],[109.3540,-0.0175],[109.3600,-0.0155]]}'
|
||||
),
|
||||
(
|
||||
'Jl. Gajah Mada',
|
||||
'Provinsi',
|
||||
1820.3,
|
||||
'{"type":"LineString","coordinates":[[109.3310,-0.0290],[109.3355,-0.0265],[109.3400,-0.0242]]}'
|
||||
),
|
||||
(
|
||||
'Jl. Tanjungpura',
|
||||
'Kabupaten',
|
||||
1100.7,
|
||||
'{"type":"LineString","coordinates":[[109.3250,-0.0350],[109.3285,-0.0330],[109.3320,-0.0310]]}'
|
||||
);
|
||||
|
||||
-- ============================================
|
||||
-- Sample Data - Parsil Tanah di Pontianak
|
||||
-- ============================================
|
||||
INSERT INTO tanah (kode_kavling, nama_pemilik, status_tanah, luas, geometry) VALUES
|
||||
(
|
||||
'KAV-001',
|
||||
'Budi Santoso',
|
||||
'SHM',
|
||||
1250.75,
|
||||
'{"type":"Polygon","coordinates":[[[109.3350,-0.0400],[109.3370,-0.0400],[109.3370,-0.0420],[109.3350,-0.0420],[109.3350,-0.0400]]]}'
|
||||
),
|
||||
(
|
||||
'KAV-002',
|
||||
'PT. Maju Bersama',
|
||||
'HGB',
|
||||
3400.00,
|
||||
'{"type":"Polygon","coordinates":[[[109.3280,-0.0450],[109.3310,-0.0450],[109.3310,-0.0480],[109.3280,-0.0480],[109.3280,-0.0450]]]}'
|
||||
),
|
||||
(
|
||||
'KAV-003',
|
||||
'CV. Agro Kalimantan',
|
||||
'HGU',
|
||||
5800.50,
|
||||
'{"type":"Polygon","coordinates":[[[109.3150,-0.0500],[109.3200,-0.0500],[109.3200,-0.0540],[109.3150,-0.0540],[109.3150,-0.0500]]]}'
|
||||
);
|
||||
@@ -0,0 +1,45 @@
|
||||
-- ============================================
|
||||
-- DATABASE UPDATE - Tambah Tabel Kerusakan Jalan
|
||||
-- Jalankan query ini setelah database.sql
|
||||
-- ============================================
|
||||
|
||||
-- Tabel Laporan Kerusakan Jalan (Point)
|
||||
CREATE TABLE IF NOT EXISTS kerusakan_jalan (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
jalan_id INT NULL COMMENT 'Referensi ke tabel jalan (opsional)',
|
||||
nama_jalan_ref VARCHAR(100) NULL COMMENT 'Nama jalan jika tidak ada di db',
|
||||
deskripsi TEXT NOT NULL,
|
||||
tingkat_urgensi ENUM('Rendah','Sedang','Tinggi','Kritis') NOT NULL DEFAULT 'Sedang',
|
||||
status_laporan ENUM('Dilaporkan','Diverifikasi','Dalam Perbaikan','Sudah Diperbaiki') NOT NULL DEFAULT 'Dilaporkan',
|
||||
foto_path VARCHAR(255) NULL COMMENT 'Path relatif foto',
|
||||
foto_base64 LONGTEXT NULL COMMENT 'Base64 foto (opsional, jika tidak pakai file system)',
|
||||
lat DOUBLE NOT NULL,
|
||||
lng DOUBLE NOT NULL,
|
||||
tgl_laporan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
tgl_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- Tabel Histori Kerusakan Jalan
|
||||
-- Dipakai untuk merekam perubahan status kerusakan
|
||||
CREATE TABLE IF NOT EXISTS histori_kerusakan (
|
||||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||||
kerusakan_id INT NOT NULL,
|
||||
status_lama ENUM('Dilaporkan','Diverifikasi','Dalam Perbaikan','Sudah Diperbaiki') NOT NULL,
|
||||
status_baru ENUM('Dilaporkan','Diverifikasi','Dalam Perbaikan','Sudah Diperbaiki') NOT NULL,
|
||||
catatan TEXT NULL,
|
||||
tgl_perubahan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (kerusakan_id) REFERENCES kerusakan_jalan(id) ON DELETE CASCADE
|
||||
);
|
||||
|
||||
-- Sample Data Kerusakan
|
||||
INSERT INTO kerusakan_jalan (jalan_id, nama_jalan_ref, deskripsi, tingkat_urgensi, status_laporan, lat, lng) VALUES
|
||||
(1, 'Jl. Ahmad Yani', 'Lubang besar di tengah jalan, diameter sekitar 50cm', 'Tinggi', 'Diverifikasi', -0.0210, 109.3460),
|
||||
(1, 'Jl. Ahmad Yani', 'Aspal terkelupas dan berlubang', 'Sedang', 'Dilaporkan', -0.0215, 109.3465),
|
||||
(1, 'Jl. Ahmad Yani', 'Lubang di pinggir jalan dekat got', 'Sedang', 'Dilaporkan', -0.0212, 109.3462),
|
||||
(2, 'Jl. Gajah Mada', 'Retak memanjang sepanjang 3 meter', 'Rendah', 'Sudah Diperbaiki', -0.0275, 109.3340);
|
||||
|
||||
-- Sample Histori
|
||||
INSERT INTO histori_kerusakan (kerusakan_id, status_lama, status_baru, catatan) VALUES
|
||||
(1, 'Dilaporkan', 'Diverifikasi', 'Tim survei sudah turun ke lapangan, kerusakan terkonfirmasi'),
|
||||
(4, 'Dilaporkan', 'Dalam Perbaikan', 'Jadwal perbaikan: minggu ini'),
|
||||
(4, 'Dalam Perbaikan', 'Sudah Diperbaiki', 'Perbaikan selesai tanggal 10 April 2026');
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user