Skip to content

Commit

Permalink
Merge branch 'minor-fixes'
Browse files Browse the repository at this point in the history
  • Loading branch information
nlehuby committed Oct 6, 2024
2 parents 53bc3d8 + 7ad68b1 commit 80bbb00
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 25 deletions.
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ Retraitement des données open data des points de recharge pour véhicules élec

Le fichier open data utilisé est le fichier consolidé des bornes de rechage pour véhicules électriques, publié sur [datagouv](https://www.data.gouv.fr/fr/datasets/fichier-consolide-des-bornes-de-recharge-pour-vehicules-electriques). Il s'agit d'un jeu de données qui regroupe l'ensemble des données produites par les différents acteurs territoriaux.

Contrairement à ce que son nom laisse entendre, le jeu de données open data contient des points de recharge, ainsi que des informations sur les stations. Ce sont les bornes qui nous intéressent pour OpenStreetMap. À défaut, la consolidation suivante regroupe les informations par station (en recalculant notamment les informations des types de prise par station à partir des points de recharge).
Contrairement à ce que son nom laisse entendre, le jeu de données open data ne contient pas d'informations sur les bornes : il contient des points de recharge, ainsi que des informations sur les stations.

![définition des termes borne/station/point de charge](https://afirev.fr/wp-content/uploads/2019/08/Archi-station-borne-point-Fr-1024x610.jpg)
*illustration issue de la [doc de l'AFIREV](https://afirev.fr/fr/definition-des-termes-de-la-mobilite-electrique/)*

Ce sont les bornes qui nous intéressent pour OpenStreetMap. À défaut, la consolidation suivante regroupe les informations open data par station (en recalculant notamment les informations des types de prise par station à partir des points de recharge).

En complément du regroupement par station, le retraitement suivant effectue divers modifications ou vérifications :

* vérification sommaire de la validité des coordonnées géographiques
* vérification sommaire de la validité de l'identifiant d'itinérance (`id_station_itinerance`) qui est ajouté dans OSM dans la clef `ref:EU:EVSE`
* vérification sommaire de la validité du numéro de téléphone
Expand All @@ -16,10 +22,13 @@ En complément du regroupement par station, le retraitement suivant effectue div
* etc

Voici les fichiers de sortie du retraitement :

* la liste des stations https://raw.githubusercontent.com/Jungle-Bus/ref-EU-EVSE/gh-pages/opendata_stations.csv
* la liste des couples opérateur / réseau (à des fins de corrections typo, ajout de tag wikidata, etc) : https://github.com/Jungle-Bus/ref-EU-EVSE/raw/gh-pages/opendata_networks.csv
* la liste des couples opérateur / réseau (à des fins de corrections de typo, ajout de tag wikidata, etc) : https://github.com/Jungle-Bus/ref-EU-EVSE/raw/gh-pages/opendata_networks.csv
* la liste des erreurs rencontrées durant le traitement (coordonnées invalides, nombre de points de charge d'une station non cohérente, doublons, etc) : https://raw.githubusercontent.com/Jungle-Bus/ref-EU-EVSE/gh-pages/opendata_errors.csv

Les données open data semblent être mises à jour une fois par mois. Le présent traitement est également effectué une fois par mois (voir [l'historique des traitements](https://github.com/Jungle-Bus/ref-EU-EVSE/actions?query=branch%3Agh-pages))
Les données open data semblent être mises à jour tous les jours. Le présent traitement est effectué une fois par mois (voir [l'historique des traitements](https://github.com/Jungle-Bus/ref-EU-EVSE/actions?query=branch%3Agh-pages))

Les données consolidées ici sont utilisées par [l'analyse Osmose 8410](https://osmose.openstreetmap.fr/en/issues/open?item=8410).

Les données consolidées ici sont utilisées par [l'analyse Osmose 8410](https://osmose.openstreetmap.fr/en/issues/open?item=8410). <br>La correspondance entre les attributs est documentée sur le [wiki](https://wiki.openstreetmap.org/wiki/France/data.gouv.fr/Bornes_de_Recharge_pour_V%C3%A9hicules_%C3%89lectriques) et accessible dans le [code source d'Osmose](https://github.com/osm-fr/osmose-backend/blob/master/analysers/analyser_merge_charging_station_FR.py).
La correspondance entre les attributs est documentée sur le [wiki](https://wiki.openstreetmap.org/wiki/France/data.gouv.fr/Bornes_de_Recharge_pour_V%C3%A9hicules_%C3%89lectriques) et accessible dans le [code source d'Osmose](https://github.com/osm-fr/osmose-backend/blob/master/analysers/analyser_merge_charging_station_FR.py).
36 changes: 15 additions & 21 deletions group_opendata_by_station.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,35 +89,29 @@ def transformRef(refIti, refLoc):
# Station non concernée par l'identifiant ref:EU:EVSE (id_station_itinerance). Ce point de charge est ignoré et sa station ne sera pas présente dans l'analyse Osmose
continue

coordsXY = row['coordonneesXY'][1:-1].split(',')
cleanRef = transformRef(row['id_station_itinerance'], row['id_station_local'])

if not validate_coord(coordsXY[0]):
errors.append({"station_id" : cleanRef,
"source": row['datagouv_organization_or_owner'],
"error": "coordonnées non valides. Ce point de charge est ignoré et sa station ne sera pas présente dans l'analyse Osmose",
"detail": row['coordonneesXY']
})
continue
if not validate_coord(coordsXY[1]):
errors.append({"station_id" : cleanRef,
"source": row['datagouv_organization_or_owner'],
"error": "coordonnées non valides. Ce point de charge est ignoré et sa station ne sera pas présente dans l'analyse Osmose",
"detail": row['coordonneesXY']
})
# Overkill given that this data should have passed through this code:
# https://github.com/datagouv/datagouvfr_data_pipelines/blob/75db0b1db3fd79407a1526b0950133114fefaa0f/schema/utils/geo.py#L33
if not validate_coord(row["consolidated_longitude"]) or not validate_coord(row["consolidated_latitude"]):
errors.append({"station_id" : cleanRef or row['id_station_itinerance'],
"source": row['datagouv_organization_or_owner'],
"error": "coordonnées non valides. Ce point de charge est ignoré et sa station ne sera pas présente dans l'analyse Osmose",
"detail": "consolidated_longitude: {}, consolidated_latitude: {}".format(row['consolidated_longitude'], row["consolidated_latitude"])
})
continue

if not is_correct_id(cleanRef):
errors.append({"station_id" : cleanRef,
errors.append({"station_id" : cleanRef or row['id_station_itinerance'],
"source": row['datagouv_organization_or_owner'],
"error": "le format de l'identifiant ref:EU:EVSE (id_station_itinerance) n'est pas valide. Ce point de charge est ignoré et sa station ne sera pas présente dans l'analyse Osmose",
"detail": "iti: %s, local: %s" % (row['id_station_itinerance'], row['id_station_local'])})
continue

if not cleanRef in station_list:
station_prop = {key: row[key] if row[key] != "null" else "" for key in station_attributes}
station_prop['Xlongitude'] = float(coordsXY[0])
station_prop['Ylatitude'] = float(coordsXY[1])
station_prop['Xlongitude'] = float(row['consolidated_longitude'])
station_prop['Ylatitude'] = float(row['consolidated_latitude'])
phone = cleanPhoneNumber(row['telephone_operateur'])
station_list[cleanRef] = {'attributes' : station_prop, 'pdc_list': []}

Expand Down Expand Up @@ -175,7 +169,7 @@ def transformRef(refIti, refLoc):
else :
station['attributes']['horaires_grouped'] = list(horaires)[0]

gratuit = set([elem['gratuit'].strip() for elem in station['pdc_list']])
gratuit = set([elem['gratuit'].strip().lower() for elem in station['pdc_list']])
if len(gratuit) !=1 :
station['attributes']['gratuit_grouped'] = None
errors.append({"station_id" : station_id,
Expand All @@ -185,7 +179,7 @@ def transformRef(refIti, refLoc):
else :
station['attributes']['gratuit_grouped'] = list(gratuit)[0]

paiement_acte = set([elem['paiement_acte'].strip() for elem in station['pdc_list']])
paiement_acte = set([elem['paiement_acte'].strip().lower() for elem in station['pdc_list']])
if len(paiement_acte) !=1 :
station['attributes']['paiement_acte_grouped'] = None
errors.append({"station_id" : station_id,
Expand All @@ -195,7 +189,7 @@ def transformRef(refIti, refLoc):
else :
station['attributes']['paiement_acte_grouped'] = list(paiement_acte)[0]

paiement_cb = set([elem['paiement_cb'].strip() for elem in station['pdc_list']])
paiement_cb = set([elem['paiement_cb'].strip().lower() for elem in station['pdc_list']])
if len(paiement_cb) !=1 :
station['attributes']['paiement_cb_grouped'] = None
errors.append({"station_id" : station_id,
Expand All @@ -205,7 +199,7 @@ def transformRef(refIti, refLoc):
else :
station['attributes']['paiement_cb_grouped'] = list(paiement_cb)[0]

reservation = set([elem['reservation'].strip() for elem in station['pdc_list']])
reservation = set([elem['reservation'].strip().lower() for elem in station['pdc_list']])
if len(reservation) !=1 :
station['attributes']['reservation_grouped'] = None
errors.append({"station_id" : station_id,
Expand Down

0 comments on commit 80bbb00

Please sign in to comment.