[OSM-talk-fr] Requête overpass api & python
Tony Emery
tony.emery at yahoo.fr
Ven 24 Juin 08:04:31 UTC 2016
Jérôme Amagat wrote
> a la place mieux vaux :
> (._; >;);
> out meta;
> cela te donne les même éléments.
> et normalement c'est trier, ça veux pas dire que c'est trier comme tu le
> souhaites.
Effectivement, j'ai remplacé par ce bout de script et cela fonctionne bien
mieux.
Pour les curieux, voici une partie de mon script. Si vous avez des
remarques, je suis ouvert à toute suggestion.
# Import des modules time
import time
import datetime
# Définition des dates et heures de début de processus
DateDuProcess = time.strftime('%d%m%Y',time.localtime())
HeureDuProcess = time.strftime('%H:%M:%S',time.localtime())
heure,minute=0,0
tempsdep = time.clock()
tempsInstr = time.clock()
# Définition du chemin du fichier des logs
logfilePath = r"\\Vdom2\sig\_ARCGIS\log_" + DateDuProcess + ".txt"
# Fonction d'insertion des messages dans le fichier des logs
def insertMessageLogFile(inPathLogFile, message):
logFile = open(inPathLogFile, "a")
logFile.write("\n"+message)
logFile.close()
print(message)
# Fonction de calcule des heures, minutes, secondes
def decoupe(tempsEcoule):
heure = int(tempsEcoule) /3600
tempsEcoule %= 3600
minute = int(tempsEcoule)/60
tempsEcoule%=60
tempsEcoule = (heure+"H "+minute+"m "+tempsEcoule+"s")
insertMessageLogFile(logfilePath, '*'*20)
msgLog = ('1.0 Lancement du script de chargement du fichier osm dans la GDB
le {0} à {1}').format(DateDuProcess,HeureDuProcess)
insertMessageLogFile(logfilePath, msgLog)
# Import des modules
msgLog = ('1.1 Import des modules')
insertMessageLogFile(logfilePath, msgLog)
import arcpy
import os, sys
import urllib2, urllib, re
arcpy.ImportToolbox("C:/Program Files
(x86)/ArcGIS/Desktop10.3/ArcToolbox/Toolboxes/OpenStreetMap Toolbox.tbx",
"osmtools")
tempsEcoule = str(round((time.clock() - tempsInstr),3))
msgLog = ('1.1 Modules importés : {0}s').format(tempsEcoule)
insertMessageLogFile(logfilePath, msgLog)
tempsInstr = time.clock()
# Création des variables
msgLog = ('1.2 Création des variables')
insertMessageLogFile(logfilePath, msgLog)
inFolder = r"\\Vdom2\sig\_PROJETS\_CCPRO_OSM\OSMFiles\Automatique"
inGDB = r"\\Vdom2\sig\_GDB\OSM_CCPRO.gdb"
inFieldLong = "lastmodif"
inFieldDate = "osmtimestamp"
urlxapi = 'http://overpass-api.de/api/interpreter?'
bbox = "(43.98,4.70,44.27,4.99)"
timeout = 65
tempsEcoule = str(round((time.clock() - tempsInstr),6))
msgLog = ('1.2 Variables créées : {0}s').format(tempsEcoule)
insertMessageLogFile(logfilePath, msgLog)
tempsInstr = time.clock()
# Compte du nombre de fichiers planet à importer
arcpy.env.workspace = inFolder
fileCount = 0
fileDone = 1
for osm in arcpy.ListFiles("*.osm"):
fileCount += 1
msgLog = ('1.3 Nombre de fichiers planet à importer :
{0}').format(fileCount)
insertMessageLogFile(logfilePath, msgLog)
# Etape 1 - import des données
msgLog = ('2.1 Les données vont être importées depuis {0} vers
{1}').format(inFolder,inGDB)
insertMessageLogFile(logfilePath, msgLog)
# Boucle sur tous les fichiers osm du dossier
\\Vdom2\sig\_PROJETS\_CCPRO_OSM\OSMFiles\Automatique
for osm in arcpy.ListFiles("*.osm"):
try:
msgLog = ('2.1.1 Fichier planet traité {0}, {1}/{2}').format(osm,
fileDone, fileCount)
insertMessageLogFile(logfilePath, msgLog)
taille = round(os.path.getsize(inFolder + os.sep + osm) / 1024)
tempsBoucle = time.clock()
msgLog = ('2.1.2 Définition du Prédicat de {0}, {1} kO').format(osm,
taille)
insertMessageLogFile(logfilePath, msgLog)
# requête particulière : parking
if osm == 'parking.osm':
requete = '["amenity"="parking"]'
# requête particulière : buildingpart
elif osm == 'buildingpart.osm':
requete = '["building:part"]'
# requête particulière : housenumber
elif osm == 'housenumber.osm':
requete = '["addr:housenumber"]'
# requête particulière : associatedStreet
elif osm == 'associatedStreet.osm':
requete = '["type"="associatedStreet"]'
# requête particulière : PublicTransport
elif osm == 'public_transport.osm':
requete = '["route"="bus"]'
else:
requete = ('["' + osm[:-4] + '"]')
msgLog = ('2.1.3 Création de l\'URL de la requête :
{0}').format(requete)
insertMessageLogFile(logfilePath, msgLog)
# exécution de la requête XAPI
query
='[out:xml][timeout:{0}];(node{1}{2};way{1}{2};relation{1}{2};);(._;>;);out
meta;'.format(timeout,requete, bbox)
query = query.encode('utf8')
query_string = urllib.urlencode({'data': query})
msgLog = ('2.1.4 Lancement de la requête : {0}').format(requete)
insertMessageLogFile(logfilePath, msgLog)
try:
data = urllib2.urlopen(url=urlxapi, data=query_string).read()
except urllib2.HTTPError as e:
if e.code == 400:
print 'Bad request overpass'
# exit()
continue
# overpass timeout
if re.search('Query timed out in', data):
print 'Timeout overpass'
# exit()
continue
msgLog = ('2.1.5 Création du fichier osm : {0}').format(requete)
insertMessageLogFile(logfilePath, msgLog)
# print data
open(inFolder + os.sep + osm,'w').write(data)
tempsEcoule = str(round((time.clock() - tempsInstr),3))
msgLog = ('2.1.4 import {0} effectué en
{1}s').format(osm[:-4],tempsEcoule)
insertMessageLogFile(logfilePath, msgLog)
tempsInstr = time.clock()
tempsEcoule = str(round((time.clock() - tempsBoucle),3))
# time.strftime('%Hh %Mm %Ss', time.gmtime(tempsEcoule))
msgLog = (' 3.0 Données {0} Importées et intégrées :
{1}s').format(osm[:-4],tempsEcoule)
insertMessageLogFile(logfilePath, msgLog)
tempsInstr = time.clock()
fileDone += 1
except Exception, exception_retournee:
msgLog = (' 99 Erreur rencontrée : {0}').format(exception_retournee)
insertMessageLogFile(logfilePath, msgLog)
continue
tempsEcoule =str(round((time.clock() - tempsdep),3))
DateDuProcess = time.strftime('%d%m%Y',time.localtime())
HeureDuProcess = time.strftime('%H:%M:%S',time.localtime())
# time.strftime('%Hh %Mm %Ss', time.gmtime(tempsEcoule))
msgLog = ('99. script achevé le {0} à {1} en
{2}s').format(DateDuProcess,HeureDuProcess,tempsEcoule)
insertMessageLogFile(logfilePath, msgLog)
-----
Tony EMERY
Administrateur OpenStreetMap.fr
Mandataire Grand Sud-Est
Géomaticien & chef de projets
--
View this message in context: http://gis.19327.n5.nabble.com/Requete-overpass-api-python-tp5863030p5876368.html
Sent from the France mailing list archive at Nabble.com.
Plus d'informations sur la liste de diffusion Talk-fr