Files
project_SIG/controllers/map_controller.js
T
2026-06-11 02:31:09 +00:00

79 lines
3.2 KiB
JavaScript

const db = require('../config/database');
// Mengambil data titik warga dan mengubahnya ke format GeoJSON
const dapatkan_data_publik = async (req, res) => {
try {
// Praktik keamanan: Query secara eksplisit hanya memilih data dengan status 'Verified' agar draf data lapangan tidak bocor ke publik
const query_publik = `SELECT lat, lng FROM MUSTAHIK WHERE status_validasi = 'Verified'`;
db.all(query_publik, [], (err, rows) => {
if (err) {
console.error('Gagal mengambil data peta:', err.message);
return res.status(500).json({ error: 'Kegagalan mengambil titik koordinat' });
}
// Baris kompleks: Melakukan pemetaan array objek dari baris basis data menjadi struktur hierarki GeoJSON standar. Format FeatureCollection ini adalah spesifikasi wajib yang dipahami oleh pustaka LeafletJS untuk merender penanda di atas peta.
const geojson_data = {
type: 'FeatureCollection',
features: rows.map(row => ({
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [row.lng, row.lat]
},
properties: {
keterangan: 'Lokasi Terverifikasi'
}
}))
};
res.status(200).json(geojson_data);
});
} catch (error) {
console.error('Kesalahan sistem pemetaan:', error);
res.status(500).json({ error: 'Kegagalan pemrosesan internal server' });
}
};
// Mengambil data rumah ibadah dan mengubahnya ke format GeoJSON
const dapatkan_rumah_ibadah = async (req, res) => {
try {
const query_rumah_ibadah = `SELECT nama_tempat, jenis_agama, lat, lng, alamat FROM RUMAH_IBADAH`;
db.all(query_rumah_ibadah, [], (err, rows) => {
if (err) {
console.error('Gagal mengambil data rumah ibadah:', err.message);
return res.status(500).json({ error: 'Kegagalan mengambil titik koordinat rumah ibadah' });
}
// Baris kompleks: Selain koordinat, kita menyisipkan atribut 'properties' yang berisi nama tempat dan jenis agama agar nantinya antarmuka LeafletJS bisa menampilkan popup informasi (tooltip) saat marker diklik oleh pengguna.
const geojson_data = {
type: 'FeatureCollection',
features: rows.map(row => ({
type: 'Feature',
geometry: {
type: 'Point',
coordinates: [row.lng, row.lat]
},
properties: {
nama_tempat: row.nama_tempat,
jenis_agama: row.jenis_agama,
alamat: row.alamat
}
}))
};
res.status(200).json(geojson_data);
});
} catch (error) {
console.error('Kesalahan sistem pemetaan rumah ibadah:', error);
res.status(500).json({ error: 'Kegagalan pemrosesan internal server' });
}
};
module.exports = {
dapatkan_data_publik,
dapatkan_rumah_ibadah
};