A propos des requêtes overpass
publié le , mis à jourTicket en mode wiki pour décrire où et comment sont réalisées les requêtes overpass utilisées par cartes.app
Envoi des requêtes
La fonction resilientOverpassFetch(query) dans /app/overpassFetcher.ts gère l'envoir d'une requête à une instance overpass :
- une requête est envoyée à l'instance d'osm-fr
- si échec ou si pas de réponse dans les 8s, une nouvelle requête est envoyée sur l'instance overpass-api.de
Elle est utilisée dans les fichiers suivants :
- app/osmRequest.ts pour récupérer les infos d'1 élément OSM, éventuellement augmenté => FAIT
- app/effects/fetchOverpassRequest.ts
- app/itinerary/useFetchDrawBikeParkings.ts pour trouver les parking vélo
- components/osm/combinedOsmFeaturesRequest.ts
- components/placeSearch/detectCodePostal.ts
Récupération des tags et géométrie d'1 élément OSM
Dans le fichier app/osmRequest.ts sont présentes différentes fonctions qui permettent de récupérer les infos d'1 élément OSM, et de les augmenter.
La fonction osmElementRequest(type, id, ...) permet de récupérer les tags et la géométrie d'un élément OSM. Cette requête est très rapide (200 à 300 ms).
- si c'est un
nodeavec le tagaddr:housenumbermais pas le tagaddr:street, on utilisefetchAssociatedStreet(element)pour lancer une 2e requête qui cherche la relation associatedStreet contenant ce node. Cette requête prend environ 1000 ms. On augmente l'élément avec le nom de la rueaddr:street, et aussi unnameen combinanthousenumber street. - si c'est un
wayavec le taghighway, on utilisefetchStreet(element)pour lancer une 2e requête qui cherche soit la relation associatedStreet, soit par proximité (requête overpass avecaround) tous les morceaux de la rue qui portent le même nom. Cette requête prend 1 à 2 secondes (?). On augmente ainsi la géométrie de la rue.- 🐛bug : cette requête est lancée 2 fois : à investiguer.
Une fois l'élément obtenu, on l'augmente avec la fonction extendOverpassElement(element) qui :
- construit un GeoJSON grâce à la fonction
buildGeojsonFromOverpassElement- 📝 todo : handle multipolygon relations #1298
- ajoute l'osmCode
- ajoute un centre
- après avoir récupéré le
admin_centresi c'est une relationboundary
- après avoir récupéré le
etienneJr
Je note ici en vrac des discussion qui ont eu lieu sur le canal matrix dédié il y a quelques jours
- D'un côté Christian a augmenté le nb de coeurs à 24, et a restreint l'accès aux seuls gens autorisés.
- D'une autre côté Maël a monté une instance overpass interne pour soulager l'instance osm-fr
1er problème : la requête des meta pose problème car est très lente, voir discussion ici sur repo github.
2e pb, identifié par Christian :
C'est quand même pas pensé trop optimisé tout ça... fcgiwrap qui lance sans arrêt des interpreter à chaque requête, donc besoin de sans arrêt recréer des contextes, de rouvrir des fichiers ...
J'ai l'impression qu'on a un bon gros
main, qui prend la requête en stdin et crache la réponse en stdout... donc faudrait encapsuler ça dans une boucle qui prendrait les requêtes qui arrivnet une à une pour les executer mais sans reportir de zéro à chaque fois.le repo original est https://github.com/drolbr/Overpass-API avec la version docker https://github.com/wiktorn/Overpass-API
mais il y a 2 forks avec des optimisations très intéressantes, dont qui résolvent ces 2 problèmes
voir aussi discussion ici sur le forum community