Bonjour,
Dans le cadre d'un projet professionnel, je travaille actuellement sur un script python me permettant de solliciter l'api IGNFrance afin de géolocaliser un important volume d'adresses.
L'objectif étant de pouvoir intégrer ce process de géolocalisation dans un traitement automatisé et récurent de notre fichiers d'entreprises.
Mes premiers essais, m'ont permis de constater que mon programme est fortement impacté par le timeout du serveur de l'IGN qui est par défaut d'1 seconde.
Dans le but de me soustraire de ce temps d'attente excessivement long du fait d'un grand volume d'adresses à géolocaliser, j'ai donc diminué le timeout à 0.4 second. Cette modification a révélé que la géolocalisation était plus rapide. Cependant, les adresses non géolocalisées étaient plus nombreuses à cause d'une plus grande sollicitation du serveur.
Au niveau des résultats, une requête de géolocalisation d'un fichier de 21 000 adresses a retourné un fichier résultat au bout de 3h12 de traitement !
En sortie, j'ai pu récupérer 19 000 adresses géolocalisées, 2 000 n'ont donc pas été traitées par le serveur (avec le message "service timeout").
Le serveur IGNFrance semble donc avoir "sauté" certains enregistrements pour ne pas saturer.
Connaissez-vous un moyen, un paramètre (...) qui me permettrait de réduire drastiquement le temps imparti au traitement de mes données ?
le code que j'utilise s'organise de la manière suivante :
#!/usr/bin/env python
# coding: utf8
import csv
import time
import progressbar
bar = progressbar.ProgressBar(widgets=[ #(Début) paramétres de la barre de progerssion
' [', progressbar.Timer(), '] ', #temps écoulé entre le début et la fin du programme
progressbar.Bar(),
' (', progressbar.ETA(), ') ',])
for i in bar(range(20)):
time.sleep(0.1) # (Fin)
from geopy.geocoders import IGNFrance
geocoder = IGNFrance(api_key='xxxxxxxxxxxxxxxxx', username='xxxxx', password='xxxxxx', timeout=0.4)
inputFile = open('xxxxxxxxxxxx')10.txt', 'rb') #chemin de votre fichier à géocoder
outputFile = open('xxxxxxxxxxxxxxx', 'w') #chemin de votre fichier de résultats
try:
outputData = csv.writer(outputFile, delimiter=';', lineterminator='\n') #spécifier le délimiteur de votre fichier de sortie
outputData.writerow(('siret','adresse','lat', 'lng', 'departement', 'qualite', 'pecision')) #spécifier le nom de vos colonnes pour le fichier de résultats
inputData = csv.reader(inputFile, delimiter=';') #spécifier le délimiteur de votre fichier à géocoder
for ligne in inputData:
siret = ligne[xxx]
adresse = ligne[xxx]
try:
location = geocoder.geocode(adresse,exactly_one=True)
outputData.writerow((siret,adresse, location.latitude, location.longitude, location.raw ['xxxxxxx'],location.raw ['xxxx'], location.raw ['xxxxxxx']))
except Exception as inst:
print(inst)
finally:
inputFile.close()
outputFile.close()
Partager