Files
d1041231029-sig-b/referensi/4_Sistem_Kemiskinan_Geospasial/export_geojson.php
T
2026-06-02 12:40:37 +07:00

134 lines
4.5 KiB
PHP

<?php
header('Content-Type: application/geo+json');
header('Content-Disposition: attachment; filename="export.geojson"');
require_once 'config.php';
try {
$db = getDB();
// Get type parameter
$type = isset($_GET['type']) ? $_GET['type'] : 'roads';
// Validate type
$valid_types = ['roads', 'parcels', 'pontianak_areas'];
if (!in_array($type, $valid_types)) {
throw new Exception('Invalid type. Must be: ' . implode(', ', $valid_types));
}
$features = [];
if ($type === 'roads') {
// Export roads as LineString features
$stmt = $db->prepare('SELECT id, name, road_type, length_meters, condition_status, coordinates, created_at FROM roads');
$stmt->execute();
$roads = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($roads as $road) {
$coordinates = json_decode($road['coordinates'], true);
// Convert [lat, lng] to [lng, lat] for GeoJSON
$geojson_coords = [];
foreach ($coordinates as $coord) {
$geojson_coords[] = [$coord[1], $coord[0]];
}
$features[] = [
'type' => 'Feature',
'geometry' => [
'type' => 'LineString',
'coordinates' => $geojson_coords
],
'properties' => [
'id' => $road['id'],
'name' => $road['name'],
'road_type' => $road['road_type'],
'length_meters' => floatval($road['length_meters']),
'length_km' => floatval($road['length_meters']) / 1000,
'condition_status' => $road['condition_status'],
'created_at' => $road['created_at']
]
];
}
} else if ($type === 'parcels') {
// Export parcels as Polygon features
$stmt = $db->prepare('SELECT id, name, certificate_type, area_sqm, coordinates, created_at FROM land_parcels');
$stmt->execute();
$parcels = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($parcels as $parcel) {
$coordinates = json_decode($parcel['coordinates'], true);
// Convert [lat, lng] to [lng, lat] for GeoJSON
$geojson_coords = [];
foreach ($coordinates as $coord) {
$geojson_coords[] = [$coord[1], $coord[0]];
}
// Close the polygon
if ($geojson_coords[0] !== end($geojson_coords)) {
$geojson_coords[] = $geojson_coords[0];
}
$features[] = [
'type' => 'Feature',
'geometry' => [
'type' => 'Polygon',
'coordinates' => [$geojson_coords]
],
'properties' => [
'id' => $parcel['id'],
'name' => $parcel['name'],
'certificate_type' => $parcel['certificate_type'],
'area_sqm' => floatval($parcel['area_sqm']),
'area_hectares' => floatval($parcel['area_sqm']) / 10000,
'created_at' => $parcel['created_at']
]
];
}
} else if ($type === 'pontianak_areas') {
// Export Pontianak areas as features
$stmt = $db->prepare('SELECT id, name, area_type, geometry, population FROM pontianak_areas ORDER BY area_type, name');
$stmt->execute();
$areas = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($areas as $area) {
$geometry = json_decode($area['geometry'], true);
$features[] = [
'type' => 'Feature',
'geometry' => $geometry,
'properties' => [
'id' => $area['id'],
'name' => $area['name'],
'area_type' => $area['area_type'],
'population' => intval($area['population'])
]
];
}
}
// Build FeatureCollection
$geojson = [
'type' => 'FeatureCollection',
'features' => $features
];
// Output GeoJSON
echo json_encode($geojson, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
} catch (PDOException $e) {
http_response_code(500);
echo json_encode([
'success' => false,
'error' => 'Database error: ' . $e->getMessage()
]);
} catch (Exception $e) {
http_response_code(400);
echo json_encode([
'success' => false,
'error' => $e->getMessage()
]);
}
?>