Liste des voies dans OpenStreetMap.
Le site overpass turbo permet de faire des requêtes sur la base OpenStreetMap.
La sélection géographique se fait avec l'instruction : .
La sélection des voies se fait sur l'élément highway.
Ce qui donne avec l'ensemble des instructions pour l'affichage (incluant l'export en JSON plutôt qu'en XML) :
[out:json];
->.searchArea;
 way["highway"](area.searchArea);
(._;>;);
out body;
On obtient ainsi la carte suivante : voies sur OpenStreetMap.
Extraction des voies depuis le fichier JSON.
En cliquant sur l'onglet Données, le fichier JSON peut être copié et collé dans un fichier, par exemple "Belleville.json".
Il suffit alors d'extraire les champs "name", par exemple sous Linux avec :
cat Belleville.json |egrep -o '"name": "(.*?)"' |sed 's/"name": //' |sort |uniq >Belleville.txt
En supprimant le double de la "Voie Verte du Beaujolais", on obtient une liste de 302 voies :
Note : Il est possible d'obtenir la même liste avec un export CSV : [out:csv(name)]; en filtrant les lignes vides et les doublons.
Liste des voies dans le fichier FANTOIR.
Le fichier FANTOIR, maintenu par la Direction générale des finances publiques, liste les voies et lieux-dits des toutes les communes de France.
Pour retrouver le code d'une commune dans le fichier FANTOIR, il faut chercher son code INSEE, par exemple sur le site OpenDataSoft :
Il faut ensuite prendre les deux chiffres du département, rajouter le code direction qui vaut 0 en général (voir les exceptions dans la documentation, pour les départements d'outre-mer, Paris, les Bouches-du-Rhône, le Nord et les Hauts-de-Seine), puis terminer avec les trois derniers chiffres du code INSEE.
Le code FANTOIR pour :
Extraction des voies.
Pour extraire les voies directement dans un fichier CSV, il est possible d'utiliser le script suivant écrit en Python version 3 :
extrait ci-dessous
fichierFANTOIR = 'FANTOIR0119'
codeCommune = '690019'
voies = {
 'ACH': 'ancien chemin',
 'AER': 'aérodrome',
 'AERG': 'aérogare',
 'AGL': 'agglomeration',
 'AIRE': 'aire',
 'VTE': 'vieille route',
 'ZA': 'ZA',
 'ZAC': 'ZAC',
 'ZAD': 'ZAD',
 'ZI': 'ZI',
 'ZONE': 'zone',
 'ZUP': 'ZUP',
with open(fichierFANTOIR, 'r') as f:
 for line in f:
 text = line.rstrip()
 if not text.startswith(codeCommune):
 continue
 fantoir = text[0:11]
 voie = text[11:15].rstrip()
 nom = text[15:41].rstrip()
 annulation = text[73].rstrip()
 typevoie = "
 if len(text) > 107:
 typevoie = text[108].rstrip()
 caractere = "
 if len(text) > 108:
 caractere = text[109].rstrip()
 if voie == 'LYON' or voie == 'N':
 continue
 if voie != ":
 if not voie in voies:
 print 'Type de voie inconnu: ' + voie
 else:
 voie = voies[voie]
 if nom != 'NON DESIGNEE':
 print(fantoir + ';' + voie + ';' + nom + ';' + annulation + ';' + typevoie + ';' + caractere)
Filtrage du fichier CSV.
Le fichier CSV obtenu contient les lieux-dits et quelques bâtiments qui ne nous intéressent pas. Ils s'appellent "lotissement" ou n'ont tout simplement pas de valeur dans la deuxième colonne.
Le code annulation contient Q quand la voie n'existe plus. Le type que l'on conserve est le 1 (il y a aussi "2" pour les ensembles immobiliers, "3" pour les lieux-dits, "4" pour les pseudo-voies et "5" pour les voies provisoires).
Après correction des erreurs, suppression des lieux sans description et des voies supprimées, il en reste 175 :
les 10 premières ci-dessous :
Comparaison des fichiers.
Après avoir compilé les différentes liste, il faut maintenant les comparer et garder ceux qui manquent dans l'une ou l'autre.
Par exemple, en comparant les fichiers OSM et FANTOIR, on apprend que le Commandant Bianchetti a pour prénom René (absent sur OSM), et on s'aperçoit que la voie Antoine Mortier est une avenue pour OSM et une rue pour FANTOIR. Le fichier FANTOIR propose une rue François Bourdis, en plus de François Bourdy, qui est probablement la même personne avec une orthographe différente.
Voies du fichier FANTOIR absentes du fichier OSM :
En cherchant sur d'autres cartes (Mappy, Google Maps, documents divers sur internet), on trouve ces voies qui n'existent pas (encore) sur OSM :
Script d'import dans Wikidata.
Une fois les données bien rangées dans un tableau, il est possible de les importer automatiquement avec un petit bot. Celui-ci est écrit en Python pour Pywikibot. Il suppose que élements Wikidata qui existent déjà ont été enlevés du fichier (sinon il plante).
import pywikibot
site = pywikibot.Site("wikidata", "wikidata")
repo = site.data_repository()
import csv, sys
localite = 'Q58183261' # Belleville-en-Beaujolais
def create_wd_item(site, label_dict):
 new_item = pywikibot.ItemPage(site)
 new_item.editLabels(labels=label_dict, summary=u"Création d'un nouvel élément")
 return new_item.getID()
natures = {
 'allée': 'Q207934',
 'avenue': 'Q7543083',
 'boulevard': 'Q54114',
 'chemin': 'Q5004679',
 'cours': 'Q16544740',
 'esplanade': 'Q88372',
 'impasse': 'Q12731',
 'jardin public': 'Q55177716',
 'montée': 'Q79007',
 'parc': 'Q22746',
 'passage': 'Q13634881',
 'passerelle': 'Q1068842',
 'place': 'Q174782',
 'promenade': 'Q787113',
 'quai': 'Q3840711',
 'rond-point': 'Q1529',
 'rue': 'Q79007',
 'ruelle': 'Q1251403',
 'square': 'Q2026833',
 'traboule': 'Q8379'
with open('Belleville-en-Beaujolais.csv') as csv_file:
 reader = csv.reader(csv_file, delimiter=';')
 line_count = 0
 for row in reader:
 if line_count == 0:
 pass
 else:
 fantoir = row[0]
 libelle = row[1]
 description = row[2]
 nature = row[3]
 pays = row[4]
 codepostal = row[5]
 coords = row[6]
 relationOSM = row[7]
 referenceA = row[8]
 print(f"\tVoie: {libelle}, nature {nature}, code postal {codepostal}, coords {coords}, OSM {relationOSM}, référence {referenceA}.")
 # test nature
 natureQ = "
 if nature in natures:
 natureQ = natures[nature]
 else:
 print("Voie inconnue: ", nature)
 sys.exit()
 latS, lonS = coords.split(',')
 latI = float(latS)
 lonI = float(lonS)
 print(f'Lat: {latI}, lon: {lonI}')
 # create WD
 new_item_id = create_wd_item(site, some_labels)
 print(new_item_id)
 item = pywikibot.ItemPage(repo, new_item_id)
 item.get()
 claim = pywikibot.Claim(repo, u'P31') # nature de l'élément
 target = pywikibot.ItemPage(repo, natureQ)
 claim.setTarget(target)
 item.addClaim(claim, summary=u'Nature')
 item.editDescriptions(desc, summary=u'Set description')
 claim = pywikibot.Claim(repo, u'P17') # pays
 target = pywikibot.ItemPage(repo, u'Q142') # France
 claim.setTarget(target)
 item.addClaim(claim, summary=u'Pays')
 claim = pywikibot.Claim(repo, u'P131') # localisation administrative
 target = pywikibot.ItemPage(repo, localite)
 claim.setTarget(target)
 item.addClaim(claim, summary=u'Localisation')
 claim = pywikibot.Claim(repo, u'P281') # code postal
 claim.setTarget(codepostal)
 item.addClaim(claim, summary=u'Code postal')
 coordinateclaim = pywikibot.Claim(repo, u'P625')
 coordinate = pywikibot.Coordinate(lat=latI, lon=lonI, precision=0.0001, site=site)
 coordinateclaim.setTarget(coordinate)
 item.addClaim(coordinateclaim, summary=u'Coordinates')
 if fantoir:
 claim = pywikibot.Claim(repo, u'P3182') # code FANTOIR
 claim.setTarget(fantoir)
 item.addClaim(claim, summary=u'Code FANTOIR')
 if relationOSM:
 claim = pywikibot.Claim(repo, u'P402') # relation OSM
 claim.setTarget(relationOSM)
 item.addClaim(claim, summary=u'relation OSM')
 if referenceA:
 claim = pywikibot.Claim(repo, u'P138') # nommé en référence à
 reference = pywikibot.ItemPage(repo, referenceA)
 claim.setTarget(reference)
 item.addClaim(claim, summary=u'nommé en référence à')
 line_count += 1
Affichage du résultat dans Wikidata.
Pour afficher l'ensemble des voies sur une carte, une requête SPARQL :
SELECT DISTINCT ?voie ?image ?coord ?loc ?locLabel ?layer ?voieLabel WHERE {
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q79007. } # rue
 UNION
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q174782. } # place
 UNION
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q16544740. } # cours
 UNION
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q3840711. } # quai
 UNION
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q13634881. } # passage
 UNION
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q2354973. } # tunnel routier
 UNION
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q22746. } # jardin public
 UNION
 { ?voie (wdt:P31/(wdt:P279*)) wd:Q3323198. } # montée
 MINUS
 { ?voie wdt:P582 ?dateDeFin. } # on exclut les voies qui ont une date de fin (n'existent plus)
 ?voie wdt:P131 wd:Q58183261. # localisation administrative = Belleville-en-Beaujolais
 OPTIONAL { ?voie wdt:P18 ?image. } # affichage de l'image si elle existe
 BIND(IF(?image = "", "yes", "no") AS ?layer)
 SERVICE wikibase:label { bd:serviceParam wikibase:language "fr". } 
Lien direct vers la carte.
Annexes.
Annexe 1 - Extraction des voies depuis le fichier JSON.
Voici la liste des 302 voies obtenues :
Annexe 2 - Script de filtrage du fichier FANTOIR.
fichierFANTOIR = 'FANTOIR0119'
codeCommune = '690019'
voies = {
 'ACH': 'ancien chemin',
 'AER': 'aérodrome',
 'AERG': 'aérogare',
 'AGL': 'agglomeration',
 'AIRE': 'aire',
 'ALL': 'allée',
 'ANGL': 'angle',
 'ARC': 'arcade',
 'ART': 'ancienne route',
 'AUT': 'autoroute',
 'AV': 'avenue',
 'BASE': 'base',
 'BD': 'boulevard',
 'BER': 'berge',
 'BORD': 'bord',
 'BRE': 'barrière',
 'BRG': 'bourg',
 'BRTL': 'bretelle',
 'BSN': 'bassin',
 'CAE': 'carriera',
 'CALL': 'calle/callada',
 'CAMI': 'camin',
 'CAMP': 'camp',
 'CAN': 'canal',
 'CAR': 'carrefour',
 'CARE': 'carrière',
 'CASR': 'caserne',
 'CC': 'chemin communal',
 'CD': 'chemin departemental',
 'CF': 'chemin forestier',
 'CHA': 'chasse',
 'CHE': 'chemin',
 'CHEM': 'cheminement',
 'CHL': 'chalet',
 'CHP': 'champ',
 'CHS': 'chaussée',
 'CHT': 'château',
 'CHV': 'chemin vicinal',
 'CITE': 'cité',
 'CIVE': 'coursive',
 'CLOS': 'clos',
 'CLR': 'couloir',
 'COIN': 'coin',
 'COL': 'col',
 'COR': 'corniche',
 'CORO': 'coron',
 'COTE': 'côte',
 'COUR': 'cour',
 'CPG': 'camping',
 'CR': 'chemin rural',
 'CRS': 'cours',
 'CRX': 'croix',
 'CTR': 'contour',
 'CTRE': 'centre',
 'DARS': 'darse/darce',
 'DEVI': 'déviation',
 'DIG': 'digue',
 'DOM': 'domaine',
 'DRA': 'draille',
 'DSC': 'descente',
 'ECA': 'écart',
 'ECL': 'écluse',
 'EMBR': 'embranchement',
 'EMP': 'emplacement',
 'ENC': 'enclos',
 'ENV': 'enclave',
 'ESC': 'escalier',
 'ESP': 'esplanade',
 'ESPA': 'espace',
 'ETNG': 'étang',
 'FD': 'fond',
 'FG': 'faubourg',
 'FON': 'fontaine',
 'FOR': 'forêt',
 'FORT': 'fort',
 'FOS': 'fosse',
 'FRM': 'ferme',
 'GAL': 'galerie',
 'GARE': 'gare',
 'GBD': 'grand boulevard',
 'GPL': 'grande place',
 'GR': 'grande rue',
 'GREV': 'grêve',
 'HAB': 'habitation',
 'HAM': 'hameau',
 'HIP': 'hippodrome',
 'HLE': 'halle',
 'HLG': 'halage',
 'HLM': 'HLM',
 'HTR': 'hauteur',
 'ILE': 'île',
 'ILOT': 'îlot',
 'IMP': 'impasse',
 'JARD': 'jardin',
 'JTE': 'jetée',
 'LAC': 'lac',
 'LEVE': 'levée',
 'LICE': 'lices',
 'LIGN': 'ligne',
 'LOT': 'lotissement',
 'MAIL': 'mail',
 'MAIS': 'maison',
 'MAR': 'marché',
 'MARE': 'mare',
 'MAS': 'mas',
 'MNE': 'morne',
 'MRN': 'marina',
 'MTE': 'montée',
 'NTE': 'nouvelle route',
 'PAE': 'petite avenue',
 'PARC': 'parc',
 'PAS': 'passage',
 'PASS': 'passe',
 'PCH': 'petit chemin',
 'PCHE': 'porche',
 'PHAR': 'phare',
 'PIST': 'piste',
 'PKG': 'parking',
 'PL': 'place',
 'PLA': 'placa',
 'PLAG': 'plage',
 'PLAN': 'plan',
 'PLCI': 'placis',
 'PLE': 'passerelle',
 'PLN': 'plaine',
 'PLT': 'plateau',
 'PNT': 'pointe',
 'PONT': 'pont',
 'PORQ': 'portique',
 'PORT': 'port',
 'POST': 'poste',
 'POT': 'poterne',
 'PROM': 'promenade',
 'PRT': 'petite route',
 'PRV': 'parvis',
 'PTA': 'petite alleé',
 'PTE': 'porte',
 'PTR': 'petite rue',
 'PTTE': 'placette',
 'QUA': 'quartier',
 'QUAI': 'quai',
 'RAC': 'raccourci',
 'REM': 'rempart',
 'RES': 'résidence',
 'RIVE': 'rive',
 'RLE': 'ruelle',
 'ROC': 'rocade',
 'RPE': 'rampe',
 'RPT': 'rond-point',
 'RTD': 'rotonde',
 'RTE': 'route',
 'RUE': 'rue',
 'RUET': 'ruette',
 'RUIS': 'ruisseau',
 'RULT': 'ruellette',
 'RVE': 'ravine',
 'SAS': 'sas',
 'SEN': 'sentier;sente',
 'SQ': 'square',
 'STDE': 'stade',
 'TER': 'terre',
 'TOUR': 'tour',
 'TPL': 'terre-plein',
 'TRA': 'traverse',
 'TRAB': 'traboule',
 'TRN': 'terrain',
 'TRT': 'tertre',
 'TSSE': 'terrasse',
 'TUN': 'tunnel',
 'VAL': 'val',
 'VALL': 'vallon/vallée',
 'VC': 'voie communale',
 'VCHE': 'vieux chemin',
 'VEN': 'venelle',
 'VGE': 'village',
 'VIA': 'via',
 'VIAD': 'viaduc',
 'VIL': 'ville',
 'VLA': 'villa',
 'VOIE': 'voie',
 'VOIR': 'voirie',
 'VOUT': 'voute',
 'VOY': 'voyeul',
 'VTE': 'vieille route',
 'ZA': 'ZA',
 'ZAC': 'ZAC',
 'ZAD': 'ZAD',
 'ZI': 'ZI',
 'ZONE': 'zone',
 'ZUP': 'ZUP',
with open(fichierFANTOIR, 'r') as f:
 for line in f:
 text = line.rstrip()
 if not text.startswith(codeCommune):
 continue
 fantoir = text[0:11]
 voie = text[11:15].rstrip()
 nom = text[15:41].rstrip()
 annulation = text[73].rstrip()
 typevoie = "
 if len(text) > 107:
 typevoie = text[108].rstrip()
 caractere = "
 if len(text) > 108:
 caractere = text[109].rstrip()
 if voie == 'LYON' or voie == 'N':
 continue
 if voie != ":
 if not voie in voies:
 print 'Type de voie inconnu: ' + voie
 else:
 voie = voies[voie]
 if nom != 'NON DESIGNEE':
 print(fantoir + ';' + voie + ';' + nom + ';' + annulation + ';' + typevoie + ';' + caractere)