You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

92 lines
2.9 KiB

<?php
namespace App\Controller;
use App\Form\CityToolType;
use App\Service\OverpassClient;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\HeaderUtils;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Attribute\Route;
#[Route('/tools')]
class ToolsController extends AbstractController
{
#[Route('/', name: 'app_tools')]
public function index(): Response
{
return $this->render('tools/index.html.twig', [
]);
}
#[Route('/city', name: 'app_tools_city')]
public function city(
Request $request,
OverpassClient $overpass,
): Response {
$form = $this->createForm(CityToolType::class, []);
$form->add('submit', SubmitType::class, ['label' => 'Générer']);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
$areaId = $form->get('area')->getData();
$query = sprintf('relation["boundary"="administrative"]["admin_level"="8"]["name"](area:%d);', 3600000000 + $areaId); // Cf. <https://wiki.openstreetmap.org/wiki/Overpass_API/Overpass_QL#By_area_.28area.29>
$json = $overpass->query($query);
$response = new StreamedResponse();
$response->headers->set('Content-Type', 'text/csv');
$response->headers->set(
'Content-Disposition',
HeaderUtils::makeDisposition(
HeaderUtils::DISPOSITION_ATTACHMENT,
sprintf('cities-in-%d.csv', $areaId)
)
);
$response->setCallback(function () use ($json): void {
$headings = [
'name',
'description',
'osm',
'geojson',
'status',
];
$csv = fopen('php://output', 'a');
fputcsv($csv, $headings);
$osm = \OSM\OSM::createFromJson($json);
foreach ($osm->elements as $relation) {
$name = $relation->getTagValue('name');
$feature = new \GeoJson\Feature\Feature(
\OSM\GeoJsonConverter::convertRelationToPolygon($relation),
['name' => $name]
);
fputcsv($csv, [
$name,
$name,
'',
json_encode(new \GeoJson\Feature\FeatureCollection([$feature])),
'todo',
]);
}
fclose($csv);
});
return $response;
}
return $this->render('tools/city.html.twig', [
'form' => $form,
]);
}
}