Files
UAS_WEBGIS_MuhammadFarras_D…/Manajemen_Jalan_dan_Parsil/api/jalan.php
T
2026-06-09 19:02:22 +07:00

248 lines
9.6 KiB
PHP

<?php
/**
* WebGIS - API Manajemen Data Jalan
*
* Endpoint : /api/jalan.php
* Tabel : tb_jalan
* Geometri : GeoJSON LineString
*/
// Matikan display_errors agar PHP tidak output HTML error (merusak JSON)
ini_set('display_errors', 0);
ini_set('display_startup_errors', 0);
error_reporting(0);
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
/* Handle preflight request */
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit;
}
require_once __DIR__ . '/db.php';
$conn = getConnection();
$method = $_SERVER['REQUEST_METHOD'];
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;
try {
switch ($method) {
/* ============================================================
READ — Ambil semua atau satu data jalan
============================================================ */
case 'GET':
if ($id) {
/* Satu data */
$stmt = $conn->prepare(
"SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at
FROM tb_jalan WHERE id = ?"
);
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
if ($row) {
$row['geojson'] = json_decode($row['geojson']); // parse ke objek
echo json_encode($row);
} else {
http_response_code(404);
echo json_encode(['status' => 'gagal', 'pesan' => 'Data jalan tidak ditemukan']);
}
} else {
/* Semua data */
$filter = isset($_GET['status']) ? $_GET['status'] : null;
if ($filter) {
$stmt = $conn->prepare(
"SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at
FROM tb_jalan WHERE status_jalan = ? ORDER BY created_at DESC"
);
$stmt->bind_param('s', $filter);
$stmt->execute();
$result = $stmt->get_result();
} else {
$result = $conn->query(
"SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at
FROM tb_jalan ORDER BY created_at DESC"
);
}
$data = [];
while ($row = $result->fetch_assoc()) {
$row['geojson'] = json_decode($row['geojson']);
$data[] = $row;
}
echo json_encode($data);
}
break;
/* ============================================================
CREATE — Simpan data jalan baru
Body (JSON):
{
"nama_jalan" : "Jalan Ahmad Yani",
"status_jalan" : "Nasional", // Nasional|Provinsi|Kabupaten
"panjang_jalan" : 2345.67, // meter, dihitung oleh LeafletJS
"geojson" : { // GeoJSON LineString
"type": "LineString",
"coordinates": [[lng,lat], ...]
}
}
============================================================ */
case 'POST':
$body = json_decode(file_get_contents('php://input'), true);
if (!$body) {
http_response_code(400);
echo json_encode(['status' => 'gagal', 'pesan' => 'Body request tidak valid atau bukan JSON']);
break;
}
$nama_jalan = trim($body['nama_jalan'] ?? '');
$status_jalan = trim($body['status_jalan'] ?? '');
$panjang_jalan = (float)($body['panjang_jalan'] ?? 0);
$geojson_raw = $body['geojson'] ?? null;
/* Validasi */
$valid_status = ['Nasional', 'Provinsi', 'Kabupaten'];
if (!$nama_jalan) {
http_response_code(400);
echo json_encode(['status' => 'gagal', 'pesan' => 'nama_jalan tidak boleh kosong']);
break;
}
if (!in_array($status_jalan, $valid_status)) {
http_response_code(400);
echo json_encode(['status' => 'gagal', 'pesan' => 'status_jalan tidak valid. Pilih: Nasional, Provinsi, atau Kabupaten']);
break;
}
if (!$geojson_raw || ($geojson_raw['type'] ?? '') !== 'LineString') {
http_response_code(400);
echo json_encode(['status' => 'gagal', 'pesan' => 'geojson harus bertipe LineString']);
break;
}
$geojson_str = json_encode($geojson_raw);
$stmt = $conn->prepare(
"INSERT INTO tb_jalan (nama_jalan, status_jalan, panjang_jalan, geojson)
VALUES (?, ?, ?, ?)"
);
$stmt->bind_param('ssds', $nama_jalan, $status_jalan, $panjang_jalan, $geojson_str);
if ($stmt->execute()) {
echo json_encode([
'status' => 'sukses',
'id' => $conn->insert_id,
'pesan' => 'Data jalan berhasil disimpan'
]);
} else {
throw new Exception($stmt->error);
}
break;
/* ============================================================
UPDATE — Perbarui atribut dan/atau koordinat jalan
Mengirim field yang ingin diubah saja:
- Edit atribut : { "nama_jalan": "...", "status_jalan": "..." }
- Geser vertex : { "geojson": {...}, "panjang_jalan": 1234.5 }
- Keduanya : { semua field }
============================================================ */
case 'PUT':
if (!$id) {
http_response_code(400);
echo json_encode(['status' => 'gagal', 'pesan' => 'Parameter id diperlukan']);
break;
}
$body = json_decode(file_get_contents('php://input'), true);
if (!$body) {
http_response_code(400);
echo json_encode(['status' => 'gagal', 'pesan' => 'Body tidak valid']);
break;
}
/* Bangun query dinamis berdasarkan field yang dikirim */
$setClauses = [];
$paramVals = [];
$paramTypes = '';
if (array_key_exists('nama_jalan', $body)) {
$v = trim($body['nama_jalan']);
if (!$v) { http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'nama_jalan tidak boleh kosong']); break; }
$setClauses[] = 'nama_jalan = ?'; $paramVals[] = $v; $paramTypes .= 's';
}
if (array_key_exists('status_jalan', $body)) {
$valid = ['Nasional','Provinsi','Kabupaten'];
if (!in_array($body['status_jalan'], $valid)) {
http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'status_jalan tidak valid']); break;
}
$setClauses[] = 'status_jalan = ?'; $paramVals[] = $body['status_jalan']; $paramTypes .= 's';
}
if (array_key_exists('panjang_jalan', $body)) {
$setClauses[] = 'panjang_jalan = ?'; $paramVals[] = (float)$body['panjang_jalan']; $paramTypes .= 'd';
}
if (array_key_exists('geojson', $body)) {
$setClauses[] = 'geojson = ?'; $paramVals[] = json_encode($body['geojson']); $paramTypes .= 's';
}
if (empty($setClauses)) {
echo json_encode(['status' => 'gagal', 'pesan' => 'Tidak ada field yang dikirim untuk diupdate']);
break;
}
$paramVals[] = $id;
$paramTypes .= 'i';
$sql = 'UPDATE tb_jalan SET ' . implode(', ', $setClauses) . ' WHERE id = ?';
$stmt = $conn->prepare($sql);
$stmt->bind_param($paramTypes, ...$paramVals);
if ($stmt->execute()) {
echo json_encode(['status' => 'sukses', 'pesan' => 'Data jalan berhasil diperbarui']);
} else {
throw new Exception($stmt->error);
}
break;
/* ============================================================
DELETE — Hapus data jalan
============================================================ */
case 'DELETE':
if (!$id) {
http_response_code(400);
echo json_encode(['status' => 'gagal', 'pesan' => 'Parameter id diperlukan']);
break;
}
$stmt = $conn->prepare("DELETE FROM tb_jalan WHERE id = ?");
$stmt->bind_param('i', $id);
if ($stmt->execute() && $stmt->affected_rows > 0) {
echo json_encode(['status' => 'sukses', 'pesan' => 'Data jalan berhasil dihapus']);
} else {
http_response_code(404);
echo json_encode(['status' => 'gagal', 'pesan' => 'Data tidak ditemukan atau sudah dihapus']);
}
break;
default:
http_response_code(405);
echo json_encode(['status' => 'gagal', 'pesan' => 'Method tidak didukung']);
}
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['status' => 'gagal', 'pesan' => 'Server error: ' . $e->getMessage()]);
} finally {
if ($conn) $conn->close();
}