151 lines
4.7 KiB
PHP
151 lines
4.7 KiB
PHP
<?php
|
|
/**
|
|
* WebGIS API - Get Data Endpoint (Improved Version)
|
|
* Version: 1.0
|
|
* Method: GET, POST
|
|
* Description: Retrieve feature data with filtering and pagination
|
|
*/
|
|
|
|
require_once 'api_utils.php';
|
|
|
|
// Accept GET or POST
|
|
if (!in_array($_SERVER['REQUEST_METHOD'], ['GET', 'POST'])) {
|
|
sendError('Method not allowed', 405);
|
|
}
|
|
|
|
$conn = getConnection();
|
|
|
|
try {
|
|
// Get parameters
|
|
$tipe = $_GET['tipe'] ?? $_POST['tipe'] ?? null;
|
|
$status = $_GET['status'] ?? $_POST['status'] ?? 'aktif';
|
|
$limit = intval($_GET['limit'] ?? $_POST['limit'] ?? 1000);
|
|
$offset = intval($_GET['offset'] ?? $_POST['offset'] ?? 0);
|
|
$format = $_GET['format'] ?? $_POST['format'] ?? 'geojson';
|
|
|
|
// Limit for security
|
|
if ($limit > 5000) $limit = 5000;
|
|
|
|
// Build WHERE clause
|
|
$where = "1=1";
|
|
|
|
if ($status) {
|
|
$where .= " AND status = '" . $conn->real_escape_string($status) . "'";
|
|
}
|
|
|
|
if ($tipe) {
|
|
// Validate tipe value
|
|
$valid_tipos = ['point', 'worship', 'poor_house', 'jalan', 'parsil'];
|
|
if (in_array($tipe, $valid_tipos)) {
|
|
$where .= " AND tipe = '" . $conn->real_escape_string($tipe) . "'";
|
|
}
|
|
}
|
|
|
|
// Count total
|
|
$count_sql = "SELECT COUNT(*) as total FROM data_unified WHERE $where";
|
|
$count_result = $conn->query($count_sql);
|
|
$count_row = $count_result->fetch_assoc();
|
|
$total = $count_row['total'];
|
|
|
|
// Get data
|
|
$sql = "SELECT * FROM data_unified WHERE $where LIMIT $limit OFFSET $offset";
|
|
$result = $conn->query($sql);
|
|
|
|
if (!$result) {
|
|
sendError('Query failed: ' . $conn->error, 500);
|
|
}
|
|
|
|
$features = [];
|
|
while ($row = $result->fetch_assoc()) {
|
|
if ($row['geom']) {
|
|
// Parse existing GeoJSON
|
|
$geom = json_decode($row['geom'], true);
|
|
} else if ($row['latitude'] && $row['longitude']) {
|
|
// Create Point geometry
|
|
$geom = [
|
|
'type' => 'Point',
|
|
'coordinates' => [floatval($row['longitude']), floatval($row['latitude'])]
|
|
];
|
|
} else {
|
|
$geom = null;
|
|
}
|
|
|
|
if ($geom) {
|
|
// Create properties
|
|
$properties = [
|
|
'id' => intval($row['id']),
|
|
'tipe' => $row['tipe'],
|
|
'nama' => $row['nama'],
|
|
'jenis' => $row['jenis'],
|
|
'alamat' => $row['alamat'],
|
|
'status' => $row['status'],
|
|
'created_at' => $row['created_at'],
|
|
'updated_at' => $row['updated_at']
|
|
];
|
|
|
|
// Add conditional properties based on type
|
|
if ($row['tipe'] === 'worship') {
|
|
$properties['radius_meter'] = intval($row['radius_meter'] ?? 200);
|
|
$properties['kapasitas'] = intval($row['kapasitas'] ?? 0);
|
|
$properties['kegiatan'] = $row['kegiatan'];
|
|
$properties['kontak'] = $row['kontak'];
|
|
}
|
|
|
|
if ($row['tipe'] === 'poor_house') {
|
|
$properties['nama_kepala_keluarga'] = $row['nama_kepala_keluarga'];
|
|
$properties['jumlah_anggota'] = intval($row['jumlah_anggota'] ?? 0);
|
|
$properties['kondisi_rumah'] = $row['kondisi_rumah'];
|
|
$properties['status_bantuan'] = $row['status_bantuan'];
|
|
}
|
|
|
|
if ($row['tipe'] === 'jalan') {
|
|
$properties['panjang'] = floatval($row['panjang'] ?? 0);
|
|
}
|
|
|
|
if ($row['tipe'] === 'parsil') {
|
|
$properties['luas'] = floatval($row['luas'] ?? 0);
|
|
}
|
|
|
|
$features[] = [
|
|
'type' => 'Feature',
|
|
'geometry' => $geom,
|
|
'properties' => $properties
|
|
];
|
|
}
|
|
}
|
|
|
|
// Format response
|
|
if ($format === 'geojson') {
|
|
$response = [
|
|
'type' => 'FeatureCollection',
|
|
'features' => $features,
|
|
'pagination' => [
|
|
'total' => $total,
|
|
'count' => count($features),
|
|
'limit' => $limit,
|
|
'offset' => $offset
|
|
]
|
|
];
|
|
|
|
http_response_code(200);
|
|
echo json_encode($response);
|
|
} else if ($format === 'json') {
|
|
sendResponse(true, 'Data retrieved successfully', [
|
|
'total' => $total,
|
|
'features' => $features,
|
|
'pagination' => [
|
|
'limit' => $limit,
|
|
'offset' => $offset
|
|
]
|
|
]);
|
|
} else {
|
|
sendError('Invalid format', 400);
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
sendError('Server error: ' . $e->getMessage(), 500);
|
|
} finally {
|
|
$conn->close();
|
|
}
|
|
?>
|