mirror of
https://forge.chapril.org/tykayn/osm-commerces
synced 2025-06-20 01:44:42 +02:00
up
This commit is contained in:
parent
9390a38adf
commit
248140d78a
7 changed files with 92 additions and 73 deletions
|
@ -31,4 +31,16 @@ table.js-sort-table th:hover {
|
||||||
|
|
||||||
table.js-sort-table th:active {
|
table.js-sort-table th:active {
|
||||||
background-color: #e0e0e0;
|
background-color: #e0e0e0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.maplibregl-popup-content {
|
||||||
|
overflow-y: auto;
|
||||||
|
min-width: 300px;
|
||||||
|
max-height: 400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.maplibregl-popup-content h1,
|
||||||
|
.maplibregl-popup-content h2,
|
||||||
|
.maplibregl-popup-contenth3 {
|
||||||
|
font-size: 1rem;
|
||||||
}
|
}
|
|
@ -209,50 +209,41 @@ final class AdminController extends AbstractController
|
||||||
}
|
}
|
||||||
// pour chaque résultat, vérifier que l'on a pas déjà un commerce avec le même osm_object_id
|
// pour chaque résultat, vérifier que l'on a pas déjà un commerce avec le même osm_object_id
|
||||||
|
|
||||||
$results = array_filter($results, function($commerce) use ($osm_object_ids) {
|
$new_places_list = array_filter($results, function($commerce) use ($osm_object_ids) {
|
||||||
return !in_array($commerce['id'], $osm_object_ids);
|
return !in_array($commerce['id'], $osm_object_ids);
|
||||||
});
|
});
|
||||||
|
$existing_places_list = array_filter($results, function($commerce) use ($osm_object_ids) {
|
||||||
|
return in_array($commerce['id'], $osm_object_ids);
|
||||||
|
});
|
||||||
|
|
||||||
// on crée un commerce pour chaque résultat qui reste
|
// on crée un commerce pour chaque résultat qui reste
|
||||||
foreach ($results as $result) {
|
foreach ($new_places_list as $np) {
|
||||||
$commerce = new Place();
|
$new_place = new Place();
|
||||||
|
|
||||||
if (isset($result['tags']['amenity'])) {
|
$new_place
|
||||||
$commerce->setMainTag('amenity='.$result['tags']['amenity']);
|
|
||||||
}
|
|
||||||
if (isset($result['tags']['shop'])) {
|
|
||||||
$commerce->setMainTag('shop='.$result['tags']['shop']);
|
|
||||||
}
|
|
||||||
if (isset($result['tags']['tourism'])) {
|
|
||||||
$commerce->setMainTag('tourism='.$result['tags']['tourism']);
|
|
||||||
}
|
|
||||||
$commerce->setOsmId($result['id'])
|
|
||||||
->setOsmKind($result['type'])
|
|
||||||
->setName($result['name'])
|
|
||||||
->setZipCode($zip_code)
|
|
||||||
->setEmail($result['email'])
|
|
||||||
->setUuidForUrl($this->motocultrice->uuid_create())
|
->setUuidForUrl($this->motocultrice->uuid_create())
|
||||||
->setOptedOut(false)
|
|
||||||
->setDead(false)
|
|
||||||
|
|
||||||
->setModifiedDate(new \DateTime())
|
->setModifiedDate(new \DateTime())
|
||||||
|
->setStats($stats)
|
||||||
|
->setDead(false)
|
||||||
|
->setOptedOut(false)
|
||||||
->setAskedHumainsSupport(false)
|
->setAskedHumainsSupport(false)
|
||||||
->setLastContactAttemptDate(null)
|
->setLastContactAttemptDate(null)
|
||||||
->setStats($stats)
|
->update_place_from_overpass_data($new_place);
|
||||||
->setNote($result['tags'] && isset($result['tags']['note']) ? isset($result['tags']['note']) : null)
|
$this->entityManager->persist($new_place);
|
||||||
->setHasOpeningHours($result['tags'] && isset($result['tags']['opening_hours']) ? isset($result['tags']['opening_hours']) : null)
|
}
|
||||||
->setHasAddress(($result['tags'] && isset($result['tags']['address']) || $result['tags'] && isset($result['tags']['contact:address'])) ? isset($result['tags']['address']) : null)
|
// Mise à jour des commerces existants avec les données Overpass
|
||||||
->setHasWebsite($result['tags'] && isset($result['tags']['website']) ? $result['tags']['website'] : null)
|
foreach ($commerces as $existing_places_list) {
|
||||||
->setHasWheelchair($result['tags'] && isset($result['tags']['wheelchair']) ? $result['tags']['wheelchair'] : null)
|
foreach ($results as $result) {
|
||||||
->setHasNote($result['tags'] && isset($result['tags']['note']) ? $result['tags']['note'] : null)
|
if ($existing_places_list->getOsmId() == $result['id'] && $existing_places_list->getOsmKind() == $result['type']) {
|
||||||
->setNoteContent($result['tags'] && isset($result['tags']['note']) ? $result['tags']['note'] : null)
|
$existing_places_list->update_place_from_overpass_data($result);
|
||||||
;
|
$this->entityManager->persist($existing_places_list);
|
||||||
$this->entityManager->persist($commerce);
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->entityManager->flush();
|
$this->entityManager->flush();
|
||||||
|
|
||||||
$commerces = $this->entityManager->getRepository(Place::class)->findBy(['zip_code' => $zip_code]);
|
|
||||||
|
|
||||||
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
|
$stats = $this->entityManager->getRepository(Stats::class)->findOneBy(['zone' => $zip_code]);
|
||||||
return $this->render('admin/labourage_results.html.twig', [
|
return $this->render('admin/labourage_results.html.twig', [
|
||||||
|
@ -365,7 +356,7 @@ final class AdminController extends AbstractController
|
||||||
$response->headers->set('Content-Type', 'text/csv');
|
$response->headers->set('Content-Type', 'text/csv');
|
||||||
|
|
||||||
$slug_name = str_replace(' ', '-', $stats->getName());
|
$slug_name = str_replace(' ', '-', $stats->getName());
|
||||||
|
|
||||||
$response->headers->set('Content-Disposition', 'attachment; filename="osm-commerces-export_' . $zip_code . '_' . $slug_name . '_' . date('Y-m-d_H-i-s') . '.csv"');
|
$response->headers->set('Content-Disposition', 'attachment; filename="osm-commerces-export_' . $zip_code . '_' . $slug_name . '_' . date('Y-m-d_H-i-s') . '.csv"');
|
||||||
|
|
||||||
return $response;
|
return $response;
|
||||||
|
|
|
@ -100,7 +100,7 @@ class PublicController extends AbstractController
|
||||||
$message = (new Email())
|
$message = (new Email())
|
||||||
->from('contact@osm-commerce.fr')
|
->from('contact@osm-commerce.fr')
|
||||||
->to($destinataire)
|
->to($destinataire)
|
||||||
->subject('Votre lien de modification OpenStreetMap')
|
->subject('Votre lien de modification Ope nStreetMap')
|
||||||
->text('Bonjour, nous sommes des bénévoles d\'OpenStreetMap France et nous vous proposons de modifier les informations de votre commerce. Voici votre lien unique de modification: ' . $this->generateUrl('app_public_edit', [
|
->text('Bonjour, nous sommes des bénévoles d\'OpenStreetMap France et nous vous proposons de modifier les informations de votre commerce. Voici votre lien unique de modification: ' . $this->generateUrl('app_public_edit', [
|
||||||
'zipcode' => $zipCode,
|
'zipcode' => $zipCode,
|
||||||
'name' => $place_name,
|
'name' => $place_name,
|
||||||
|
|
|
@ -121,8 +121,38 @@ class Place
|
||||||
return round($filled_fields / $total_fields * 100);
|
return round($filled_fields / $total_fields * 100);
|
||||||
}
|
}
|
||||||
public function update_place_from_overpass_data(array $overpass_data) {
|
public function update_place_from_overpass_data(array $overpass_data) {
|
||||||
$overpass_data = $overpass_data['tags_converted'] ;
|
$tags_converted = $overpass_data['tags_converted'] ;
|
||||||
|
|
||||||
|
if (isset($tags_converted['amenity']) && $tags_converted['amenity'] != '') {
|
||||||
|
$this->setMainTag('amenity='.$tags_converted['amenity']);
|
||||||
|
}
|
||||||
|
if (isset($tags_converted['shop']) && $tags_converted['shop'] != '') {
|
||||||
|
$this->setMainTag('shop='.$tags_converted['shop']);
|
||||||
|
}
|
||||||
|
if (isset($tags_converted['tourism']) && $tags_converted['tourism'] != '') {
|
||||||
|
$this->setMainTag('tourism='.$tags_converted['tourism']);
|
||||||
|
}
|
||||||
|
if (isset($tags_converted['office']) && $tags_converted['office'] != '') {
|
||||||
|
$this->setMainTag('office='.$tags_converted['office']);
|
||||||
|
}
|
||||||
|
if (isset($tags_converted['healthcare']) && $tags_converted['healthcare'] != '') {
|
||||||
|
$this->setMainTag('healthcare='.$tags_converted['healthcare']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->setOsmId($overpass_data['id'])
|
||||||
|
->setOsmKind($overpass_data['type'])
|
||||||
|
->setName($overpass_data['name'])
|
||||||
|
->setZipCode($overpass_data['postcode'])
|
||||||
|
->setEmail($overpass_data['email'])
|
||||||
|
->setNote($overpass_data['tags'] && isset($overpass_data['tags']['note']) ? isset($overpass_data['tags']['note']) : null)
|
||||||
|
->setHasOpeningHours($overpass_data['tags'] && isset($overpass_data['tags']['opening_hours']) ? isset($overpass_data['tags']['opening_hours']) : null)
|
||||||
|
->setHasAddress(($overpass_data['tags'] && isset($overpass_data['tags']['address']) || $overpass_data['tags'] && isset($overpass_data['tags']['contact:address'])) ? isset($overpass_data['tags']['address']) : null)
|
||||||
|
->setHasWebsite($overpass_data['tags'] && isset($overpass_data['tags']['website']) ? $overpass_data['tags']['website'] : null)
|
||||||
|
->setHasWheelchair($overpass_data['tags'] && isset($overpass_data['tags']['wheelchair']) ? $overpass_data['tags']['wheelchair'] : null)
|
||||||
|
->setHasNote($overpass_data['tags'] && isset($overpass_data['tags']['note']) ? $overpass_data['tags']['note'] : null)
|
||||||
|
->setNoteContent($overpass_data['tags'] && isset($overpass_data['tags']['note']) ? $overpass_data['tags']['note'] : null)
|
||||||
|
// ->setDisplayedDate(new \DateTime())
|
||||||
|
;
|
||||||
// Remplir les clés attendues avec des valeurs par défaut si non définies
|
// Remplir les clés attendues avec des valeurs par défaut si non définies
|
||||||
$overpass_data = array_merge([
|
$overpass_data = array_merge([
|
||||||
'id' => '',
|
'id' => '',
|
||||||
|
|
|
@ -10,6 +10,14 @@ class Motocultrice
|
||||||
private $overpassApiUrl = 'https://overpass-api.de/api/interpreter';
|
private $overpassApiUrl = 'https://overpass-api.de/api/interpreter';
|
||||||
private $osmApiUrl = 'https://www.openstreetmap.org/api/0.6';
|
private $osmApiUrl = 'https://www.openstreetmap.org/api/0.6';
|
||||||
|
|
||||||
|
public $overpass_base_places = '
|
||||||
|
(
|
||||||
|
nw["amenity"~"^(cafe|bar|restaurant|library|cinema|fast_food|post_office|marketplace|community_centre|theatre|bank|townhall)$"](area.searchArea);
|
||||||
|
nw["shop"](area.searchArea);
|
||||||
|
nw["healthcare"](area.searchArea);
|
||||||
|
nw["office"](area.searchArea);
|
||||||
|
);
|
||||||
|
';
|
||||||
// ne pas lister les tags qui utilisent des morceaux particuliers de formulaire pour éviter que les gens aient besoin de connaître le tag OSM
|
// ne pas lister les tags qui utilisent des morceaux particuliers de formulaire pour éviter que les gens aient besoin de connaître le tag OSM
|
||||||
public $excluded_tags_to_render = [
|
public $excluded_tags_to_render = [
|
||||||
'name',
|
'name',
|
||||||
|
@ -82,34 +90,17 @@ class Motocultrice
|
||||||
public function get_export_query($zone) {
|
public function get_export_query($zone) {
|
||||||
return <<<QUERY
|
return <<<QUERY
|
||||||
[out:csv(::id,::type,::lat,::lon,name,amenity,shop,office,healthcare,"contact:email",email,"contact:phone",phone,"contact:website",website,image,url,wikidata, opening_hours,"contact:housenumber","addr:housenumber","contact:street","addr:street",note,fixme,harassment_prevention,cuisine,brand,tourism,source,zip_code,"ref:FR:SIRET")];
|
[out:csv(::id,::type,::lat,::lon,name,amenity,shop,office,healthcare,"contact:email",email,"contact:phone",phone,"contact:website",website,image,url,wikidata, opening_hours,"contact:housenumber","addr:housenumber","contact:street","addr:street",note,fixme,harassment_prevention,cuisine,brand,tourism,source,zip_code,"ref:FR:SIRET")];
|
||||||
area["ISO3166-1"="FR"]->.france;
|
{{geocodeArea:"{$zone}, France"}}->.searchArea;
|
||||||
area["postal_code"="{$zone}"](area.france)->.searchArea;
|
{$this->overpass_base_places}
|
||||||
(
|
out skel qt;
|
||||||
nw["amenity"~"^(cafe|bar|restaurant|library|cinema|fast_food|post_office|marketplace|community_centre|theatre|bank|townhall)$"](area.searchArea);
|
|
||||||
nw["shop"](area.searchArea);
|
|
||||||
nw["healthcare"](area.searchArea);
|
|
||||||
nw["office"](area.searchArea);
|
|
||||||
);
|
|
||||||
out body;
|
|
||||||
QUERY;
|
QUERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_query_places($zone) {
|
public function get_query_places($zone) {
|
||||||
return <<<QUERY
|
return '[out:json][timeout:25];
|
||||||
[out:json][timeout:25];
|
area["postal_code"="'.$zone.'"]->.searchArea;
|
||||||
area["ISO3166-1"="FR"]->.france;
|
'.$this->overpass_base_places.'
|
||||||
area["postal_code"="{$zone}"](area.france)->.searchArea;
|
out center tags;';
|
||||||
(
|
|
||||||
|
|
||||||
nw["amenity"~"^(cafe|bar|restaurant|library|cinema|fast_food|post_office|marketplace|community_centre|theatre|bank|townhall)$"](area.searchArea);
|
|
||||||
nw["shop"](area.searchArea);
|
|
||||||
nw["healthcare"](area.searchArea);
|
|
||||||
nw["office"](area.searchArea);
|
|
||||||
);
|
|
||||||
out body;
|
|
||||||
>;
|
|
||||||
out skel qt;
|
|
||||||
QUERY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private $more_tags = ['image', 'ref:FR:SIRET'];
|
private $more_tags = ['image', 'ref:FR:SIRET'];
|
||||||
|
@ -167,14 +158,9 @@ QUERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nettoyer et échapper la zone pour la requête
|
// Nettoyer et échapper la zone pour la requête
|
||||||
$zone = addslashes(trim($zone));
|
$zone = addslashes(trim($zone));
|
||||||
// //area["postal_code"="{$zone}"]->.searchArea;
|
|
||||||
$query = $this->get_query_places($zone);
|
$query = $this->get_query_places($zone);
|
||||||
|
|
||||||
if($use_places_without_email_to_reference) {
|
|
||||||
$query = $this->get_query_places($zone);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$response = $this->client->request('POST', $this->overpassApiUrl, [
|
$response = $this->client->request('POST', $this->overpassApiUrl, [
|
||||||
'body' => ['data' => $query]
|
'body' => ['data' => $query]
|
||||||
|
@ -212,7 +198,7 @@ QUERY;
|
||||||
|
|
||||||
return $places;
|
return $places;
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
var_dump($essai_query);
|
var_dump($query);
|
||||||
var_dump($e->getMessage());
|
var_dump($e->getMessage());
|
||||||
die();
|
die();
|
||||||
throw new \Exception("Erreur lors de la requête Overpass : " . $e->getMessage());
|
throw new \Exception("Erreur lors de la requête Overpass : " . $e->getMessage());
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
commerces existants disposant d'un moyen de contact mail: {{ commerces|length }}
|
commerces existants déjà en base: {{ commerces|length }}
|
||||||
</p>
|
</p>
|
||||||
{# {{ dump(commerces[0]) }} #}
|
{# {{ dump(commerces[0]) }} #}
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,7 @@ out skel qt;`;
|
||||||
});
|
});
|
||||||
|
|
||||||
map.on('load', () => {
|
map.on('load', () => {
|
||||||
|
console.log('map load...');
|
||||||
// Ajouter le contour administratif
|
// Ajouter le contour administratif
|
||||||
if (boundaryData.elements && boundaryData.elements.length > 0) {
|
if (boundaryData.elements && boundaryData.elements.length > 0) {
|
||||||
const boundary = boundaryData.elements[0];
|
const boundary = boundaryData.elements[0];
|
||||||
|
@ -137,13 +138,11 @@ out skel qt;`;
|
||||||
|
|
||||||
console.log('map chargé',data.elements);
|
console.log('map chargé',data.elements);
|
||||||
data.elements.forEach(element => {
|
data.elements.forEach(element => {
|
||||||
if(element.tags){
|
// Cherche les coordonnées à la racine ou dans center
|
||||||
|
const lat = element.lat || (element.center && element.center.lat);
|
||||||
|
const lon = element.lon || (element.center && element.center.lon);
|
||||||
|
|
||||||
console.log('element', element.tags['name'] , element);
|
if (lat && lon && element.tags && element.tags['name']) {
|
||||||
}
|
|
||||||
|
|
||||||
if (element.lat && element.lon && element.tags && element.tags['name']) {
|
|
||||||
|
|
||||||
const el = document.createElement('div');
|
const el = document.createElement('div');
|
||||||
el.className = 'marker';
|
el.className = 'marker';
|
||||||
let tagstable = '<table class="table table-bordered"><tr><th>Clé</th><th>Valeur</th></tr>';
|
let tagstable = '<table class="table table-bordered"><tr><th>Clé</th><th>Valeur</th></tr>';
|
||||||
|
@ -162,7 +161,7 @@ out skel qt;`;
|
||||||
|
|
||||||
|
|
||||||
new maplibregl.Marker(el)
|
new maplibregl.Marker(el)
|
||||||
.setLngLat([element.lon, element.lat])
|
.setLngLat([lon, lat])
|
||||||
.setPopup(new maplibregl.Popup({
|
.setPopup(new maplibregl.Popup({
|
||||||
offset: 25,
|
offset: 25,
|
||||||
anchor: 'bottom'
|
anchor: 'bottom'
|
||||||
|
@ -193,6 +192,7 @@ out skel qt;`;
|
||||||
}
|
}
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
console.log('DOMContentLoaded');
|
||||||
const headers = document.querySelectorAll('th');
|
const headers = document.querySelectorAll('th');
|
||||||
headers.forEach(header => {
|
headers.forEach(header => {
|
||||||
const text = header.textContent;
|
const text = header.textContent;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue