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. $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, ]); } }