second commit

This commit is contained in:
2026-06-11 13:17:12 +07:00
parent a7cb1f2de0
commit 69c15319dd
9 changed files with 478 additions and 133 deletions
+19 -13
View File
@@ -1,5 +1,11 @@
<?php <?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<?php
require_once __DIR__ . '/../config/db.php'; require_once __DIR__ . '/../config/db.php';
require_once __DIR__ . '/../config/helpers.php'; require_once __DIR__ . '/../config/helpers.php';
@@ -36,6 +42,13 @@ switch ($method) {
$body = getRequestBody(); $body = getRequestBody();
$point_id = (int)($body['point_id'] ?? 0);
$jenis_bantuan = (!empty($body['jenis_bantuan'])) ? $body['jenis_bantuan'] : '';
$nominal = (isset($body['nominal']) && $body['nominal'] !== '') ? (float)$body['nominal'] : null;
$tanggal_bantuan = (!empty($body['tanggal_bantuan'])) ? $body['tanggal_bantuan'] : null;
$instansi_pemberi = (!empty($body['instansi_pemberi'])) ? $body['instansi_pemberi'] : null;
$keterangan = (!empty($body['keterangan'])) ? $body['keterangan'] : null;
$stmt = $db->prepare( $stmt = $db->prepare(
"INSERT INTO bantuan "INSERT INTO bantuan
( (
@@ -51,19 +64,12 @@ switch ($method) {
); );
$stmt->execute([ $stmt->execute([
$point_id,
$body['point_id'], $jenis_bantuan,
$nominal,
$body['jenis_bantuan'], $tanggal_bantuan,
$instansi_pemberi,
$body['nominal'], $keterangan
$body['tanggal_bantuan'],
$body['instansi_pemberi'],
$body['keterangan']
]); ]);
jsonResponse([ jsonResponse([
+21 -7
View File
@@ -1,5 +1,11 @@
<?php <?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<?php
require_once __DIR__ . '/../config/db.php'; require_once __DIR__ . '/../config/db.php';
require_once __DIR__ . '/../config/helpers.php'; require_once __DIR__ . '/../config/helpers.php';
@@ -44,6 +50,14 @@ switch ($method) {
$body = getRequestBody(); $body = getRequestBody();
$nama_pelapor = (!empty($body['nama_pelapor'])) ? $body['nama_pelapor'] : '';
$no_hp = (!empty($body['no_hp'])) ? $body['no_hp'] : null;
$nama_warga = (!empty($body['nama_warga'])) ? $body['nama_warga'] : '';
$alamat = (!empty($body['alamat'])) ? $body['alamat'] : null;
$latitude = (isset($body['latitude']) && $body['latitude'] !== '') ? (float)$body['latitude'] : null;
$longitude = (isset($body['longitude']) && $body['longitude'] !== '') ? (float)$body['longitude'] : null;
$keterangan = (!empty($body['keterangan'])) ? $body['keterangan'] : null;
$stmt = $db->prepare( $stmt = $db->prepare(
"INSERT INTO laporan_masyarakat "INSERT INTO laporan_masyarakat
( (
@@ -61,13 +75,13 @@ switch ($method) {
); );
$stmt->execute([ $stmt->execute([
$body['nama_pelapor'] ?? '', $nama_pelapor,
$body['no_hp'] ?? '', $no_hp,
$body['nama_warga'] ?? '', $nama_warga,
$body['alamat'] ?? '', $alamat,
$body['latitude'] ?? null, $latitude,
$body['longitude'] ?? null, $longitude,
$body['keterangan'] ?? '', $keterangan,
'Menunggu Verifikasi' 'Menunggu Verifikasi'
]); ]);
+7
View File
@@ -1,3 +1,10 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<?php <?php
// ============================================================ // ============================================================
// api/parcels.php — CRUD for land parcel polygons // api/parcels.php — CRUD for land parcel polygons
+47 -20
View File
@@ -1,9 +1,18 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<?php <?php
// ============================================================ // ============================================================
// api/points.php — CRUD for point features // api/points.php — CRUD for point features
// Supports: SPBU, Mosque, Poor Population // Supports: SPBU, Mosque, Poor Population
// ============================================================ // ============================================================
require_once __DIR__ . '/../config/db.php'; require_once __DIR__ . '/../config/db.php';
require_once __DIR__ . '/../config/helpers.php'; require_once __DIR__ . '/../config/helpers.php';
@@ -93,6 +102,16 @@ switch ($method) {
jsonResponse(['error' => 'Invalid category'], 422); jsonResponse(['error' => 'Invalid category'], 422);
} }
$subtype = (!empty($body['subtype'])) ? $body['subtype'] : null;
$description = (!empty($body['description'])) ? $body['description'] : null;
$tanggal_lahir = (!empty($body['tanggal_lahir'])) ? $body['tanggal_lahir'] : null;
$pendidikan = (!empty($body['pendidikan'])) ? $body['pendidikan'] : null;
$pekerjaan = (!empty($body['pekerjaan'])) ? $body['pekerjaan'] : null;
$jumlah_tanggungan = (isset($body['jumlah_tanggungan']) && $body['jumlah_tanggungan'] !== '') ? (int)$body['jumlah_tanggungan'] : null;
$riwayat_penyakit = (!empty($body['riwayat_penyakit'])) ? $body['riwayat_penyakit'] : null;
$alamat = (!empty($body['alamat'])) ? $body['alamat'] : null;
$status_verifikasi = (!empty($body['status_verifikasi'])) ? $body['status_verifikasi'] : 'Menunggu Verifikasi';
$stmt = $db->prepare( $stmt = $db->prepare(
'INSERT INTO points ( 'INSERT INTO points (
name, name,
@@ -114,20 +133,19 @@ switch ($method) {
$stmt->execute([ $stmt->execute([
$body['name'], $body['name'],
$body['category'], $body['category'],
$body['subtype'] ?? null, $subtype,
(float)$body['latitude'], (float)$body['latitude'],
(float)$body['longitude'], (float)$body['longitude'],
$body['description'] ?? null, $description,
$body['tanggal_lahir'] ?? null, $tanggal_lahir,
$body['pendidikan'] ?? null, $pendidikan,
$body['pekerjaan'] ?? null, $pekerjaan,
$body['jumlah_tanggungan'] ?? null, $jumlah_tanggungan,
$body['riwayat_penyakit'] ?? null, $riwayat_penyakit,
$body['alamat'] ?? null, $alamat,
$body['status_verifikasi'] $status_verifikasi
?? 'Menunggu Verifikasi'
]); ]);
$id = (int)$db->lastInsertId(); $id = (int)$db->lastInsertId();
@@ -154,6 +172,16 @@ switch ($method) {
jsonResponse(['error' => 'Point not found'], 404); jsonResponse(['error' => 'Point not found'], 404);
} }
$subtype = (!empty($body['subtype'])) ? $body['subtype'] : null;
$description = (!empty($body['description'])) ? $body['description'] : null;
$tanggal_lahir = (!empty($body['tanggal_lahir'])) ? $body['tanggal_lahir'] : null;
$pendidikan = (!empty($body['pendidikan'])) ? $body['pendidikan'] : null;
$pekerjaan = (!empty($body['pekerjaan'])) ? $body['pekerjaan'] : null;
$jumlah_tanggungan = (isset($body['jumlah_tanggungan']) && $body['jumlah_tanggungan'] !== '') ? (int)$body['jumlah_tanggungan'] : null;
$riwayat_penyakit = (!empty($body['riwayat_penyakit'])) ? $body['riwayat_penyakit'] : null;
$alamat = (!empty($body['alamat'])) ? $body['alamat'] : null;
$status_verifikasi = (!empty($body['status_verifikasi'])) ? $body['status_verifikasi'] : 'Menunggu Verifikasi';
$stmt = $db->prepare( $stmt = $db->prepare(
'UPDATE points SET 'UPDATE points SET
name=?, name=?,
@@ -174,22 +202,21 @@ switch ($method) {
$stmt->execute([ $stmt->execute([
$body['name'] ?? '', $body['name'] ?? '',
$body['category'] ?? 'spbu', $body['category'] ?? 'spbu',
$body['subtype'] ?? null, $subtype,
(float)($body['latitude'] ?? 0), (float)($body['latitude'] ?? 0),
(float)($body['longitude'] ?? 0), (float)($body['longitude'] ?? 0),
$body['description'] ?? null, $description,
$body['tanggal_lahir'] ?? null, $tanggal_lahir,
$body['pendidikan'] ?? null, $pendidikan,
$body['pekerjaan'] ?? null, $pekerjaan,
$body['jumlah_tanggungan'] ?? null, $jumlah_tanggungan,
$body['riwayat_penyakit'] ?? null, $riwayat_penyakit,
$body['alamat'] ?? null, $alamat,
$body['status_verifikasi'] $status_verifikasi,
?? 'Menunggu Verifikasi',
$id $id
]); ]);
+7
View File
@@ -1,3 +1,10 @@
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<?php <?php
// ============================================================ // ============================================================
// api/roads.php — CRUD for road polylines // api/roads.php — CRUD for road polylines
+20 -9
View File
@@ -223,7 +223,7 @@ function enableLaporanAdd() {
openLaporanModal(e.latlng); openLaporanModal(e.latlng);
map.off('click', laporanClickHandler); disableLaporanAdd();
}; };
map.once('click', laporanClickHandler); map.once('click', laporanClickHandler);
@@ -238,6 +238,13 @@ function disablePointAdd() {
updateDrawModeUI(); updateDrawModeUI();
} }
function disableLaporanAdd() {
if (laporanClickHandler) {
map.off('click', laporanClickHandler);
laporanClickHandler = null;
}
}
/* Load all points from API */ /* Load all points from API */
async function loadPoints() { async function loadPoints() {
const res = await fetch(API.points); const res = await fetch(API.points);
@@ -504,6 +511,7 @@ function showModal(type, data, extra) {
<textarea id="f-alamat">${data?.alamat || ''}</textarea> <textarea id="f-alamat">${data?.alamat || ''}</textarea>
</div> </div>
<input type="hidden" id="f-status-verifikasi" value="${data?.status_verifikasi || 'Menunggu Verifikasi'}">
</div> </div>
<div class="btn-row"> <div class="btn-row">
<button class="btn btn-primary btn-full" onclick="savePoint(${data?.id || 'null'}, ${latlng?.lat}, ${latlng?.lng})"> <button class="btn btn-primary btn-full" onclick="savePoint(${data?.id || 'null'}, ${latlng?.lat}, ${latlng?.lng})">
@@ -749,7 +757,7 @@ async function savePoint(id, lat, lng) {
document.getElementById('f-alamat')?.value || null, document.getElementById('f-alamat')?.value || null,
status_verifikasi: status_verifikasi:
'Menunggu Verifikasi' id ? (document.getElementById('f-status-verifikasi')?.value || 'Menunggu Verifikasi') : 'Menunggu Verifikasi'
}; };
try { try {
let res; let res;
@@ -1334,6 +1342,7 @@ document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') { if (e.key === 'Escape') {
stopDraw(); stopDraw();
disablePointAdd(); disablePointAdd();
disableLaporanAdd();
closeModal(); closeModal();
} }
}); });
@@ -1347,13 +1356,15 @@ function updateMarkerColors() {
poorMarkers.forEach(marker => { poorMarkers.forEach(marker => {
let distance = map.distance(selectedCenter, marker.getLatLng()); let distance = map.distance(selectedCenter, marker.getLatLng());
const el = marker.getElement();
if (distance <= radius) { if (el) {
marker.getElement().style.filter = "hue-rotate(0deg)"; if (distance <= radius) {
inside++; el.style.filter = "hue-rotate(0deg)";
} else { inside++;
marker.getElement().style.filter = "hue-rotate(120deg)"; } else {
outside++; el.style.filter = "hue-rotate(120deg)";
outside++;
}
} }
}); });
+49 -9
View File
@@ -12,15 +12,55 @@ USE webgis_db;
-- Stores all point-type features (SPBU, Mosque, Poor Population) -- Stores all point-type features (SPBU, Mosque, Poor Population)
-- ------------------------------------------------------------ -- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS points ( CREATE TABLE IF NOT EXISTS points (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL,
category ENUM('spbu','mosque','poor') NOT NULL COMMENT 'spbu=Gas Station, mosque=Mosque, poor=Poor Population', category ENUM('spbu','mosque','poor') NOT NULL COMMENT 'spbu=Gas Station, mosque=Mosque, poor=Poor Population',
subtype VARCHAR(100) DEFAULT NULL COMMENT 'For SPBU: 24hours or not24hours', subtype VARCHAR(100) DEFAULT NULL COMMENT 'For SPBU: 24hours or not24hours',
latitude DECIMAL(10,8) NOT NULL, latitude DECIMAL(10,8) NOT NULL,
longitude DECIMAL(11,8) NOT NULL, longitude DECIMAL(11,8) NOT NULL,
description TEXT DEFAULT NULL, description TEXT DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
tanggal_lahir DATE DEFAULT NULL,
pendidikan VARCHAR(100) DEFAULT NULL,
pekerjaan VARCHAR(100) DEFAULT NULL,
jumlah_tanggungan INT DEFAULT NULL,
riwayat_penyakit TEXT DEFAULT NULL,
alamat TEXT DEFAULT NULL,
status_verifikasi ENUM('Menunggu Verifikasi','Layak','Tidak Layak','Perlu Verifikasi Ulang') DEFAULT 'Menunggu Verifikasi'
) ENGINE=InnoDB;
-- ------------------------------------------------------------
-- TABLE: laporan_masyarakat
-- Stores reports submitted by citizens about poor populations
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS laporan_masyarakat (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_pelapor VARCHAR(100) NOT NULL,
no_hp VARCHAR(20) DEFAULT NULL,
nama_warga VARCHAR(100) NOT NULL,
alamat TEXT DEFAULT NULL,
latitude DECIMAL(10,8) DEFAULT NULL,
longitude DECIMAL(11,8) DEFAULT NULL,
keterangan TEXT DEFAULT NULL,
status ENUM('Menunggu Verifikasi','Disetujui','Ditolak') DEFAULT 'Menunggu Verifikasi',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- ------------------------------------------------------------
-- TABLE: bantuan
-- Stores aid distribution records for poor populations
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
point_id INT NOT NULL,
jenis_bantuan VARCHAR(100) NOT NULL,
nominal DECIMAL(12,2) DEFAULT NULL,
tanggal_bantuan DATE DEFAULT NULL,
instansi_pemberi VARCHAR(100) DEFAULT NULL,
keterangan TEXT DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (point_id) REFERENCES points (id) ON DELETE CASCADE
) ENGINE=InnoDB; ) ENGINE=InnoDB;
-- ------------------------------------------------------------ -- ------------------------------------------------------------
+49 -9
View File
@@ -12,15 +12,55 @@ USE webgis_db;
-- Stores all point-type features (SPBU, Mosque, Poor Population) -- Stores all point-type features (SPBU, Mosque, Poor Population)
-- ------------------------------------------------------------ -- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS points ( CREATE TABLE IF NOT EXISTS points (
id INT AUTO_INCREMENT PRIMARY KEY, id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL,
category ENUM('spbu','mosque','poor') NOT NULL COMMENT 'spbu=Gas Station, mosque=Mosque, poor=Poor Population', category ENUM('spbu','mosque','poor') NOT NULL COMMENT 'spbu=Gas Station, mosque=Mosque, poor=Poor Population',
subtype VARCHAR(100) DEFAULT NULL COMMENT 'For SPBU: 24hours or not24hours', subtype VARCHAR(100) DEFAULT NULL COMMENT 'For SPBU: 24hours or not24hours',
latitude DECIMAL(10,8) NOT NULL, latitude DECIMAL(10,8) NOT NULL,
longitude DECIMAL(11,8) NOT NULL, longitude DECIMAL(11,8) NOT NULL,
description TEXT DEFAULT NULL, description TEXT DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
tanggal_lahir DATE DEFAULT NULL,
pendidikan VARCHAR(100) DEFAULT NULL,
pekerjaan VARCHAR(100) DEFAULT NULL,
jumlah_tanggungan INT DEFAULT NULL,
riwayat_penyakit TEXT DEFAULT NULL,
alamat TEXT DEFAULT NULL,
status_verifikasi ENUM('Menunggu Verifikasi','Layak','Tidak Layak','Perlu Verifikasi Ulang') DEFAULT 'Menunggu Verifikasi'
) ENGINE=InnoDB;
-- ------------------------------------------------------------
-- TABLE: laporan_masyarakat
-- Stores reports submitted by citizens about poor populations
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS laporan_masyarakat (
id INT AUTO_INCREMENT PRIMARY KEY,
nama_pelapor VARCHAR(100) NOT NULL,
no_hp VARCHAR(20) DEFAULT NULL,
nama_warga VARCHAR(100) NOT NULL,
alamat TEXT DEFAULT NULL,
latitude DECIMAL(10,8) DEFAULT NULL,
longitude DECIMAL(11,8) DEFAULT NULL,
keterangan TEXT DEFAULT NULL,
status ENUM('Menunggu Verifikasi','Disetujui','Ditolak') DEFAULT 'Menunggu Verifikasi',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- ------------------------------------------------------------
-- TABLE: bantuan
-- Stores aid distribution records for poor populations
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS bantuan (
id INT AUTO_INCREMENT PRIMARY KEY,
point_id INT NOT NULL,
jenis_bantuan VARCHAR(100) NOT NULL,
nominal DECIMAL(12,2) DEFAULT NULL,
tanggal_bantuan DATE DEFAULT NULL,
instansi_pemberi VARCHAR(100) DEFAULT NULL,
keterangan TEXT DEFAULT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (point_id) REFERENCES points (id) ON DELETE CASCADE
) ENGINE=InnoDB; ) ENGINE=InnoDB;
-- ------------------------------------------------------------ -- ------------------------------------------------------------
+259 -66
View File
@@ -3,18 +3,250 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SinergiSpasial | WebGIS Pontianak</title>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;600;700&display=swap" rel="stylesheet">
<style>
:root {
--primary: #00d2ff;
--secondary: #3a7bd5;
--bg-dark: #0b0f19;
--surface: rgba(20, 27, 45, 0.6);
--surface-border: rgba(255, 255, 255, 0.1);
--text-main: #f8fafc;
--text-muted: #94a3b8;
}
<title>SinergiSpasial</title> * {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
scroll-behavior: smooth;
}
<link rel="stylesheet" href="assets/css/style.css"> body {
background-color: var(--bg-dark);
color: var(--text-main);
/* Membuat efek grid khas peta digital/GIS */
background-image:
linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
background-size: 30px 30px;
overflow-x: hidden;
}
/* --- Header & Nav (Glassmorphism) --- */
header {
position: fixed;
top: 0;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px 5%;
background: rgba(11, 15, 25, 0.8);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--surface-border);
z-index: 1000;
}
.logo {
font-size: 1.5rem;
font-weight: 700;
color: var(--primary);
text-shadow: 0 0 10px rgba(0, 210, 255, 0.4);
display: flex;
align-items: center;
gap: 10px;
}
nav a {
color: var(--text-main);
text-decoration: none;
margin-left: 30px;
font-size: 0.9rem;
font-weight: 400;
transition: color 0.3s;
}
nav a:hover {
color: var(--primary);
}
/* --- Global Section --- */
.section {
padding: 100px 5%;
text-align: center;
}
h2 {
font-size: 2.5rem;
margin-bottom: 20px;
background: -webkit-linear-gradient(right, var(--primary), var(--secondary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
/* --- Hero Section --- */
.hero {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
position: relative;
padding: 0 5%;
}
/* Efek cahaya radial di background Hero */
.hero::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 600px;
height: 600px;
background: radial-gradient(circle, rgba(58, 123, 213, 0.15) 0%, transparent 70%);
z-index: -1;
}
.hero-content {
max-width: 800px;
}
.hero h1 {
font-size: 3.5rem;
line-height: 1.2;
margin-bottom: 20px;
}
.hero p {
font-size: 1.1rem;
color: var(--text-muted);
margin-bottom: 40px;
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
.btn {
display: inline-block;
padding: 15px 35px;
font-size: 1rem;
font-weight: 600;
color: #fff;
text-decoration: none;
background: linear-gradient(45deg, var(--secondary), var(--primary));
border-radius: 30px;
box-shadow: 0 10px 20px rgba(0, 210, 255, 0.3);
transition: transform 0.3s, box-shadow 0.3s;
}
.btn:hover {
transform: translateY(-3px);
box-shadow: 0 15px 25px rgba(0, 210, 255, 0.5);
}
/* --- Cards (Fitur) --- */
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 30px;
margin-top: 40px;
}
.card {
background: var(--surface);
backdrop-filter: blur(10px);
border: 1px solid var(--surface-border);
padding: 40px 20px;
border-radius: 20px;
transition: transform 0.3s, border-color 0.3s;
text-align: left;
}
.card:hover {
transform: translateY(-10px);
border-color: var(--primary);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
}
.card h3 {
font-size: 1.5rem;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 10px;
}
.card p {
color: var(--text-muted);
font-size: 0.95rem;
line-height: 1.6;
}
/* --- Preview --- */
.preview {
width: 100%;
max-width: 900px;
border-radius: 15px;
box-shadow: 0 20px 50px rgba(0,0,0,0.5);
border: 1px solid var(--surface-border);
margin-top: 30px;
}
/* --- Flow (Alur Analisis) --- */
.flow {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
gap: 15px;
margin-top: 40px;
}
.flow-item {
background: var(--surface);
border: 1px solid var(--surface-border);
padding: 15px 25px;
border-radius: 30px;
font-weight: 600;
color: var(--primary);
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
.flow-arrow {
color: var(--text-muted);
font-size: 1.2rem;
}
/* --- Footer --- */
footer {
text-align: center;
padding: 30px;
background: rgba(11, 15, 25, 0.9);
border-top: 1px solid var(--surface-border);
color: var(--text-muted);
font-size: 0.9rem;
}
/* Responsiveness */
@media (max-width: 768px) {
.hero h1 { font-size: 2.5rem; }
.flow { flex-direction: column; }
.flow-arrow { transform: rotate(90deg); }
nav { display: none; } /* Bisa ditambah hamburger menu nanti */
}
</style>
</head> </head>
<body> <body>
<header> <header>
<div class="logo"> <div class="logo">
🕌 SinergiSpasial 🗺️ SinergiSpasial
</div> </div>
<nav> <nav>
<a href="#tentang">Tentang</a> <a href="#tentang">Tentang</a>
<a href="#fitur">Fitur</a> <a href="#fitur">Fitur</a>
@@ -23,109 +255,70 @@
</header> </header>
<section class="hero"> <section class="hero">
<div class="hero-content"> <div class="hero-content">
<h1> <h1>
Sistem Informasi Geografis Sistem Informasi Geografis<br>
Berbasis Web untuk Analisis Berbasis Web untuk Analisis<br>
Sebaran Kemiskinan Sebaran Kemiskinan
</h1> </h1>
<p> <p>
Membantu identifikasi wilayah bantuan Membantu identifikasi wilayah bantuan berdasarkan jangkauan radius masjid di Kota Pontianak dengan pendekatan presisi geospasial.
berdasarkan jangkauan masjid
di Kota Pontianak.
</p> </p>
<a href="dashboard.html" class="btn"> <a href="dashboard.html" class="btn">
Masuk ke Sistem Masuk ke Dashboard GIS
</a> </a>
</div> </div>
</section> </section>
<section id="tentang" class="section"> <section id="tentang" class="section">
<h2>Tentang Sistem</h2> <h2>Tentang Sistem</h2>
<p style="color: var(--text-muted); max-width: 700px; margin: 0 auto; line-height: 1.8;">
<p> SinergiSpasial merupakan WebGIS yang dirancang untuk membantu visualisasi dan analisis sebaran penduduk miskin menggunakan pendekatan geospasial berbasis radius jangkauan masjid.
SinergiSpasial merupakan WebGIS yang
dirancang untuk membantu visualisasi
dan analisis sebaran penduduk miskin
menggunakan pendekatan geospasial
berbasis radius jangkauan masjid.
</p> </p>
</section> </section>
<section id="fitur" class="section"> <section id="fitur" class="section">
<h2>Fitur Unggulan</h2> <h2>Fitur Unggulan</h2>
<div class="cards"> <div class="cards">
<div class="card"> <div class="card">
<h3>🕌 Data Masjid</h3> <h3>🕌 Data Masjid</h3>
<p>Manajemen lokasi masjid sebagai pusat bantuan.</p> <p>Manajemen titik koordinat dan lokasi masjid sebagai titik pusat distribusi bantuan.</p>
</div> </div>
<div class="card"> <div class="card">
<h3>👨‍👩‍👧‍👦 Data Penduduk</h3> <h3>👨‍👩‍👧‍👦 Data Penduduk</h3>
<p>Pemetaan penduduk miskin berbasis lokasi.</p> <p>Pemetaan data demografi penduduk miskin secara akurat berbasis lokasi (Point of Interest).</p>
</div> </div>
<div class="card"> <div class="card">
<h3>📍 Analisis Radius</h3> <h3>📍 Analisis Radius</h3>
<p>Menentukan jangkauan bantuan secara otomatis.</p> <p>Pemrosesan buffer/radius secara otomatis untuk menentukan area jangkauan bantuan yang optimal.</p>
</div> </div>
</div> </div>
</section> </section>
<section id="preview" class="section"> <section id="preview" class="section">
<h2>Preview Sistem</h2> <h2>Preview Sistem</h2>
<div style="width: 100%; max-width: 900px; height: 500px; background: var(--surface); margin: 30px auto 0; border-radius: 15px; border: 1px solid var(--surface-border); display: flex; align-items: center; justify-content: center; color: var(--text-muted);">
<img src="assets/img/preview.png" [ Area Gambar Preview Map / Dashboard ]
alt="Preview Dashboard" </div>
class="preview">
</section> </section>
<section class="section"> <section class="section">
<h2>Alur Analisis Geospasial</h2>
<h2>Alur Analisis</h2>
<div class="flow"> <div class="flow">
<div class="flow-item">Pilih Masjid</div>
<div>Pilih Masjid</div> <div class="flow-arrow"></div>
<div></div> <div class="flow-item">Tentukan Radius</div>
<div class="flow-arrow"></div>
<div>Tentukan Radius</div> <div class="flow-item">Hitung Intersect Jarak</div>
<div></div> <div class="flow-arrow"></div>
<div class="flow-item">Identifikasi Penduduk</div>
<div>Hitung Jarak</div> <div class="flow-arrow"></div>
<div></div> <div class="flow-item">Rekomendasi Bantuan</div>
<div>Identifikasi Penduduk</div>
<div></div>
<div>Rekomendasi Bantuan</div>
</div> </div>
</section> </section>
<footer> <footer>
<p>© 2026 SinergiSpasial Sistem Informasi Geografis Kota Pontianak</p>
<p>
© 2026 SinergiSpasial
Sistem Informasi Geografis Kota Pontianak
</p>
</footer> </footer>
</body> </body>